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