本文已超過一年。較舊的文章可能包含過時的內容。請檢查頁面中的資訊自發布以來是否已變得不正確。

Kubernetes 1.25:Pod 的 PodHasNetwork 條件

Kubernetes 1.25 為 Pod 的狀態欄位中新增由 kubelet 管理的 Pod 狀況的 Alpha 支援:PodHasNetwork。對於工作節點,kubelet 將使用 PodHasNetwork 狀況,從容器執行階段(通常與 CNI 外掛程式協調)的角度,準確地呈現 Pod 沙箱建立和網路組態的 Pod 初始化狀態。在 PodHasNetwork 狀況的狀態設定為 "True" 之後,kubelet 才會開始提取容器映像並啟動個別容器(包括 init 容器)。從叢集基礎架構的角度報告 Pod 初始化延遲(即與每個容器特性(如映像大小或有效負載)無關)的指標收集服務,可以利用 PodHasNetwork 狀況來準確產生服務等級指標 (SLI)。管理底層 Pod 的某些運算子或控制器可以利用 PodHasNetwork 狀況來最佳化 Pod 重複啟動失敗時執行的一系列動作。

Kubernetes 1.28 的更新

PodHasNetwork 狀況已重新命名為 PodReadyToStartContainers。與此變更同時,功能閘道 PodHasNetworkCondition 已由 PodReadyToStartContainersCondition 取代。您需要在 v1.28.0 及更高版本中將 PodReadyToStartContainersCondition 設定為 true,才能使用新功能。

這與 Pod 現有已報告的 Initialized 狀況有何不同?

kubelet 會根據 Pod 中是否存在 init 容器,設定 Pod 狀態欄位中報告的現有 Initialized 狀況的狀態。

如果 Pod 指定了 init 容器,則在 Pod 的所有 init 容器都成功之前,Pod 狀態中的 Initialized 狀況的狀態將不會設定為 "True"。但是,使用者設定的 init 容器可能會有錯誤(有效負載崩潰、映像無效等),並且 Pod 中設定的 init 容器數量可能因不同的工作負載而異。因此,圍繞 Pod 初始化叢集範圍的基礎架構 SLI 無法依賴 Pod 的 Initialized 狀況。

如果 Pod 未指定 init 容器,則 Pod 狀態中 Initialized 狀況的狀態會在 Pod 生命週期的早期設定為 "True"。這發生在 kubelet 啟動任何 Pod 執行階段沙箱建立和網路組態步驟之前。因此,即使容器執行階段無法成功初始化 Pod 沙箱環境,沒有 init 容器的 Pod 也會將 Initialized 狀況的狀態報告為 "True"

相對於上述任一情況,PodHasNetwork 狀況呈現了更準確的資料,說明 Pod 執行階段沙箱何時初始化並設定網路,以便 kubelet 可以繼續啟動 Pod 中使用者設定的容器(包括 init 容器)。

特殊情況

如果 Pod 將 hostNetwork 指定為 "True",則 PodHasNetwork 狀況會根據 Pod 沙箱是否成功建立而設定為 "True",同時忽略 Pod 沙箱的網路組態狀態。這是因為當 Pod 的 hostNetwork 設定為 "True" 時,CRI 實作通常會跳過任何 Pod 沙箱網路組態。

節點代理程式可能會透過監看指定額外網路組態的 Pod 註釋(例如 k8s.v1.cni.cncf.io/networks)中的變更,動態重新設定 Pod 的網路介面。在 Kubelet(與容器執行階段協調)初始化 Pod 沙箱之後,Pod 網路組態的動態更新不會反映在 PodHasNetwork 狀況中。

試用 PodHasNetwork Pod 狀況

為了讓 kubelet 在 Pod 的狀態欄位中報告 PodHasNetwork 狀況,請在 kubelet 上啟用 PodHasNetworkCondition 功能閘道。

對於執行階段沙箱已成功建立且已設定網路的 Pod,kubelet 將報告 PodHasNetwork 狀況,且狀態設定為 "True"

$ kubectl describe pod nginx1
Name:             nginx1
Namespace:        default
...
Conditions:
  Type              Status
  PodHasNetwork     True
  Initialized       True
  Ready             True
  ContainersReady   True
  PodScheduled      True

對於執行階段沙箱尚未建立(且也未設定網路)的 Pod,kubelet 將報告 PodHasNetwork 狀況,且狀態設定為 "False"

$ kubectl describe pod nginx2
Name:             nginx2
Namespace:        default
...
Conditions:
  Type              Status
  PodHasNetwork     False
  Initialized       True
  Ready             False
  ContainersReady   False
  PodScheduled      True

下一步?

根據意見回饋和採用情況,Kubernetes 團隊計畫在 1.26 或 1.27 版本中將 PodHasNetwork 狀況的報告推進到 Beta 階段。

如何了解更多資訊?

請查看 文件,了解有關 PodHasNetwork 狀況的更多資訊,以及它如何與其他 Pod 狀況相關聯。

如何參與?

此功能由 SIG Node 社群推動。請加入我們,與社群聯繫,並分享您對上述功能及其他方面的想法和意見回饋。我們期待您的來信!

致謝

我們要感謝以下人員對圍繞此功能的 KEP 和 PR 提供了深刻且有益的審閱:Derek Carr (@derekwaynecarr)、Mrunal Patel (@mrunalp)、Dawn Chen (@dchen1107)、Qiutong Song (@qiutongs)、Ruiwen Zhao (@ruiwen-zhao)、Tim Bannister (@sftim)、Danielle Lancashire (@endocrimes) 和 Agam Dua (@agamdua)。