本文发表时间已超过一年。较旧的文章可能包含过时的内容。请检查页面中的信息自发布以来是否已变得不正确。
Kubernetes 1.25:Pod 的 PodHasNetwork 条件
Kubernetes 1.25 引入了对 Pod 状态字段中新的 kubelet 管理的 Pod 条件的 Alpha 支持:PodHasNetwork
。对于工作节点,kubelet 将使用 PodHasNetwork
条件来准确地呈现 Pod 从容器运行时(通常与 CNI 插件协调)进行 Pod 沙箱创建和网络配置的角度来看的初始化状态。kubelet 在 PodHasNetwork
条件的状态设置为 "True"
后开始拉取容器镜像并启动各个容器(包括 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 状态字段中报告的现有 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
条件中。
尝试 Pod 的 PodHasNetwork 条件
为了使 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)。