本文已超过一年。较旧的文章可能包含过时的内容。请检查页面中的信息自发布以来是否已不再正确。
Kubernetes 1.25:Pods 的 PodHasNetwork 条件
Kubernetes 1.25 引入了对 kubelet 管理的 Pod 新条件的 Alpha 支持,该条件位于 Pod 的 status 字段中:PodHasNetwork
。kubelet(针对工作节点)将使用 PodHasNetwork
条件来精确地从容器运行时(通常与 CNI 插件协同)进行 Pod 沙箱创建和网络配置的角度反映 Pod 的初始化状态。当 PodHasNetwork
条件的状态设置为 "True"
后,kubelet 开始拉取容器镜像并启动单个容器(包括 init 容器)。从集群基础设施角度(即与每个容器的特性无关,如镜像大小或负载)报告 Pod 初始化延迟的指标收集服务,可以利用 PodHasNetwork
条件来精确生成服务水平指标 (SLI)。管理底层 Pod 的某些 Operator 或控制器可以利用 PodHasNetwork
条件来优化当 Pod 重复启动失败时执行的操作集。
Kubernetes 1.28 的更新
PodHasNetwork
条件已重命名为 PodReadyToStartContainers
。随此变更,Feature Gate PodHasNetworkCondition
已被 PodReadyToStartContainersCondition
取代。你需要在 v1.28.0 及更高版本中设置 PodReadyToStartContainersCondition
为 true 才能使用此新特性。
这与 Pod 现有的 Initialized 条件有何不同?
kubelet 根据 Pod 中是否存在 init 容器来设置 Pod 的 status 字段中报告的现有 Initialized
条件的状态。
如果 Pod 指定了 init 容器,Pod status 中的 Initialized
条件状态不会被设置为 "True"
,直到 Pod 的所有 init 容器都成功完成。然而,由用户配置的 init 容器可能存在错误(例如负载崩溃、无效镜像等),并且 Pod 中配置的 init 容器数量可能因不同工作负载而异。因此,集群范围内的、围绕 Pod 初始化的基础设施 SLI 不能依赖于 Pod 的 Initialized
条件。
如果 Pod 未指定 init 容器,Pod status 中的 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 沙箱的网络配置。
节点代理可以通过观察指定附加网络配置(例如 k8s.v1.cni.cncf.io/networks
)的 Pod Annotation 的变化来动态重新配置 Pod 的网络接口。在 Kubelet(与容器运行时协调)初始化 Pod 沙箱之后,Pod 网络配置的动态更新不会反映在 PodHasNetwork
条件中。
试用 Pod 的 PodHasNetwork 条件
为了让 kubelet 在 Pod 的 status 字段中报告 PodHasNetwork
条件,请在 kubelet 上启用 PodHasNetworkCondition
Feature Gate。
对于运行时沙箱已成功创建且已配置网络的 Pod,kubelet 将报告状态设置为 "True"
的 PodHasNetwork
条件
$ kubectl describe pod nginx1
Name: nginx1
Namespace: default
...
Conditions:
Type Status
PodHasNetwork True
Initialized True
Ready True
ContainersReady True
PodScheduled True
对于运行时沙箱尚未创建(且网络也未配置)的 Pod,kubelet 将报告状态设置为 "False"
的 PodHasNetwork
条件
$ 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 和 PRs 进行了富有洞察力和帮助性的审查: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)。