K8s Controller Manager 入門詳解

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”):

  1. 監(jiān)聽資源變化:控制器通過 APIServer 持續(xù) watch(監(jiān)聽)自己負(fù)責(zé)的資源(比如 Deployment 控制器監(jiān)聽 Deployment、ReplicaSet、Pod),一旦資源狀態(tài)變化(創(chuàng)建/更新/刪除),會(huì)收到事件通知;
  2. 對(duì)比期望 vs 實(shí)際狀態(tài):控制器從 APIServer 讀取資源的“期望狀態(tài)”(你定義的,比如 Deployment 的 replicas: 3)和“實(shí)際狀態(tài)”(集群當(dāng)前的,比如 Pod 實(shí)際數(shù) 2);
  3. 執(zhí)行調(diào)和動(dòng)作:若兩者不一致,控制器通過 APIServer 發(fā)起操作(比如創(chuàng)建新 Pod),修正實(shí)際狀態(tài);
  4. 循環(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)名>

六、入門避坑指南

  1. 誤區(qū)1:Controller Manager 是一個(gè)控制器?
    ? 錯(cuò):它是多個(gè)控制器的“集合”,每個(gè)控制器獨(dú)立運(yùn)行但歸總在這個(gè)進(jìn)程里;
  2. 誤區(qū)2:控制器直接操作容器/節(jié)點(diǎn)?
    ? 錯(cuò):所有操作必須通過 APIServer,遵循 K8s API 規(guī)范,不直接接觸底層;
  3. 誤區(qū)3:Controller Manager 存儲(chǔ)集群狀態(tài)?
    ? 錯(cuò):狀態(tài)唯一存儲(chǔ)在 etcd,Controller Manager 只讀取和操作狀態(tài);
  4. 誤區(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à)值。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容