Kubernetes 架構與核心概念
而在開始學習指令與操作之前,理解 Kubernetes (K8s) 的設計哲學與架構是非常重要的。這篇文章將帶你認識 K8s 究竟解決了什麼問題,以及它的核心運作原理。
為什麼需要 Kubernetes?
在 虛擬機 (Virtual Machine, VM) 時代,我們在每台實體伺服器上執行多個 VM,每個 VM 都有完整的作業系統。雖然隔離性好,但資源利用率低且啟動慢。
進入 容器 (Container) 時代(如 Docker),我們共享從作業系統核心 (OS Kernel),容器更加輕量、啟動快。但當你的應用程式擴展到成百上千個容器,分佈在多台伺服器時,問題就來了:
- 容器掛了怎麼辦? 需要有人監控並自動重啟。
- 伺服器掛了怎麼辦? 需要將該機器上的容器遷移到其他健康機器。
- 如何讓外界存取? 需要負載平衡 (Load Balancing) 與服務發現 (Service Discovery)。
- 如何更新版本? 需要不中斷服務的滾動更新 (Rolling Update)。
這這正是 Kubernetes (容器調度工具) 要解決的問題。它像是一個指揮家,指揮整個基礎設施樂團協同運作。
Kubernetes 架構概觀
Kubernetes 叢集 (Cluster) 主要由兩大類型的節點組成:Control Plane (控制平面) 與 Node (工作節點)。
(圖片來源: Kubernetes.io)
Control Plane (控制平面 / Master Node)
Control Plane 是叢集的大腦,負責決策(例如調度 Pod)、偵測與回應叢集事件。
- kube-apiserver: 這是 K8s 的大門。所有的操作指令(如 kubectl)或內部組件通訊,都必須經過 API Server。它是唯一直接與 etcd 溝通的元件。
- etcd: 一個高可用的 Key-Value 資料庫,用來儲存整個叢集的狀態資料(Configuration data)。這是 K8s 的「記憶」。
- kube-scheduler: 負責「排程」。當你建立一個新的 Pod,Scheduler 會根據資源需求(CPU/RAM)與限制,決定要將這個 Pod 放到哪個 Node 上執行。
- kube-controller-manager: 負責執行各種控制器 (Controller)。例如,當 Node 掛掉時,Node Controller 會負責通知;當 Deployment 設定要有 3 個副本時,Replication Controller 會確保隨時都有 3 個副本在跑。
Node (工作節點 / Worker Node)
Node 是實際運行應用程式容器的地方。
- kubelet: 每個 Node 上都會跑的 Agent。它會接收 Control Plane 的指令,確保容器在 Pod 中正常運行,並回報 Node 的狀態給 Master。
- kube-proxy: 負責維護 Node 上的網路規則,實現 Service 的概念,讓流量能正確導發到後端的 Pod。
- Container Runtime: 負責執行容器的軟體,最常見的是 containerd 或 CRI-O (早期是 Docker Shim)。
核心概念:宣告式 API (Declarative API)
Kubernetes 最重要的設計哲學之一是 宣告式配置 (Declarative Configuration)。
- 指令式 (Imperative): 告訴電腦「做什麼動作」。例如:「啟動 3 個伺服器」、「安裝 Nginx」。
- 宣告式 (Declarative): 告訴電腦「我想要什麼結果 (Desired State)」。例如:「我想要隨時都有 3 個 Nginx 伺服器在執行」。
在 K8s 中,我們通常透過 YAML 檔案定義 Desired State,提交給 API Server。K8s 的 Controller 會不斷地監控 Current State (目前狀態),並嘗試將其調整為 Desired State。
例如,如果你宣告要有 3 個 Pod,如果不小心刪掉了一個,K8s 會發現 Current State (2個) 與 Desired State (3個) 不符,於是自動再建立一個新的,這就是 自我修復 (Self-healing) 能力。
小結
Kubernetes 是一個龐大且功能強大的系統。
- Control Plane 負責管理與決策。
- Node 負責實際執行工作負載。
- 我們透過 YAML 宣告我們期望的狀態,K8s 負責幫我們達成並維持這個狀態。