Kubernetes 是甚麼:從控制循環理解容器編排
從期望狀態與控制循環理解 Kubernetes,分清控制平面、節點、Pod 和 Service,判斷平台能自動化甚麼、團隊仍須驗證甚麼。
Kubernetes 是管理容器化工作負載和服務的開源平台。你聲明希望使用的應用程式映像、副本數量和訪問方式,Kubernetes 的控制組件持續觀察叢集,讓實際狀態接近期望狀態。容器運行應用程式,Kubernetes 則管理應用程式周圍的部署、調度和更新過程。
理解這層分工,比記住組件名稱更重要。Kubernetes 可以調度 Pod、替換失敗的工作負載實例、協調滾動更新,並通過 Service 為不斷變化的 Pod 提供訪問抽象;它不會替你構建源代碼,也不能保證訂單金額正確、所有網絡和存儲故障都能自動恢復。它同樣不指定唯一的日誌或監控後端。官方概述同時説明了這些能力與邊界。
本文面向需要理解控制循環、選擇工作負載類型或判斷是否採用 Kubernetes 的工程師。文章由觀測雲編輯部依據官方文檔編寫,決策表和排障順序是編輯整理的方法,不是 Kubernetes 項目的官方採用標準。下文的故障實驗尚未執行,沒有實測恢復時間或產品性能結論。
先分清四件事
- 映像、容器和 Pod 不同。 映像封裝應用程式及依賴,容器是基於映像運行的實例。Pod 是 Kubernetes 創建和管理的最小可部署計算單元,可以包含一個或多個緊密協作、共享網絡與存儲上下文的容器。
- 期望狀態不等於業務正確。 控制器可以按聲明維持三個 Pod,卻不能據此證明支付、權限判斷或數據庫寫入正確。
- 自愈有條件。 重啓和替換受策略、健康檢查及資源條件約束。不斷重啓並不能修好代碼缺陷。
- Service 不是可用性證明。 穩定的訪問入口仍需要可用後端、有效路由、健康依賴和正確的應用程式響應。
從控制循環理解 Kubernetes
Kubernetes API 中的對象表達運行意圖。對於同時包含這兩個字段的對象,spec 描述期望狀態,status 記錄組件報告的實際狀態。控制組件持續處理二者的差異,具體語義見對象模型。
用户或自動化聲明期望狀態
↓
Kubernetes API 對象(spec)
↓
控制器觀察並調整實際狀態
↓
工作負載控制器按需創建或替換 Pod
↓
調度器為尚未分配 Node 的 Pod 選擇節點
↓
kubelet 通過容器執行環境運行容器
↓
status、條件和事件反映當前進展
└────────→ 繼續協調
應用程式和用户結果 → 指標、日誌、鏈路與請求檢查
→ 團隊修正代碼、設定、策略或聲明
上半部分是平台協調過程,下半部分是團隊判斷業務是否正確的證據路徑。它們相關,但不是同一件事。圖中箭頭表示邏輯關係,不是所有網絡調用的固定時序。
例如,一個 Deployment 聲明 replicas: 3,當前只有兩個符合要求的 Pod,控制器可以創建第三個。若新 Pod 拉不到映像,期望副本數仍是三個,但可用副本可能不足。Kubernetes 會暴露差異,不會替你猜測正確的映像地址。
這些組件獨立地重複協調,而不是中央程序依次執行完一串步驟就結束。如果聲明本身有誤,反覆重試也需要團隊修改聲明才能解決。
控制平面、節點和 Pod
官方組件文檔將叢集分為控制平面和工作節點。實際部署位置及託管責任可能不同,但組件職責可以這樣理解。
| 組件或層次 | 主要職責 | 不能據此證明什麼 |
|---|---|---|
| API Server | 提供創建、讀取和修改對象的 Kubernetes HTTP API | 被接受的設定一定安全、應用程式結果一定正確 |
| etcd | 保存 API Server 使用的數據 | 應用程式業務數據已經備份或可恢復 |
| Scheduler | 為尚未分配節點的 Pod 選擇合適節點 | 應用程式未來有足夠資源或能滿足延遲目標 |
| Controller Manager | 運行控制器,協調期望與實際狀態 | 對象狀態正常就代表業務成功 |
| kubelet | 在節點上管理已分配 Pod 的容器執行 | 運行中的進程已經就緒或業務正確 |
| 容器執行環境 | 在節點上運行容器 | 映像可信、應用程式設定正確 |
| 網絡和存儲實現 | 提供具體環境的連通性和持久化機制 | 路由、權限、卷、備份及恢復目標都已驗證 |
Pod 中的容器共同調度到同一節點。Pod 本身是臨時實體;需要替換時,控制器通常創建新的 Pod,而不是把同一個 Pod 身份搬到另一台機器。詳見 Pod 生命週期。
託管 Kubernetes 可以轉移部分控制平面運維工作,但工作負載、身份權限、網絡策略、數據保護、遙測和事故響應的責任仍需按具體服務與合同劃分。
按生命週期選擇工作負載
工作負載資源的差異,主要在於身份、完成條件和運行方式。
| 資源 | 適用需求 | 平台管理的狀態 | 仍需自己保證的條件 |
|---|---|---|---|
| Deployment | 副本可互換、通常無狀態的服務 | Pod 模板、副本、滾動更新與歷史 | 應用程式無狀態、數據庫變更兼容性 |
| StatefulSet | 穩定身份、順序或持久卷關聯 | Pod 序號身份及更新、擴縮容行為 | 數據複製、備份、仲裁安全和災難恢復 |
| DaemonSet | 每個符合條件的節點運行本地組件 | 每個目標節點上的 Pod | Agent 能連上後端、數據沒有丟失 |
| Job | 執行到完成的任務 | 聲明的成功次數、並行與重試策略 | 進程成功退出時業務結果也正確 |
數據庫放進 StatefulSet,不代表已經有備份;Agent 的 DaemonSet 顯示可用,也不代表數據已經到達存儲。先明確身份、數據、放置和失敗要求,再選資源類型。
Service 放在哪一層
Service描述一組邏輯後端及訪問策略,後端通常是 Pod。Pod 地址隨替換變化,客户端仍可以通過 Service 訪問。
排查訪問失敗時,需要同時核對 selector、Pod 標籤、EndpointSlice、readiness、端口和網絡路徑。Service 存在不能證明 DNS、網絡策略、負載均衡、TLS、數據庫或外部 API 都正常,更不能證明 HTTP 200 中的業務內容正確。
還要區分“EndpointSlice 有地址”和“後端可以接收普通流量”。未就緒的 Pod 仍可能出現在 EndpointSlice;ready、serving、terminating 是不同條件,publishNotReadyAddresses: true 還會影響 ready 的表示。具體依據見 EndpointSlice 文檔。
平台自動化之後,團隊還要負責什麼
| 領域 | Kubernetes 提供的機制 | 團隊需要設計和驗證 |
|---|---|---|
| 調度 | 按資源請求、限制條件及節點選擇放置位置 | 容量、拓撲、資源請求和無可用節點時的行為 |
| 副本 | 創建替代實例、維持聲明數量 | 副本是否足夠、狀態是否安全、替換後服務是否恢復 |
| 更新 | 協調新舊 Pod 模板的切換 | readiness、數據庫兼容性、回滾和業務驗證 |
| 自愈 | 按策略重啓容器、替換 Pod、調整路由候選 | 代碼缺陷、持久化故障、數據損壞及外部依賴 |
| Service | 將客户端與後端地址變化隔離 | DNS、網絡實現、加密、策略及端到端可達性 |
| 擴縮容 | 在設定的信號和策略下調整容量 | SLO、指標質量、最小容量、時延、成本及縮容安全 |
| 擴展 | 自定義資源、控制器和准入邏輯 | 版本兼容、供應鏈、權限、故障隔離及維護責任 |
| 可觀測性 | 暴露組件信號與對象狀態 | 收集、脱敏、保留、關聯、告警及響應 |
自愈文檔説明了重啓策略、工作負載替換及存儲恢復的邊界。Deployment 文檔也明確:更新停滯時平台報告狀態,不能假定它必然自動回滾代碼和數據。
平台收斂與業務成功要分別驗證
下面是用於説明邊界的假設,不是實測結果。
| 觀察到的狀態 | 可以説明什麼 | 還不能説明什麼 |
|---|---|---|
| 三個 Pod 都 Ready | 容器就緒及已設定的 readiness gate 條件滿足 | 一定設定了應用程式探針、訂單結果正確或依賴數據新鮮 |
| Deployment 更新完成 | 更新條件已經達到 | 數據庫變更兼容、錯誤率和延遲達標 |
| Service 有 ready endpoint | 條件和 Service 設置產生了路由候選 | DNS、策略、TLS、網絡及響應內容都正確 |
| 容器重啓 | 重啓機制按策略執行了 | 原因已消除或不會再次崩潰 |
| 副本增多 | 目標容量發生了變化 | 瓶頸不是數據庫、鎖或錯誤的擴容信號 |
因此,一次恢復確認至少需要平台證據與業務結果兩部分。前者包括 spec、status、條件、事件和 EndpointSlice,後者包括真實請求、業務不變量、日誌、鏈路、應用程式指標或用户體驗。
一個尚未執行的故障實驗
這個實驗計劃用於觀察:錯誤映像聲明怎樣造成期望與實際狀態的差異,恢復原映像後平台及請求結果如何變化。本文沒有運行或獨立復現此實驗,沒有可報告的輸出或恢復時間。
執行前應使用隔離的非生產叢集,並記錄 Kubernetes 精確補丁版本、kind 或同類工具版本、執行環境、宿主機系統及架構。所有映像使用不可變 digest,副本數和更新策略顯式寫入清單,保存清單校驗值、時間與命令版本。公開記錄不得包含憑證、kubeconfig、客户標識或內部地址。
實驗步驟如下,不能將預期當作結果:
- 在隔離 namespace 中部署一個最小應用程式及 ClusterIP Service,用已核對的映像 digest,並定義包含預期響應內容的請求檢查。
- 保存健康基線:清單、Deployment 狀態、Pod 條件、Service 與 EndpointSlice、事件、更新狀態、應用程式響應和退出碼。
- 僅將 Deployment 映像改為故意不可用的測試引用,不同時改動探針、副本、selector 或 Service。
- 記錄替代 Pod 無法就緒時的 Deployment、ReplicaSet、Pod 狀態與事件,以及實際請求結果。
- 恢復原映像 digest,再記錄就緒狀態、EndpointSlice 與請求結果。不要預先認定請求必然中斷,舊的 Ready Pod 可能仍在服務。
- 刪除實驗 namespace,確認叢集中沒有殘留資源或臨時憑證;需要保留的脱敏證據單獨存放。
常見的工作假設是出現 ErrImagePull 或 ImagePullBackOff,但倉庫策略、緩存、准入規則、執行環境和 Kubernetes 版本會影響具體表現,必須以實際記錄為準。
以下是擬使用的只讀採集命令,<recorded-pod-name> 需替換為當次記錄的 Pod 名稱:
kubectl -n k8s-definition-lab get deployment,replicaset,pod,service,endpointslice -o wide
kubectl -n k8s-definition-lab describe deployment demo
kubectl -n k8s-definition-lab describe pod <recorded-pod-name>
kubectl -n k8s-definition-lab get events --sort-by=.metadata.creationTimestamp
kubectl -n k8s-definition-lab rollout status deployment/demo --timeout=120s
這些命令不能證明業務正確。實驗還需要實際請求及預期響應、脱敏原始輸出,並由第二位工程師按相同輸入復現。若結果不同於假設,應報告差異。
為什麼仍然需要可觀測性
官方可觀測性文檔把組件與應用程式的指標、日誌和鏈路作為理解系統狀態的證據。組件能輸出信號,不等於叢集已經統一存儲、保留和關聯它們。
排障時可以分三層:叢集和節點證據用於判斷平台是否具備運行條件;對象和工作負載證據用於定位協調在哪裏受阻;應用程式和用户證據用於確認服務實際是否正確。Kubernetes 組件可以暴露 Prometheus 格式的指標,kube-state-metrics 提供對象狀態資訊,但端點權限、穩定性、採集與保留仍須設定。需要集中歷史日誌時,也必須將日誌保存到容器生命週期之外。
| 症狀 | 第一批證據 | 下一步 |
|---|---|---|
| Pod 一直 Pending | spec.nodeName、Pod 條件、容器狀態及事件 |
未綁定時查調度;已綁定時查映像、執行環境與容器準備 |
| 容器不斷重啓 | 當前與上次狀態、重啓次數、事件 | 查上次日誌、探針、資源壓力和依賴 |
| 更新不完成 | Deployment 條件、新舊 ReplicaSet、Pod | 查映像、准入、調度、readiness 和配額 |
| Service 沒有可用後端 | selector、Pod 標籤、EndpointSlice 地址及條件 | 分清地址不存在和存在但未就緒,再查端口及監聽 |
| 有後端但請求失敗 | 端到端請求與應用程式日誌、鏈路 | 查 DNS、策略、代理、TLS 及下游依賴 |
| Pod Ready 但用户仍慢 | 請求延遲、鏈路、依賴指標 | 查代碼、隊列、數據庫、飽和度和最近變更 |
Pending 包括等待調度和調度後的映像下載,不能直接歸因於 scheduler。關聯三層證據時,應保留叢集、namespace、工作負載、Pod、容器、服務、環境、版本和 trace 上下文;不要為了關聯而採集憑證、個人資料或無限增長的用户標識。
是否值得采用 Kubernetes
下面是條件式決策表,不是打分排名。安全、數據恢復或責任歸屬的缺口,不能用其他項目的幾個“是”抵消。
| 問題 | 應收集的證據 | 適合繼續試點的條件 | 應暫停或比較簡單方案的條件 |
|---|---|---|---|
| 要解決什麼問題 | 部署、擴容、恢復及發佈失敗記錄 | 確有多工作負載、更新、放置或統一策略需求 | 只是運行一個現有託管服務已能承擔的簡單應用程式 |
| 生命週期是否匹配 | 無狀態、有狀態、批處理、身份和依賴 | 能對應合適控制器及失敗策略 | 尚未定義數據和恢復方式就先選平台 |
| 誰負責運行 | 升級、節點、插件、權限、事故和容量負責人 | 維護時間及升級責任明確 | 希望引入後運維工作自動消失 |
| 怎樣驗證正確 | readiness、SLO、請求和數據不變量 | 平台與業務結果都能驗證 | 只看 Pod Running |
| 數據如何恢復 | 備份、恢復測試、複製、RPO/RTO | 控制器之外的恢復已演練 | 把 StatefulSet 或持久卷當作備份 |
| 網絡和安全是否清楚 | RBAC、准入、密鑰、網絡及映像信任 | 各項控制能在上線前驗證 | 權限、邊界和數據路徑尚不明確 |
| 能否排查 | 信號清單、關聯鍵、保留和演練記錄 | 能從用户症狀追到平台與應用程式證據 | 數據很多但無法共同支持調查 |
| 託管方負責什麼 | 服務範圍、版本政策、可用性及支持條款 | 責任轉移確實減少團隊負擔 | 未讀合同就認為一切由供應商負責 |
| 如何退出 | 分階段遷移、數據導出、並行與回滾方案 | 小規模試點可撤銷 | 首個有效測試前就需要不可逆重構 |
當問題明確、資源模型合適、責任人到位,且關鍵安全與恢復條件可驗證時,再推進有界原型。若只增加控制平面、網絡、存儲和升級負擔,卻沒有解決實際問題,應比較更簡單的容器或應用程式平台。
部署地點也是選型的一部分。應逐項核對實際區域、可用區、數據路徑、流量費用、支持覆蓋和跨境要求。其他地區的服務説明,不能直接證明目標地區的可用性或合同條件;這些需要在具體供應商評估中確認。
下一步
理解組件後,可以繼續閲讀官方的組件、工作負載及 Service 文檔。
在觀測雲中實施採集時,先核對 Kubernetes 集成、Prometheus 自動發現與 ServiceMonitor / PodMonitor 支持字段。對象查看方式見容器基礎設施文檔。這些資料説明產品的設定路徑,不是所有環境都已驗證的證明。
需要評估商業監控方案時,再參考觀測雲 Kubernetes 監控,用自己的叢集核對權限、標籤、信號缺失、延遲和回滾。
資料依據
技術機制於 2026 年 10 月 27 日對照 Kubernetes 官方英文文檔複核;本文是文檔型指南,未運行上述實驗。