概述#

Kubernetes(K8s)是用來大規模執行分散式應用的容器編排平台。要支撐這樣的能力,背後必然有一套穩固的架構。本章拆解 Kubernetes 叢集中的關鍵組件,並說明它們各自扮演的角色。

設計原則#

依官方文件,Kubernetes 叢集的設計遵循三項原則:

  • 安全:採用最新的安全最佳實踐。
  • 易用:可以透過幾個簡單的指令操作叢集。
  • 可擴展:不偏向任何特定供應商,可透過設定檔自訂。

叢集的整體結構#

部署完成後,至少會擁有一個完整的 Kubernetes 叢集,並可依需求擴充。每個叢集包含兩種角色:

  • 控制平面(Control Plane):負責管理整個叢集、調度容器、保存狀態。過去也常被稱為 Master Node。
  • 工作節點(Worker Node):實際執行使用者應用負載的機器,承載一個或多個 Pod。

下方分別說明這兩種節點上會執行哪些組件。

工作節點上的組件#

節點(Node)#

節點(Node)是 Pod 真正執行的主機,可能是實體機,也可能是虛擬機,是 Kubernetes 中能夠承載工作負載的最小主機單位。每個節點上至少需要執行:

  • 容器執行環境(Container Runtime)
  • kubelet
  • kube-proxy

Pod#

Pod 是 Kubernetes 物件模型中最小、最基礎的單元,代表一個應用實例。Pod 由一個或多個容器組成(多數情況只有一個),同時支援掛載永久儲存(Volume),可執行有狀態的應用。

容器執行環境(Container Runtime)#

每個節點都需要一個容器執行環境來實際啟動容器。除了大家熟悉的 Docker 之外,Kubernetes 也支援其他符合 Open Container Initiative(OCI)規範的執行環境,例如 containerd、CRI-O、rkt 等。

kubelet#

每個節點上都會有一個 kubelet 行程,負責與控制平面通訊。當控制平面需要在節點上完成某個動作(例如啟動 Pod、執行健康檢查)時,實際執行者就是 kubelet。它會確保 Pod 內的容器處於應有的執行狀態。

kube-proxy#

kube-proxy 是節點上的網路代理,負責處理叢集內外的網路流量。它會操作作業系統的封包過濾層或自行轉發流量,為 Service 提供叢集內部的服務探索與負載均衡能力。

控制平面的組件#

控制平面是叢集的中樞神經,負責保存叢集狀態、調度資源、處理請求,確保容器以期望的數量與資源持續執行。一般情況下不需要使用者額外設定。

kube-apiserver#

API Server 是整個控制平面的前端,所有對叢集的操作(包含 kubectl、UI 工具、其他元件)最終都會透過 REST 呼叫送到 API Server。它負責公開 Kubernetes API,並驗證、處理進來的請求。

kube-scheduler#

Scheduler 是容器調度器,負責把新建立、尚未綁定節點的 Pod 分派到最適合的工作節點。調度過程會考量使用者定義的篩選(Filtering)與評分(Scoring)策略,從候選節點中挑選最理想的目標。

kube-controller-manager#

Controller Manager 把多個控制器(Controller)組合在同一個行程中執行。控制器負責持續比對「期望狀態」與「實際狀態」,例如:

  • 確認指定數量的 Pod 是否在執行;若不足會啟動新的 Pod。
  • 將 Service 與對應的 Pod 連接,使流量能正確抵達。
  • 監控節點是否仍可用,必要時搬遷其上的工作負載。

etcd#

etcd 是一個分散式的 Key-Value 資料庫,用來儲存叢集的所有狀態與設定。當叢集發生故障時,可以依靠 etcd 中的資料快速還原當下的狀態。

組件之間的協作#

把各個組件拼起來,一個典型的 Pod 建立流程大致是:

  1. 使用者透過 kubectl 把設定送到 API Server。
  2. API Server 驗證請求後,把期望狀態寫入 etcd。
  3. Scheduler 監看到一個尚未綁定節點的 Pod,依策略為它選擇最適合的節點。
  4. 對應節點上的 kubelet 收到指令,呼叫容器執行環境啟動容器。
  5. Controller Manager 持續監控狀態,必要時介入修正(例如重新建立失敗的 Pod)。
  6. kube-proxy 維護網路規則,確保流量能正確抵達 Pod。

小結#

理解組件的職責對日後的實作非常關鍵:當叢集出現問題時,可以快速判斷該檢查哪一個組件的紀錄。後續章節會開始實際操作 Kubernetes,並在過程中反覆驗證這個結構。

原文出處#

  • GitHub:https://github.com/MikeHsu0618/2022-ithelp/tree/main/Day3
  • iThome:https://ithelp.ithome.com.tw/articles/10287576