Kubernetes 架構:組件、控制流程與故障邊界

釐清 API Server、etcd、Scheduler、Controller 與 kubelet 的職責,解釋 Pod 的啟動流程、排程與准入邊界,以及不同故障應查看的證據。

技術解析 最佳實務
Kubernetes 架構:組件、控制流程與故障邊界

Kubernetes 架構由管理叢集狀態的控制平面,以及運行容器化工作負載的工作節點組成。用户通過 API 提交期望狀態,API Server 處理請求,controller、scheduler 和 kubelet 根據 API 中的狀態履行各自職責;容器執行環境則執行 kubelet 發來的 CRI 請求。它並不是一台“主服務器”按固定順序指揮所有組件的流水線。

本文解釋組件分工、從 API 到 Pod 的控制過程,以及怎樣區分不同故障邊界。依據是 Kubernetes 官方文檔,不是對特定雲服務內部網絡的實測。文章由觀測雲編輯部編寫;觀測雲的產品文檔僅用於説明採集路徑,不能代替 Kubernetes 機制證據。文中的三個實驗方案均未執行,沒有實測輸出或恢復時間。

若還不熟悉 Pod、聲明式管理以及 Kubernetes 的適用條件,可以先看 Kubernetes 是什麼。

邏輯架構不等於物理拓撲

官方組件文檔將叢集描述為控制平面與一個或多個工作節點。自建叢集可能由團隊管理各組件的部署、升級及恢復;託管服務則由供應商承擔其中一部分。組件可以共用機器,也可以跨機器或可用區分佈。

網絡、存儲和雲資源的連接方式取決於插件及部署形式。因此,本文討論的是邏輯職責,不把一個概念圖當作所有 EKS、GKE、AKS 或私有叢集的唯一物理路徑。責任分界仍應以實際服務文檔和合同為準。

控制平面:保存意圖並持續協調

組件 職責 首先檢查的證據 單憑這些證據不能確定什麼
kube-apiserver 提供 Kubernetes HTTP API API 響應、認證授權錯誤、日誌及指標 延遲究竟來自 etcd、網絡、准入還是客户端
etcd 一致性鍵值存儲,保存 API Server 使用的數據 健康狀態、日誌、指標及 API 症狀 業務代碼或用户請求的錯誤原因
kube-controller-manager 運行多個控制器,使實際狀態接近期望狀態 對象 spec/status、事件及控制器信號 協調失敗的最終原因或業務結果
kube-scheduler 為尚未綁定節點的 Pod 選擇節點 PodScheduled 條件、事件及調度器日誌 選中節點後映像能否拉取、應用程式能否正常運行
cloud-controller-manager 將雲特定控制邏輯與 Kubernetes 核心組件分離 雲資源狀態及相應控制器信號 所有叢集都存在此組件或使用同一實現

API Server 是共享狀態的入口,不是完成所有任務的中央執行器。控制器反覆觀察狀態並請求變更,調度器和 kubelet 也通過 API 獨立工作。不能將這一過程理解成一個長同步函數。

etcd 也不是任何應用程式或組件都可以直接讀寫的通用業務數據庫。訪問權限、備份和恢復,應圍繞其保存叢集 API 狀態的職責單獨設計。

工作節點:把 Pod 聲明變成容器執行

組件或邊界 作用 條件與例外 首批證據
kubelet 管理分配到本節點的 PodSpec,並執行設定的探針 不負責節點上任意非 Kubernetes 容器 Pod 條件、事件、kubelet 日誌及指標
容器執行環境 處理映像和容器執行生命週期 需要 CRI 兼容;Docker Engine 需要 cri-dockerd 等適配器 執行環境日誌、映像拉取結果、kubelet 症狀
kube-proxy 或替代網絡實現 實現 Service 規則與流量路徑 部分網絡插件可替代 kube-proxy Service、EndpointSlice、數據路徑及網絡檢查
Pod 一個或多個共享上下文的容器組成的最小可部署單元 臨時實體,通常由工作負載控制器管理 Pod 設定、狀態、容器狀態及探針

容器執行環境文檔説明了 CRI 邊界。Docker Engine 本身不實現 CRI,內置 dockershim 已於 Kubernetes v1.24 移除。不要把某一種執行環境或 socket 路徑當作所有版本的永久默認值。

kubelet 只執行已經設定的探針。readiness 成功不代表數據一致性、外部依賴和整條用户旅程都正確;沒有設定應用程式探針時,Ready 更不能證明已經執行過業務檢查。

從 API 請求到運行中的 Pod

下面是提交 Deployment 後的概念過程,各組件的重試與協調可以異步發生,不是網絡包的精確順序。

  1. 客户端通過 kubectl 或 API 提交工作負載聲明,API Server 處理請求。
  2. 被接受的 API 狀態保存在 etcd;不是客户端繞過 API 直接寫 etcd。
  3. 工作負載控制器觀察期望和實際狀態,按需調整 ReplicaSet 與 Pod 對象。
  4. 調度器發現尚未分配節點的 Pod,根據資源請求、約束、策略和可用節點選擇放置位置。
  5. 目標節點的 kubelet 觀察分配給自己的 Pod,通過 CRI 請求執行環境準備並運行容器。
  6. kubelet 更新容器狀態及 Pod 條件,執行探針;其他組件和用户繼續通過 API 觀察狀態。
客户端 → kube-apiserver ↔ etcd(API 狀態)
                 ↑
       ┌─────────┼──────────┐
       │         │          │
   controller scheduler   kubelet
   觀察/寫入   觀察/綁定    觀察分配的 Pod/更新狀態
                            │
                            ▼
                   CRI 兼容執行環境 → 容器

這是一幅根據官方機制整理的邏輯圖,不是實驗抓包結果。排障時應把對象變化、事件、組件日誌、指標及執行層證據放到同一時間軸,不能只憑一次 status 截圖就認定某個組件有問題。

工作負載與訪問路徑要分層看

Deployment通過 ReplicaSet 管理 Pod 的聲明式更新;三個名字不是同一個對象的不同叫法。Service提供訪問抽象,EndpointSlice則表示後端端點及其條件。

層次 檢查對象或信號 能回答的問題 還需要其他證據的問題
Deployment 更新狀態、條件、ReplicaSet 目標版本和副本替換是否推進 每次業務請求是否成功
Pod phase、條件、容器狀態、探針 執行或準備是否出錯 Service 和外部依賴是否正常
Service / EndpointSlice selector、端口、地址和端點條件 是否存在候選後端、是否可參與路由 後端業務響應是否正確
網絡 / DNS 名稱解析、連通性和數據路徑 請求能否到達後端 應用程式計算是否正確
應用程式 / 用户 日誌、鏈路、請求結果、SLO、RUM 實際服務和用户旅程受到什麼影響 控制平面哪個組件是最終原因

有 endpoint 不等於請求成功,應用程式出現 5xx 也不等於控制平面故障。對象身份與時間必須對應,才能逐層驗證假設。

通信與安全邊界

控制平面與節點通信文檔區分了節點訪問 API,以及 API Server 訪問 kubelet、Pod 或 Service 的路徑。

  • kubelet 和使用 Kubernetes API 的節點組件與 API Server 通信,需要認證、授權及傳輸保護。
  • 容器執行環境通常通過本地 CRI 接收 kubelet 請求,不能據此認為執行環境直接 watch Kubernetes API。
  • 登錄成功不等於擁有所有對象權限;認證和授權需要分別檢查。
  • kubelet API、API Server 到節點的路徑、隧道及雲供應商連接方式,隨部署而變。
  • 端口、證書、ServiceAccount、網絡策略及加固步驟,應使用目標版本的官方設定文檔。

任何實驗記錄都應控制原始憑證的訪問,並在公開前去除 kubeconfig、token、證書私鑰、客户數據及內部地址。本篇不要求把這些資料複製到文章或截圖中。

高可用和故障域不是一回事

多個控制平面實例,不會自動讓業務具備高可用。kubeadm 高可用拓撲討論堆疊與外置 etcd;多可用區文檔討論副本如何跨故障域分佈。需要分別檢查:

故障邊界 可能症狀 首批證據 需要單獨設計的內容
API Server / 控制平面 API 不可用、延遲、認證錯誤或協調停滯 API 響應及組件信號 拓撲、負載均衡、etcd 保護與恢復
etcd API 狀態讀寫異常 etcd 與 API Server 的關聯症狀 仲裁、備份、恢復、訪問控制
節點 / 執行環境 映像拉取或容器執行失敗 Node/Pod 條件、事件和節點日誌 容量、映像倉庫、執行環境和宿主機
調度約束 已創建 Pod 尚未綁定節點 spec.nodeName、PodScheduled 和調度事件 requests、affinity、taint/toleration、節點容量
ResourceQuota / 准入 創建或更新被拒絕,新 Pod 可能不存在 API 錯誤、ReplicaSet FailedCreate、namespace 配額 配額、資源請求及准入政策
可用區 / 網絡 / 存儲 一組節點、卷或訪問路徑受影響 按拓撲關聯的對象與網絡、存儲證據 副本分佈、存儲恢復及依賴佈局
應用程式 5xx、延遲、錯誤結果 應用程式日誌、鏈路、SLO、用户檢查 冗餘、數據一致性、依賴及回滾

Pending 不只意味着等待調度,也包括節點已經分配後的映像下載及容器準備。ResourceQuota超額則可能讓 API 以 403 Forbidden 拒絕創建,連待調度 Pod 都沒有。兩種情況的檢查入口不同。

這張表是調查起點,不是自動根因樹。同一症狀可以跨多個邊界出現;恢復時間和可用性承諾還需要合同或固定環境的測試支持。

用可觀測性連接這些層次

官方可觀測性文檔説明了指標、日誌及鏈路的作用;集中日誌也需要在容器生命週期之外設計收集與保留。

調查時先固定時間、叢集、namespace、工作負載、Pod UID 與節點,然後讀取對象狀態和 owner 關係,尋找協調差異。事件可以提示調度、拉映像或探針變化,但不是單獨的根因證明。再用相應組件的日誌與指標縮小範圍,最後檢查應用程式請求和用户結果是否隨修復恢復。

觀測雲的 Kubernetes 集成、Prometheus 自動發現及 ServiceMonitor / PodMonitor 支持字段可作為採集設定入口。它們説明產品公開支持的路徑,具體權限、版本、字段映射及限制仍須在目標環境驗證,不能視作任意叢集都已實測通過。

三個尚未執行的故障實驗

實驗旨在區分故障邊界,不用於比較供應商性能,也不能證明觀測雲自動定位了原因。三個方案都沒有執行結果、截圖或耗時記錄。

執行前的共同條件

使用一次性的非生產 kind 或同類叢集,固定 Kubernetes 補丁版本、kind、執行環境、CNI、宿主機系統與架構。對工作負載映像的來源和 digest、清單、資源限制與探針做版本管理。保存命令、原始輸出、退出碼、時間、對象 YAML、事件、組件證據及清理結果;公開副本應脱敏,再由另一位工程師復現。

實驗一:調度邊界

計劃提交要求不存在節點標籤或無法滿足約束的 Pod,收集 phase、條件、調度事件和可選節點資訊。修正後再次觀察綁定。要區分“還未選中節點”和“已選中節點但執行失敗”。本文沒有實際觀察 Pending 狀態、具體事件或綁定耗時。

實驗二:節點與執行環境邊界

計劃使用不存在的映像 digest 或 tag,收集容器狀態、事件、kubelet、執行環境及倉庫請求證據,再恢復已知可用映像。已完成調度不意味着已經拉取並運行映像。本文沒有實測 ErrImagePull、ImagePullBackOff 或其他具體狀態。

實驗三:readiness 與 EndpointSlice 邊界

計劃部署固定失敗的 readiness probe 與 Service,隨後修正探針。記錄 Pod Ready 條件、探針結果、selector、EndpointSlice 地址及 ready、serving、terminating,同時記錄 Service 的 publishNotReadyAddresses 與實際請求。

容器運行、Pod 就緒、地址存在、流量資格及業務響應是五種不同事實。未就緒 Pod 可以留在 EndpointSlice,開啓 publishNotReadyAddresses 時端點還可能被標記為 ready。本文沒有測得端點變化順序或恢復時間。

在原始輸出與第二次復現記錄齊備前,這些實驗只能作為待執行方法,不能改寫為“已測”“已驗證”或某產品的優勢證明。官方文檔支持機制解釋,實驗只能支持特定環境中實際觀察到的結果。

繼續學習與實施

定義和適用邊界見 Kubernetes 是什麼。深入設定應使用當前官方的架構、組件及目標版本的安裝、安全文檔。

若要評估觀測雲在生產環境中的監控路徑,可以參考Kubernetes 監控方案,再以一個測試叢集驗證對象、指標、日誌、權限與缺失數據。產品説明和概念解釋都不能替代這一步。

一手資料

2026 年 10 月 27 日按官方文檔復核技術機制,未執行上述實驗。

取得專屬方案

聯絡我們

加入社群

微信扫码
加入官方交流群

立即體驗

在线开通,按量计费,真正的云服务!

立即開始

选择观测云版本

代码托管平台