Controller Manager(簡(jiǎn)稱kube-controller-manager)是 Kubernetes 控制平面的核心組件之一,核心定位是集群狀態(tài)的“管家” —— 它運(yùn)行一系列控制器進(jìn)程,確保集群中各類資源的實(shí)際狀態(tài)始終匹配用戶定義的期望狀態(tài)。
對(duì)于入門者來說,理解 Controller Manager 的關(guān)鍵是抓住「狀態(tài)調(diào)和(Reconciliation)」這個(gè)核心思想:你告訴 K8s “想要什么樣”(期望狀態(tài)),Controller Manager 負(fù)責(zé)讓集群“變成什么樣”(實(shí)際狀態(tài))。
一、核心定位與作用
1. 控制平面的核心成員
K8s 控制平面(Master 節(jié)點(diǎn))的核心組件包括:APIServer、etcd、Scheduler、Controller Manager。其中:
- APIServer:所有操作的統(tǒng)一入口,是集群的“網(wǎng)關(guān)”;
- etcd:集群狀態(tài)的唯一數(shù)據(jù)源(存所有資源的期望/實(shí)際狀態(tài));
- Scheduler:負(fù)責(zé) Pod 調(diào)度(選節(jié)點(diǎn));
- Controller Manager:負(fù)責(zé)“糾偏”,確保資源狀態(tài)符合預(yù)期。
2. 核心作用
Controller Manager 本身不存儲(chǔ)任何狀態(tài)(狀態(tài)全在 etcd 里),也不直接操作容器/節(jié)點(diǎn),而是通過 APIServer 監(jiān)聽資源變化,對(duì)比「期望狀態(tài)」和「實(shí)際狀態(tài)」,若不一致則觸發(fā)調(diào)和動(dòng)作(比如創(chuàng)建/刪除 Pod、更新資源配置)。
舉個(gè)例子:
你創(chuàng)建了一個(gè) Deployment,指定 3 個(gè) Pod 副本(期望狀態(tài));若其中 1 個(gè) Pod 因節(jié)點(diǎn)故障消失(實(shí)際狀態(tài)變?yōu)?2 個(gè)),Deployment 控制器(屬于 Controller Manager)會(huì)立即通過 APIServer 新建 1 個(gè) Pod,讓副本數(shù)回到 3。
二、內(nèi)置核心控制器(入門必知)
Controller Manager 不是“一個(gè)控制器”,而是多個(gè)獨(dú)立控制器的集合(每個(gè)控制器管一類資源),入門階段重點(diǎn)掌握以下核心控制器:
| 控制器 | 核心功能 |
|---|---|
| Node Controller | 監(jiān)控節(jié)點(diǎn)狀態(tài),節(jié)點(diǎn)失聯(lián)時(shí)標(biāo)記為“NotReady”,并驅(qū)逐該節(jié)點(diǎn)上的 Pod |
| ReplicaSet Controller | 保證指定數(shù)量的 Pod 副本運(yùn)行(Deployment 底層依賴它) |
| Deployment Controller | 管理 Deployment,支持 Pod 滾動(dòng)更新、回滾,底層調(diào)用 ReplicaSet 控制器 |
| DaemonSet Controller | 保證每個(gè)節(jié)點(diǎn)(或指定節(jié)點(diǎn))運(yùn)行 1 個(gè) Pod(如日志收集、監(jiān)控 Agent) |
| StatefulSet Controller | 管理有狀態(tài)應(yīng)用(如數(shù)據(jù)庫),保證 Pod 有序部署、唯一網(wǎng)絡(luò)標(biāo)識(shí)、持久化存儲(chǔ) |
| Job/CronJob Controller | 管理一次性任務(wù)(Job)和定時(shí)任務(wù)(CronJob),任務(wù)完成后終止 Pod |
| Endpoints Controller | 維護(hù) Service 和 Pod 的映射關(guān)系(Endpoints 對(duì)象),讓 Service 能找到 Pod |
| ServiceAccount Controller | 為每個(gè)命名空間自動(dòng)創(chuàng)建默認(rèn) ServiceAccount,管理訪問令牌 |
入門小貼士:不用死記所有控制器,核心記住「每個(gè)控制器只負(fù)責(zé)一類資源的狀態(tài)調(diào)和」即可。
三、工作原理(入門簡(jiǎn)化版)
所有控制器的工作邏輯都遵循「監(jiān)聽 → 對(duì)比 → 調(diào)和」的循環(huán),核心依賴 K8s 的 Informer 機(jī)制(入門可簡(jiǎn)化理解為“持續(xù)監(jiān)控 APIServer”):
- 監(jiān)聽資源變化:控制器通過 APIServer 持續(xù) watch(監(jiān)聽)自己負(fù)責(zé)的資源(比如 Deployment 控制器監(jiān)聽 Deployment、ReplicaSet、Pod),一旦資源狀態(tài)變化(創(chuàng)建/更新/刪除),會(huì)收到事件通知;
- 對(duì)比期望 vs 實(shí)際狀態(tài):控制器從 APIServer 讀取資源的“期望狀態(tài)”(你定義的,比如 Deployment 的 replicas: 3)和“實(shí)際狀態(tài)”(集群當(dāng)前的,比如 Pod 實(shí)際數(shù) 2);
- 執(zhí)行調(diào)和動(dòng)作:若兩者不一致,控制器通過 APIServer 發(fā)起操作(比如創(chuàng)建新 Pod),修正實(shí)際狀態(tài);
- 循環(huán)往復(fù):持續(xù)監(jiān)聽 → 對(duì)比 → 調(diào)和,直到實(shí)際狀態(tài)匹配期望狀態(tài)。
關(guān)鍵特性(入門必懂)
- 無狀態(tài):Controller Manager 本身不存狀態(tài),所有狀態(tài)都在 etcd 里,重啟后不會(huì)丟失集群狀態(tài);
- 冪等性:調(diào)和操作可重復(fù)執(zhí)行,不會(huì)導(dǎo)致錯(cuò)誤(比如多次觸發(fā)“創(chuàng)建 Pod”,但 APIServer 會(huì)校驗(yàn),最終只創(chuàng)建需要的數(shù)量);
- 領(lǐng)導(dǎo)者選舉(Leader Election):高可用集群中會(huì)運(yùn)行多個(gè) Controller Manager 實(shí)例,但只有一個(gè)成為“主節(jié)點(diǎn)(Leader)”處理任務(wù),其他待命,避免重復(fù)操作。
四、部署方式(入門視角)
1. 常見部署形式
kubeadm 部署的集群中,Controller Manager 通常以靜態(tài) Pod 形式運(yùn)行在 Master 節(jié)點(diǎn)(配置文件路徑:/etc/kubernetes/manifests/kube-controller-manager.yaml),由 kubelet 自動(dòng)管理(重啟、重建)。
2. 高可用(HA)
生產(chǎn)環(huán)境會(huì)部署多個(gè) Master 節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)運(yùn)行一個(gè) Controller Manager 實(shí)例,通過「領(lǐng)導(dǎo)者選舉」機(jī)制(基于 kube-system 命名空間的 Endpoints)確保只有一個(gè)實(shí)例活躍,其余為備用,避免單點(diǎn)故障。
五、入門級(jí)常用操作
1. 查看 Controller Manager 狀態(tài)
# 查看 kube-system 命名空間下的 Controller Manager Pod
kubectl get pods -n kube-system | grep kube-controller-manager
2. 查看配置文件(靜態(tài) Pod 方式)
cat /etc/kubernetes/manifests/kube-controller-manager.yaml
3. 檢查領(lǐng)導(dǎo)者選舉狀態(tài)
# 查看選舉結(jié)果(leader 字段會(huì)顯示活躍的實(shí)例)
kubectl get endpoints kube-controller-manager -n kube-system -o yaml
4. 查看日志(排查問題)
# 替換 <節(jié)點(diǎn)名> 為實(shí)際 Master 節(jié)點(diǎn)名稱
kubectl logs -n kube-system kube-controller-manager-<節(jié)點(diǎn)名>
六、入門避坑指南
-
誤區(qū)1:Controller Manager 是一個(gè)控制器?
? 錯(cuò):它是多個(gè)控制器的“集合”,每個(gè)控制器獨(dú)立運(yùn)行但歸總在這個(gè)進(jìn)程里; -
誤區(qū)2:控制器直接操作容器/節(jié)點(diǎn)?
? 錯(cuò):所有操作必須通過 APIServer,遵循 K8s API 規(guī)范,不直接接觸底層; -
誤區(qū)3:Controller Manager 存儲(chǔ)集群狀態(tài)?
? 錯(cuò):狀態(tài)唯一存儲(chǔ)在 etcd,Controller Manager 只讀取和操作狀態(tài); -
誤區(qū)4:Controller Manager 負(fù)責(zé) Pod 調(diào)度?
? 錯(cuò):調(diào)度是 Scheduler 的工作,Controller Manager 只負(fù)責(zé)“保證副本數(shù)”,不關(guān)心 Pod 跑在哪個(gè)節(jié)點(diǎn)。
七、入門總結(jié)
Controller Manager 是 K8s 的“狀態(tài)調(diào)和引擎”:
- 內(nèi)部包含多個(gè)控制器,每個(gè)控制器管一類資源;
- 核心邏輯是「監(jiān)聽 APIServer → 對(duì)比期望/實(shí)際狀態(tài) → 執(zhí)行調(diào)和動(dòng)作」;
- 無狀態(tài)、依賴 etcd 存狀態(tài)、高可用部署靠領(lǐng)導(dǎo)者選舉;
- 最終目標(biāo):讓集群始終按用戶的要求運(yùn)行。
入門階段不用深究每個(gè)控制器的底層實(shí)現(xiàn),先理解「狀態(tài)調(diào)和」的核心思想,再結(jié)合 Deployment、DaemonSet 等常用資源實(shí)操,就能快速掌握 Controller Manager 的核心價(jià)值。