擴充 Kubernetes
Kubernetes 具有高度的可配置性和可擴展性。因此,幾乎不需要 Fork 或向 Kubernetes 專案程式碼提交修補程式。
本指南說明自訂 Kubernetes 叢集的選項。其目標受眾為叢集管理員,他們想要瞭解如何調整其 Kubernetes 叢集以符合其工作環境的需求。對於有潛力的 平台開發人員或 Kubernetes 專案 貢獻者而言,這份指南也將會很有用,因為它簡介了現有的擴充點和模式,以及它們的權衡和限制。
自訂方法可以大致分為組態(僅涉及變更命令列引數、本機組態檔案或 API 資源)和擴充功能(涉及執行額外的程式、額外的網路服務或兩者)。本文件主要關於擴充功能。
組態
組態檔案和命令引數記錄在線上文件的參考章節中,每個二進位檔案都有一頁說明文件。
命令引數和組態檔案在託管的 Kubernetes 服務或具有受管理安裝的發行版中可能並不總是可變更的。當它們可變更時,通常也只能由叢集管理員變更。此外,它們可能會在未來的 Kubernetes 版本中發生變更,並且設定它們可能需要重新啟動程序。由於這些原因,只有在沒有其他選項時才應使用它們。
內建策略 API,例如 ResourceQuota、NetworkPolicy 和基於角色的存取控制 (Role-based Access Control, RBAC),是內建的 Kubernetes API,提供宣告式設定的策略設定。即使使用託管的 Kubernetes 服務和受管理的 Kubernetes 安裝,API 通常也是可用的。內建策略 API 遵循與其他 Kubernetes 資源(例如 Pod)相同的慣例。當您使用穩定的策略 API 時,您可以像其他 Kubernetes API 一樣受益於已定義的支援策略。由於這些原因,在適用的情況下,建議使用策略 API 而不是組態檔案和命令引數。
擴充功能
擴充功能是擴充 Kubernetes 並與之深度整合的軟體元件。它們調整 Kubernetes 以支援新的類型和新型硬體。
許多叢集管理員使用 Kubernetes 的託管或發行版執行個體。這些叢集預先安裝了擴充功能。因此,大多數 Kubernetes 使用者不需要安裝擴充功能,而更少的使用者需要撰寫新的擴充功能。
擴充功能模式
Kubernetes 的設計宗旨是透過編寫用戶端程式來實現自動化。任何讀取和/或寫入 Kubernetes API 的程式都可以提供有用的自動化。自動化可以在叢集上或叢集外執行。透過遵循本文件中的指南,您可以編寫高可用性和穩健的自動化。自動化通常適用於任何 Kubernetes 叢集,包括託管叢集和受管理安裝。
有一種特定的模式用於編寫與 Kubernetes 良好協作用戶端程式,稱為 控制器 模式。控制器通常讀取物件的 .spec
,可能會執行某些操作,然後更新物件的 .status
。
控制器是 Kubernetes API 的用戶端。當 Kubernetes 是用戶端並呼叫遠端服務時,Kubernetes 將其稱為 Webhook。遠端服務稱為 Webhook 後端。與自訂控制器一樣,Webhook 也會增加故障點。
注意
在 Kubernetes 之外,「Webhook」一詞通常指的是非同步通知的機制,其中 Webhook 呼叫充當另一個系統或元件的單向通知。在 Kubernetes 生態系統中,即使是同步 HTTP 呼叫也經常被描述為「Webhook」。在 Webhook 模型中,Kubernetes 向遠端服務發出網路請求。使用替代的二進位外掛程式模型,Kubernetes 執行二進位(程式)。kubelet 使用二進位外掛程式(例如,CSI 儲存外掛程式 和 CNI 網路外掛程式),以及 kubectl(請參閱 使用外掛程式擴充 kubectl)。
擴充點
此圖顯示 Kubernetes 叢集中的擴充點以及存取它的用戶端。

Kubernetes 擴充點
圖例
使用者通常使用
kubectl
與 Kubernetes API 互動。外掛程式自訂用戶端的行為。有些通用擴充功能可以應用於不同的用戶端,也有一些特定的方法可以擴充kubectl
。API 伺服器處理所有請求。API 伺服器中的幾種類型擴充點允許驗證請求,或根據其內容封鎖請求、編輯內容以及處理刪除。這些在API 存取擴充功能章節中描述。
API 伺服器提供各種資源。內建資源類型,例如
pods
,由 Kubernetes 專案定義,且無法變更。請閱讀 API 擴充功能以瞭解有關擴充 Kubernetes API 的資訊。Kubernetes 排程器 決定將 Pod 放置在哪些節點上。有幾種擴充排程的方法,這些方法在排程擴充功能章節中描述。
Kubernetes 的許多行為是由稱為控制器的程式實作的,這些程式是 API 伺服器的用戶端。控制器通常與自訂資源結合使用。請閱讀 將新 API 與自動化結合和 變更內建資源以瞭解更多資訊。
kubelet 在伺服器(節點)上執行,並協助 Pod 看起來像虛擬伺服器,在叢集網路上擁有自己的 IP。網路外掛程式允許 Pod 網路的不同實作方式。
您可以使用 裝置外掛程式 來整合自訂硬體或其他特殊的節點本機設施,並使這些設施可供叢集中執行的 Pod 使用。kubelet 包含對裝置外掛程式的支援。
kubelet 也為 Pod 及其容器掛載和解除掛載 磁碟區。您可以使用 儲存外掛程式 來新增對新型儲存和其他磁碟區類型的支援。
擴充點選擇流程圖
如果您不確定從哪裡開始,此流程圖可以提供協助。請注意,某些解決方案可能涉及多種類型的擴充功能。
選擇擴充方法流程圖指南
用戶端擴充功能
kubectl 的外掛程式是獨立的二進位檔案,可新增或取代特定子命令的行為。kubectl
工具也可以與 憑證外掛程式 整合。這些擴充功能僅影響個別使用者的本機環境,因此無法強制執行網站範圍的策略。
如果您想要擴充 kubectl
工具,請閱讀 使用外掛程式擴充 kubectl。
API 擴充功能
自訂資源定義
如果您想要定義新的控制器、應用程式組態物件或其他宣告式 API,並使用 Kubernetes 工具(例如 kubectl
)來管理它們,請考慮將自訂資源新增至 Kubernetes。
有關自訂資源的更多資訊,請參閱自訂資源概念指南。
API 彙總層
您可以使用 Kubernetes 的 API 彙總層 將 Kubernetes API 與其他服務整合,例如用於 指標。
將新 API 與自動化結合
自訂資源 API 和控制迴路的組合稱為控制器模式。如果您的控制器取代了人類操作員根據所需狀態部署基礎架構,則控制器也可能遵循Operator 模式。Operator 模式用於管理特定的應用程式;通常,這些應用程式是維護狀態且需要謹慎管理的應用程式。
您也可以建立自己的自訂 API 和控制迴路,以管理其他資源(例如儲存)或定義策略(例如存取控制限制)。
變更內建資源
當您透過新增自訂資源來擴充 Kubernetes API 時,新增的資源始終屬於新的 API 群組。您無法取代或變更現有的 API 群組。新增 API 不會直接讓您影響現有 API(例如 Pod)的行為,而API 存取擴充功能則可以。
API 存取擴充功能
當請求到達 Kubernetes API 伺服器時,它首先會被驗證身分,然後授權,然後受到各種許可控制(實際上,某些請求未經驗證身分,並獲得特殊處理)。有關此流程的更多資訊,請參閱 控制對 Kubernetes API 的存取。
Kubernetes 驗證身分/授權流程中的每個步驟都提供擴充點。
驗證身分
驗證身分將所有請求中的標頭或憑證對應到發出請求的用戶名稱。
Kubernetes 具有其支援的幾種內建驗證身分方法。它也可以位於驗證身分 Proxy 後面,並且如果這些方法無法滿足您的需求,它可以從 Authorization:
標頭將權杖傳送到遠端服務進行驗證(驗證身分 Webhook)。
授權
授權決定特定使用者是否可以讀取、寫入和對 API 資源執行其他操作。它在整個資源層級運作 - 它不會根據任意物件欄位進行區分。
如果內建授權選項無法滿足您的需求,則授權 Webhook允許呼叫自訂程式碼來做出授權決策。
動態許可控制
在請求獲得授權後,如果是寫入操作,它也會經過許可控制步驟。除了內建步驟外,還有幾個擴充功能。
- 映像檔策略 Webhook 限制了可以在容器中執行的映像檔。
- 為了做出任意許可控制決策,可以使用通用的許可 Webhook。許可 Webhook 可以拒絕建立或更新。某些許可 Webhook 在 Kubernetes 進一步處理傳入的請求資料之前修改它。
基礎架構擴充功能
裝置外掛程式
裝置外掛程式允許節點透過 裝置外掛程式 探索新的節點資源(除了 cpu 和記憶體等內建資源之外)。
儲存外掛程式
容器儲存介面 (Container Storage Interface, CSI) 外掛程式提供了一種使用新的磁碟區種類擴充 Kubernetes 支援的方法。磁碟區可以由持久的外部儲存支援,或提供臨時儲存,或者它們可以使用檔案系統範例提供資訊的唯讀介面。
Kubernetes 也包含對 FlexVolume 外掛程式的支援,這些外掛程式自 Kubernetes v1.23 起已棄用(建議使用 CSI)。
FlexVolume 外掛程式允許使用者掛載 Kubernetes 原生不支援的磁碟區類型。當您執行依賴 FlexVolume 儲存的 Pod 時,kubelet 會呼叫二進位外掛程式來掛載磁碟區。已封存的 FlexVolume 設計提案包含有關此方法的更多詳細資訊。
適用於儲存廠商的 Kubernetes 磁碟區外掛程式常見問題 包含有關儲存外掛程式的一般資訊。
網路外掛程式
您的 Kubernetes 叢集需要網路外掛程式,以便擁有可運作的 Pod 網路並支援 Kubernetes 網路模型的其他方面。
網路外掛程式允許 Kubernetes 與不同的網路拓撲和技術協同運作。
Kubelet 映像檔憑證提供者外掛程式
Kubernetes v1.26 [穩定]
外掛程式可以與外部服務通訊或使用本機檔案來取得憑證。這樣,kubelet 不需要為每個登錄檔都擁有靜態憑證,並且可以支援各種驗證身分方法和協定。
有關外掛程式組態詳細資訊,請參閱 組態 kubelet 映像檔憑證提供者。
排程擴充功能
排程器是一種特殊類型的控制器,它監看 Pod,並將 Pod 指派給節點。預設排程器可以完全替換,同時繼續使用其他 Kubernetes 元件,或者可以同時執行多個排程器。
這是一項重大的任務,幾乎所有 Kubernetes 使用者都發現他們不需要修改排程器。
您可以控制哪些排程外掛程式處於作用中狀態,或將外掛程式集與不同的具名排程器設定檔關聯。您也可以編寫自己的外掛程式,該外掛程式與 kube-scheduler 的一個或多個擴充點整合。
最後,內建的 kube-scheduler
元件支援 Webhook,它允許遠端 HTTP 後端(排程器擴充功能)篩選和/或優先排序 kube-scheduler 為 Pod 選擇的節點。
注意
您只能使用排程器擴充功能 Webhook 影響節點篩選和節點優先排序;其他擴充點無法透過 Webhook 整合使用。下一步
- 瞭解有關基礎架構擴充功能的更多資訊
- 瞭解有關 kubectl 外掛程式的資訊
- 瞭解有關 自訂資源的更多資訊
- 瞭解有關 擴充 API 伺服器的更多資訊
- 瞭解有關 動態許可控制的資訊
- 瞭解 Operator 模式