控制器

在機器人學和自動化領域, 控制迴路 是一個持續執行的迴圈,用於調節系統的狀態。

下面是一個控制迴路的例子:房間裡的恆溫器。

當你設定溫度時,你就是在告訴恆溫器你的 期望狀態。實際的室溫是 當前狀態。恆溫器透過開啟或關閉裝置,使當前狀態更接近期望狀態。

在 Kubernetes 中,控制器是控制迴路,它們監視 叢集的狀態,然後在需要時進行或請求更改。每個控制器都試圖使當前叢集狀態更接近期望狀態。

控制器模式

控制器至少跟蹤一種 Kubernetes 資源型別。這些 物件 有一個 spec 欄位,表示期望狀態。該資源的控制器負責使當前狀態接近期望狀態。

控制器可能自行執行操作;更常見的是,在 Kubernetes 中,控制器會向 API 伺服器 傳送具有有用副作用的訊息。您將在下面看到這方面的例子。

透過 API 伺服器進行控制

Job 控制器是 Kubernetes 內建控制器的一個例子。內建控制器透過與叢集 API 伺服器互動來管理狀態。

Job 是一個 Kubernetes 資源,它執行一個或多個 Pod 來執行任務,然後停止。

(一旦排程,Pod 物件就成為 kubelet 的期望狀態的一部分)。

當 Job 控制器看到一個新任務時,它會確保叢集中的一組節點上的 kubelet 正在執行正確數量的 Pod 以完成工作。Job 控制器本身不執行任何 Pod 或容器。相反,Job 控制器告訴 API 伺服器建立或刪除 Pod。控制平面中的其他元件會根據新資訊(有新的 Pod 需要排程和執行)採取行動,最終完成工作。

建立新 Job 後,期望狀態是該 Job 完成。Job 控制器使該 Job 的當前狀態更接近您的期望狀態:建立執行該 Job 所需工作的 Pod,從而使該 Job 更接近完成。

控制器還會更新配置它們的 Job。例如:一旦 Job 的工作完成,Job 控制器會更新該 Job 物件以將其標記為 Finished

(這有點像有些恆溫器透過關閉指示燈來表明您的房間已達到設定的溫度)。

直接控制

與 Job 不同,一些控制器需要對叢集外部的事物進行更改。

例如,如果你使用一個控制迴路來確保叢集中有足夠的節點,那麼該控制器需要叢集外部的東西在需要時設定新的節點。

與外部狀態互動的控制器從 API 伺服器獲取它們的期望狀態,然後直接與外部系統通訊,使當前狀態更接近。

(實際上有一個控制器可以水平擴充套件叢集中的節點。)

這裡的重點是控制器進行一些更改以實現您的期望狀態,然後將當前狀態報告回叢集的 API 伺服器。其他控制迴路可以觀察到該報告資料並採取自己的行動。

在恆溫器示例中,如果房間非常冷,則另一個控制器也可能會開啟防霜加熱器。對於 Kubernetes 叢集,控制平面透過擴充套件 Kubernetes 來實現這一點,間接與 IP 地址管理工具、儲存服務、雲提供商 API 和其他服務協同工作。

期望狀態與當前狀態

Kubernetes 採用雲原生的系統檢視,能夠處理持續變化。

在工作進行和控制迴路自動修復故障時,您的叢集可能隨時都在變化。這意味著您的叢集可能永遠無法達到穩定狀態。

只要叢集的控制器正在執行並能夠進行有用的更改,那麼整體狀態是否穩定並不重要。

設計

作為其設計原則之一,Kubernetes 使用了許多控制器,每個控制器管理叢集狀態的特定方面。最常見的是,一個特定的控制迴路(控制器)使用一種資源作為其期望狀態,並管理另一種資源以實現該期望狀態。例如,Job 的控制器跟蹤 Job 物件(以發現新工作)和 Pod 物件(以執行 Job,然後檢視工作何時完成)。在這種情況下,其他元件建立 Job,而 Job 控制器建立 Pod。

擁有簡單的控制器而不是一個相互關聯的單一、龐大的控制迴路集合是很有用的。控制器可能會失敗,因此 Kubernetes 的設計允許這種情況發生。

執行控制器的方式

Kubernetes 帶有一組內建控制器,它們在 kube-controller-manager 中執行。這些內建控制器提供了重要的核心行為。

Deployment 控制器和 Job 控制器是 Kubernetes 自身(“內建”控制器)的一部分的控制器示例。Kubernetes 允許您執行一個具有彈性的控制平面,這樣即使任何內建控制器失敗,控制平面的其他部分也會接管工作。

您可以找到在控制平面之外執行的控制器,以擴充套件 Kubernetes。或者,如果您願意,可以自己編寫一個新的控制器。您可以將自己的控制器作為一組 Pod 執行,或者在 Kubernetes 之外執行。最適合的方式將取決於該特定控制器所做的工作。

下一步

上次修改於太平洋標準時間 2024 年 9 月 1 日凌晨 1:54:修復“overview/components/#...”到“architecture/#...”的斷開連結 (#47724) (7e64c2db82)