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

Kubernetes 1.25:Pod 的 PodHasNetwork 狀況

Kubernetes 1.25 在 Pod 的 status 欄位中引入了對由 kubelet 管理的新 Pod 狀況的 Alpha 支援:PodHasNetwork。工作節點上的 kubelet 將使用 PodHasNetwork 狀況,從容器執行時(通常與 CNI 外掛協調)建立 Pod 沙箱和配置網路的角度,準確地反映 Pod 的初始化狀態。在 PodHasNetwork 狀況的狀態被設定為 "True" 後,kubelet 開始拉取容器映象並啟動單個容器(包括 Init 容器)。從叢集基礎設施角度報告 Pod 初始化延遲的指標收集服務(即不考慮每個容器的特性,如映象大小或有效負載)可以利用 PodHasNetwork 狀況來準確地生成服務級別指標(SLI)。某些管理底層 Pod 的 Operator 或控制器可以利用 PodHasNetwork 狀況,來最佳化當 Pod 反覆啟動失敗時所執行的操作集。

Kubernetes 1.28 更新

PodHasNetwork 狀況已重新命名為 PodReadyToStartContainers。與此同時,特性門控 PodHasNetworkCondition 已被 PodReadyToStartContainersCondition 取代。你需要在 v1.28.0 及更高版本中將 PodReadyToStartContainersCondition 設定為 true 才能使用這一新特性。

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

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

如果一個 Pod 指定了 Init 容器,則在該 Pod 的所有 Init 容器都成功執行之前,Pod 狀態中的 Initialized 狀況的狀態不會被設定為 "True"。然而,由使用者配置的 Init 容器可能會出錯(負載崩潰、映象無效等),並且在一個 Pod 中配置的 Init 容器數量可能因工作負載的不同而異。因此,叢集範圍內的、關於 Pod 初始化的基礎設施 SLI 不能依賴於 Pod 的 Initialized 狀況。

如果一個 Pod 沒有指定 Init 容器,則 Pod 狀態中的 Initialized 狀況的狀態會在 Pod 生命週期的很早階段就被設定為 "True"。這發生在 kubelet 啟動任何 Pod 執行時沙箱建立和網路配置步驟之前。因此,一個沒有 Init 容器的 Pod 即使容器執行時無法成功初始化 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 狀況中。

試用 Pod 的 PodHasNetwork 狀況

為了讓 kubelet 在 Pod 的 status 欄位中報告 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) and Agam Dua (@agamdua)。