擴充套件 Kubernetes

改變 Kubernetes 叢集行為的不同方式。

Kubernetes 具有高度可配置性和可擴充套件性。因此,很少需要派生或向 Kubernetes 專案程式碼提交補丁。

本指南描述了自定義 Kubernetes 叢集的選項。它面向希望瞭解如何使 Kubernetes 叢集適應其工作環境需求的叢集操作員。對於未來成為平臺開發者或 Kubernetes 專案貢獻者的開發者來說,它也很有用,可作為對現有擴充套件點、模式及其權衡和限制的介紹。

定製方法大致可分為僅涉及更改命令列引數、本地配置檔案或 API 資源的配置;以及涉及執行額外程式、額外網路服務或兩者兼有的擴充套件。本文件主要關注**擴充套件**。

配置

**配置檔案**和**命令引數**在線上文件的參考部分中進行了文件說明,每個二進位制檔案都有一個頁面。

在託管的 Kubernetes 服務或具有託管安裝的發行版中,命令引數和配置檔案可能並非總是可更改的。當它們可更改時,通常只有叢集操作員才能更改。此外,它們在未來的 Kubernetes 版本中可能會發生變化,並且設定它們可能需要重新啟動程序。由於這些原因,它們應僅在沒有其他選擇時使用。

內建的**策略 API**,例如ResourceQuotaNetworkPolicy 和基於角色的訪問控制(RBAC),是內建的 Kubernetes API,提供宣告式配置的策略設定。API 通常即使在託管的 Kubernetes 服務和託管的 Kubernetes 安裝中也可用。內建策略 API 遵循與其他 Kubernetes 資源(如 Pods)相同的約定。當您使用穩定的策略 API 時,您將受益於與其他 Kubernetes API 相同的定義的_支援策略_。由於這些原因,在適當的情況下,建議使用策略 API 而不是**配置檔案**和**命令引數**。

擴充套件

擴充套件是軟體元件,它們擴充套件並深度整合到 Kubernetes 中。它們透過適應來支援新型別和新硬體型別。

許多叢集管理員使用託管或發行版 Kubernetes 例項。這些叢集預裝了擴充套件。因此,大多數 Kubernetes 使用者不需要安裝擴充套件,甚至更少的使用者需要編寫新的擴充套件。

擴充套件模式

Kubernetes 旨在透過編寫客戶端程式來實現自動化。任何讀取和/或寫入 Kubernetes API 的程式都可以提供有用的自動化。**自動化**可以在叢集上執行,也可以在叢集外執行。透過遵循本文件中的指導,您可以編寫高可用和健壯的自動化。自動化通常適用於任何 Kubernetes 叢集,包括託管叢集和託管安裝。

有一種特定的模式用於編寫與 Kubernetes 良好協作的客戶端程式,稱為控制器模式。控制器通常讀取物件的` .spec`,可能會做一些事情,然後更新物件的` .status`。

控制器是 Kubernetes API 的客戶端。當 Kubernetes 是客戶端並呼叫遠端服務時,Kubernetes 將其稱為**Webhook**。遠端服務稱為**Webhook 後端**。與自定義控制器一樣,Webhooks 確實增加了故障點。

在 Webhook 模型中,Kubernetes 向遠端服務發出網路請求。而在另一種**二進位制外掛**模型中,Kubernetes 執行一個二進位制檔案(程式)。二進位制外掛由 kubelet(例如,CSI 儲存外掛CNI 網路外掛)和 kubectl(參閱使用外掛擴充套件 kubectl)使用。

擴充套件點

此圖顯示了 Kubernetes 叢集中的擴充套件點以及訪問它的客戶端。

Symbolic representation of seven numbered extension points for Kubernetes

Kubernetes 擴充套件點

圖例

  1. 使用者通常使用`kubectl`與 Kubernetes API 進行互動。外掛自定義客戶端的行為。有適用於不同客戶端的通用擴充套件,以及擴充套件`kubectl`的特定方式。

  2. API 伺服器處理所有請求。API 伺服器中的幾種型別的擴充套件點允許認證請求,或根據其內容阻止請求,編輯內容和處理刪除。這些在API 訪問擴充套件部分中描述。

  3. API 伺服器提供各種**資源**。**內建資源型別**,如`pods`,由 Kubernetes 專案定義,不可更改。閱讀API 擴充套件以瞭解如何擴充套件 Kubernetes API。

  4. Kubernetes 排程器決定將 Pod 放置在哪些節點上。有幾種方法可以擴充套件排程,這些方法在排程擴充套件部分中描述。

  5. Kubernetes 的大部分行為都是由被稱為控制器的程式實現的,這些程式是 API 伺服器的客戶端。控制器通常與自定義資源結合使用。閱讀將新 API 與自動化結合更改內建資源以瞭解更多資訊。

  6. kubelet 執行在伺服器(節點)上,並幫助 Pod 像具有自己的 IP 的虛擬伺服器一樣出現在叢集網路上。網路外掛允許不同的 Pod 網路實現。

  7. 您可以使用裝置外掛來整合定製硬體或其他特殊的節點本地設施,並使這些設施可用於在叢集中執行的 Pod。

    kubelet 還會為 Pod 及其容器掛載和解除安裝。您可以使用儲存外掛來新增對新型儲存和其他卷型別的支援。

擴充套件點選擇流程圖

如果你不確定從哪裡開始,這個流程圖可以幫助你。請注意,有些解決方案可能涉及多種型別的擴充套件。

Flowchart with questions about use cases and guidance for implementers. Green circles indicate yes; red circles indicate no.

選擇擴充套件方法的流程圖指南


客戶端擴充套件

kubectl 外掛是獨立的二進位制檔案,用於新增或替換特定子命令的行為。`kubectl` 工具還可以與憑證外掛整合。這些擴充套件僅影響單個使用者的本地環境,因此無法強制執行全站策略。

如果您想擴充套件`kubectl`工具,請閱讀使用外掛擴充套件 kubectl

API 擴充套件

自定義資源定義

如果您想定義新的控制器、應用配置物件或其他宣告性 API,並使用 Kubernetes 工具(例如`kubectl`)來管理它們,請考慮向 Kubernetes 新增**自定義資源**。

有關自定義資源的更多資訊,請參閱自定義資源概念指南。

API 聚合層

您可以使用 Kubernetes 的API 聚合層將 Kubernetes API 與其他服務(例如指標)整合。

將新 API 與自動化結合

自定義資源 API 和控制迴圈的組合被稱為控制器模式。如果您的控制器替代了根據所需狀態部署基礎設施的人工操作員,那麼該控制器可能也遵循操作器模式。操作器模式用於管理特定的應用程式;通常,這些應用程式維護狀態並需要謹慎管理。

您還可以建立自己的自定義 API 和控制迴圈來管理其他資源,例如儲存,或者定義策略(例如訪問控制限制)。

更改內建資源

當您透過新增自定義資源來擴充套件 Kubernetes API 時,新增的資源始終屬於新的 API 組。您不能替換或更改現有 API 組。新增 API 不會直接讓您影響現有 API(例如 Pods)的行為,而**API 訪問擴充套件**會。

API 訪問擴充套件

當請求到達 Kubernetes API 伺服器時,它首先被**認證**,然後被**授權**,然後受到各種型別的**准入控制**(實際上有些請求未經認證,並受到特殊處理)。有關此流程的更多資訊,請參閱控制對 Kubernetes API 的訪問

Kubernetes 身份驗證/授權流程中的每個步驟都提供了擴充套件點。

認證

認證將所有請求中的頭部或證書對映到發出請求的客戶端的使用者名稱。

Kubernetes 支援多種內建認證方法。它也可以位於認證代理之後,如果這些方法不能滿足您的需求,它還可以將`Authorization:`頭部中的令牌傳送到遠端服務進行驗證(認證 webhook)。

授權

授權決定特定使用者是否可以對 API 資源進行讀取、寫入和其他操作。它在整個資源級別工作,不根據任意物件欄位進行區分。

如果內建授權選項不能滿足您的需求,則授權 Webhook 允許呼叫自定義程式碼來做出授權決定。

動態准入控制

請求經授權後,如果它是一個寫入操作,它還會經過准入控制步驟。除了內建步驟外,還有一些擴充套件。

  • 映象策略 Webhook 限制了容器中可以執行哪些映象。
  • 要做出任意的准入控制決策,可以使用通用的准入 Webhook。准入 Webhook 可以拒絕建立或更新。一些准入 Webhook 在 Kubernetes 進一步處理之前修改傳入的請求資料。

基礎設施擴充套件

裝置外掛

**裝置外掛**允許節點透過裝置外掛發現新的節點資源(除了內建的 CPU 和記憶體等)。

儲存外掛

容器儲存介面 (CSI) 外掛提供了一種透過支援新型捲來擴充套件 Kubernetes 的方法。這些卷可以由持久的外部儲存支援,提供臨時儲存,或者它們可以透過檔案系統範例提供資訊的只讀介面。

Kubernetes 還支援FlexVolume 外掛,該外掛自 Kubernetes v1.23 起已棄用(轉而支援 CSI)。

FlexVolume 外掛允許使用者掛載 Kubernetes 不原生支援的卷型別。當你執行依賴 FlexVolume 儲存的 Pod 時,kubelet 會呼叫一個二進位制外掛來掛載該卷。已存檔的FlexVolume設計提案對此方法有更詳細的描述。

Kubernetes 卷外掛常見問題解答(面向儲存供應商)包含有關儲存外掛的通用資訊。

網路外掛

您的 Kubernetes 叢集需要一個**網路外掛**才能擁有一個正常工作的 Pod 網路並支援 Kubernetes 網路模型的其他方面。

網路外掛允許 Kubernetes 與不同的網路拓撲和技術協同工作。

Kubelet 映象憑據提供商外掛

功能狀態: Kubernetes v1.26 [stable]
Kubelet 映象憑據提供商是 kubelet 的外掛,用於動態檢索映象登錄檔憑據。這些憑據隨後用於從符合配置的容器映象登錄檔拉取映象時。

外掛可以與外部服務通訊或使用本地檔案獲取憑據。這樣,kubelet 無需為每個登錄檔都擁有靜態憑據,並且可以支援各種認證方法和協議。

有關外掛配置的詳細資訊,請參閱配置 kubelet 映象憑據提供程式

排程擴充套件

排程器是一種特殊型別的控制器,它監視 Pod 並將 Pod 分配給節點。預設排程器可以完全替換,同時繼續使用其他 Kubernetes 元件,或者可以同時執行多個排程器

這是一個重大的工作,幾乎所有 Kubernetes 使用者都發現他們不需要修改排程器。

您可以控制哪些排程外掛處於活動狀態,或者將外掛集與不同的命名排程器配置檔案關聯起來。您還可以編寫自己的外掛,使其與 kube-scheduler 的一個或多個擴充套件點整合。

最後,內建的`kube-scheduler`元件支援一個webhook,它允許遠端 HTTP 後端(排程器擴充套件)過濾和/或優先排序 kube-scheduler 為 Pod 選擇的節點。

下一步

上次修改於 2023 年 12 月 29 日 太平洋標準時間晚上 9:47:修復過時連結/錨點 (bcc55ae7c9)