“kubectl get pods 報錯怎么辦?”你翻開筆記,上面只寫了“粘貼這行命令”。你試了一下,仍然不行。你開始撓頭、重啟、刪資源重建,最終在一篇同事分享的文章里發現答案——不是命令錯了,是調度器沒把 Pod 分配到節點上,因為節點有污點。你花了兩小時,如果懂一點架構,五分鐘就夠了。
大多數工程師入門 Kubernetes 的方式很一致:用“記住命令”對抗“未知報錯”。資深一點的工程師,會多一點追問:這些命令最終打到了哪里?為什么 Delete Pod 會自動重啟?誰在替我維持集群的“正確狀態”?當你開始問這些問題時,你已經走到了那道分水嶺——從背命令,轉向理解架構。一旦越過,故障排查就從盲目試錯變成有跡可循的推演。
這篇文章不做“全棧解讀”,也不堆砌 YAML 樣板,只把 Kubernetes 架構背后的運轉邏輯拆成幾個核心組件,用清單的形式攤開。讀完你不會變成架構師,但至少能知道每次 kubectl 敲下去,集群內部正在發生什么。
第一,API Server:所有操作的唯一入口
不論你用的是 kubectl get pods、kubectl apply -f deployment.yaml,還是 kubectl delete pod nginx,這些指令最終都發往同一個地方——API Server。它像整個集群的前臺,不做實際工作,但一切請求都經過它。你發的命令被它接收、驗證,然后寫進集群的“永久記憶”,或者從中讀取。它就是集群的網關,離開它,你連集群的門都摸不到。
為什么搞懂這一點重要?因為當 kubectl 返回 unknown api group、無權限、超時之類的錯誤時,你不會再茫然地檢索“kubectl 報錯怎么解決”這種泛問題。你會意識到:問題可能出在 API Server 不可達、證書過期或是網絡策略阻斷了你到它的通信。定位就被錨定到了一個具體組件上。
第二,分布式鍵值存儲:集群的唯一真相來源
Kubernetes 把所有期望的狀態都寫進一個分布式的鍵值數據庫里,它叫 etcd。這里面記錄著集群的一切:有哪些 Pod、Deployment、Service、ConfigMap、Secret,甚至集群自身的配置信息。你可以把它理解為集群的“永久記憶”。一旦這里出了問題,集群就失憶了——不是 Pod 不跑了,而是控制器不知道它應該跑成什么樣,整個系統的自我糾正能力也就癱瘓了。
這就是為什么備份這個數據庫是所有生產集群的必修課。不是因為它脆弱,而是因為它是整個 Kubernetes 世界里的“單一事實源”。你以為 kubectl apply 創建了資源?實際上,是 API Server 先把你聲明的期望寫入了這個分布式存儲,然后各組控制器才各自行動,把現實朝那個期望拉近。
第三,Scheduler:決定 Pod 去哪兒住的分配器
每次新建 Pod,集群不會讓它懸在半空。Scheduler 會站出來回答一個問題:“這個 Pod 該放在哪個 Worker Node 上?”它不負責搬箱子,它負責點人頭。它會考量的約束很多:節點上還有多少可用的 CPU 和內存、有沒有親和性規則、有沒有污點與容忍的設置、資源是否夠用。它把這看作一個帶約束的最優匹配問題,解出答案后,再把決定告訴 API Server。
現實里,如果你發現某個 Pod 一直在 Pending 狀態,調度器就是第一嫌疑人。不是沒資源,就是有規則排斥。懂得了 Scheduler 的運作,你就不會對著 Pending Pod 發呆,而是開始用 describe 查看事件,找出調度器到底卡在了哪個約束上。
第四,Controller Manager:一群“監察員”盯著期望與現實
Kubernetes 里沒有哪個組件是專門說“我來保證集群符合期望”的,但 Controller Manager 里住著一群專注于此的控制器。比如 ReplicaSet 控制器盯著副本數,如果發現跑少了一個,它就去啟動一個新的;Node 控制器監視節點的心跳,如果某個節點失聯,它會做下線處理;Deployment 控制器負責滾動更新時按策略把舊 Pod 逐步替換。每個控制器都執行一個簡單的循環:觀測當前狀態,比對期望狀態,修正偏差。
這個設計解釋了為什么你手動刪掉一個 Pod,它居然會“重生”。那不是魔法,是 ReplicaSet 控制器發現“副本數不足”然后觸發了修復。把集群當成一個不斷自我校準的生命體,你就不會再驚訝于它的自動行為了。
第五,Cloud Controller Manager:云環境的翻譯官
如果你用的是 AWS、GCP 或 Azure 等云環境,Cloud Controller Manager 就會出場。它把集群的需要翻譯成云服務的指令。需要負載均衡器?它去申請。節點被釋放或故障?它處理節點生命周期的變化。云網絡怎么集成?它也管。一句話:它讓 Kubernetes 和云平臺說同一種語言,你不用自己寫膠水代碼。
第六,Worker Node 上的三個“工頭”
Kubelet 是每個節點上的總代理,它從 API Server 領任務,在本節點上啟動 Pod,并持續上報 Pod 狀態。如果 Pod 掛了,它會嘗試按期望狀態修復。容器運行時就負責真正跑起容器,比如 containerd 或 CRI-O。至于 Kube Proxy,它管理網絡規則,讓 Service 的虛擬 IP 能正確映射到后端 Pod,保證流量能送到該去的地方。
當你看清這些組件的分工,原來那些“莫名重啟”“Pending 不退”“服務不通”的問題就開始有了明確的排查路徑。你不需要再背第三百條命令,只需要沿著請求的流動方向一步步推演,答案自然浮現。
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.