Kubernetes 的運作方式——由目標狀態到執行中的工作負載

Kubernetes 的運作方式,畫在一張互動畫布上:宣告檔、控制平面、排程,以及令工作負載一直執行下去的那個調和迴圈。

Kubernetes 靠不斷調和來執行容器化的應用程式:你宣告目標狀態,然後由控制平面與工作節點合力令整個叢集與它相符。

Kubernetes 的運作方式——由目標狀態到執行中的工作負載

The interactive FlowJam canvas for this explanation — every lane, row and arrow above is a real QueryChart diagram you can open and edit.

How to read this visual

  • 由左至右讀這四個直欄:宣告、排程、執行、維持。
  • 上方控制平面那些列負責決定;下方工作節點那些列負責做。由上而下的箭頭是指令;由「Pod 是否健康?」繞回上方的那條線,就是調和的循環。
  • 宣告檔裡的目標狀態是真實來源——其餘每一個方框存在的意義,都是把現實推向它。

宣告目標狀態

「以 kubectl apply 送出一份目標狀態宣告檔」是一切的起點:開發者描述那個目標——「API 三個副本、映像檔 v2.1、連接埠 8080」——然後送出。「API 伺服器把目標狀態存入 etcd」是落實的一刻:控制平面的 API 伺服器是整套系統的大門,而 etcd 是叢集的真實來源。之後發生的一切,都是這一次寫入的後果。

排程

「排程器監看狀態,為這些 Pod 挑選節點」與「排程器把每一個 Pod 指派到一個健康的節點」,是控制平面在決定工作在哪裡執行。排程器會考慮每個節點的資源與限制條件,把 Pod 放到最合適的候選節點上——開發者選的不是機器,只是目標狀態。

在工作節點上執行

「節點上的 kubelet 拉取映像檔並啟動容器」是這個安排裡屬於工作節點的一半:kubelet 是控制平面派駐在每個節點上的代理,它與容器執行環境溝通,啟動指派過來的 Pod,並把健康狀況回報上去。「一個 Service 把流量導向執行中的 Pod」補上了穩定的網絡入口——Pod 來來去去,但 Service 的名稱不會變。

維持這個狀態

「控制器進行調和——重啟失敗的部分、增減副本」就是那個回饋迴圈,而「Pod 是否健康?」就是它的探測——存活與就緒檢查決定一個 Pod 是被替換(「否」這條分支繞回調和),還是被保留。「Deployment(部署物件)維持在目標狀態」是終點狀態:那不是一件做完了的工作,而是一個與自己的宣告檔相符、正在執行的系統。

Key relationships and takeaways

  • Kubernetes 是宣告式的:你說出目標,而不是步驟,其餘由系統負責。
  • 控制平面負責決定,kubelet 負責執行——沒有 etcd 裡那份目標狀態,甚麼都不會執行。
  • 調和就是那個迴圈:比較、把差異套用上去、重複,永遠如此。
  • 探測決定健康與否,而健康與否決定是否替換——一個失敗的 Pod 不需要人手介入就會被重啟。
  • Kubernetes 編排的正是 Docker 打包出來的容器,這也是兩張圖解互相連得上的原因。

When to use this visual

  • 向一支剛接觸 Kubernetes 的團隊,講解控制平面與工作節點的分別。
  • 在有人動手寫第一份 Deployment 與 Service 宣告檔之前,先教會他們宣告式這個模型。
  • 為一場關於自動修復的討論定下基礎——哪些問題 Kubernetes 會自動修好,哪些仍然要靠維運的人。

運作方式

  1. 標註你實際執行的宣告檔

    在 apply 那一步上加註你真實的 Deployment 與 Service——副本數量、映像檔、連接埠——讓這張圖反映的是你自己的叢集。

  2. 加上網絡那一層

    在 Service 與用戶之間插入一個 Ingress 方框,並註明你的叢集怎樣把流量對外開放,因為這正是大部分團隊最先動手改的部分。

  3. 畫出你的擴展規則

    把調和那一步延伸出一條 Horizontal Pod Autoscaler 的分支,按 CPU 或自訂指標增減副本,並以它自己的狀態作結。

  4. 補上失敗與儲存的路徑

    把有狀態工作負載用到的持久卷,以及你採用的 anti-affinity 規則都畫進去,每一項都配一則說明原因的備註。

常見問題

簡單來說,Kubernetes 是甚麼?

Kubernetes 是一套系統,它在一個由多部機器組成的叢集上執行容器化的應用程式,並令它們一直執行下去。你告訴它你想要甚麼——每個應用程式要幾多份、用哪個映像檔、開哪些連接埠——然後它把工作排程到機器上、重啟失敗的部分、按需要增減規模,並把流量導向正確的地方。這張圖解把這件事拆成宣告、排程、執行與維持。

Kubernetes 裡的控制平面是甚麼?

控制平面是一組為叢集作決定的組件:接收你的宣告檔的 API 伺服器、儲存目標狀態的 etcd、負責安放 Pod 的排程器,以及把現實調和向目標狀態的各個控制器。它是腦。工作節點則是肌肉——每一個節點都執行一個 kubelet,負責啟動並監察指派給它的 Pod。

在 Kubernetes 裡,「宣告式」是甚麼意思?

意思是你描述目標狀態,而不是發出一連串指令去達成它。你套用一份寫著「執行三個副本」的宣告檔;至於步驟,由 Kubernetes 自己想出來,而且只要現實一有偏移,它就會再做一次。如果一個 Pod 死掉,控制器會建立一個替代品,回到三個——不需要任何人重跑一次指令。宣告檔是真實來源,而調和就是那個機制。

Kubernetes 怎樣令應用程式保持健康?

靠探測與調和迴圈。存活探測告訴 Kubernetes 一個容器是否還活著——存活探測失敗就會重啟它。就緒探測告訴它一個 Pod 是否可以服務流量——就緒探測失敗就會把它由 Service 移走。控制器持續把執行中的狀態與目標狀態比較,並把差異套用上去,而這正是圖解裡「Pod 是否健康?」這個決策所代表的迴圈。

用 QueryChart(FlowJam)編輯這張圖解

把上面這張 Kubernetes 畫布開啟為你自己的圖表——把各個組件改名為你自己的叢集,並標註你的工作負載。

用 QueryChart(FlowJam)編輯這張圖解

互動圖解的更多內容