这篇文章已经一年多了,较旧的文章可能包含过时的内容。请检查从发表以来,页面中的信息是否变得不正确。

Kubernetes 1.25:Pod 新增 PodHasNetwork 状况

Kubernetes 1.25 引入了对 kubelet 所管理的新的 Pod 状况 PodHasNetwork 的 Alpha 支持, 该状况位于 Pod 的 status 字段中 。对于工作节点,kubelet 将使用 PodHasNetwork 状况从容器运行时 (通常与 CNI 插件协作)创建 Pod 沙箱和网络配置的角度准确地了解 Pod 的初始化状态。 在 PodHasNetwork 状况的 status 设置为 "True" 后,kubelet 开始拉取容器镜像并启动独立的容器 (包括 Init 容器)。从集群基础设施的角度报告 Pod 初始化延迟的指标采集服务 (无需知道每个容器的镜像大小或有效负载等特征)就可以利用 PodHasNetwork 状况来准确生成服务水平指标(Service Level Indicator,SLI)。 某些管理底层 Pod 的 Operator 或控制器可以利用 PodHasNetwork 状况来优化 Pod 反复出现失败时要执行的操作。

Kubernetes 1.28 更新内容

PodHasNetwork 状况已更名为 PodReadyToStartContainers。与此变更同步的是,特性门控 PodHasNetworkCondition 已被替换为 PodReadyToStartContainersCondition。 你需要将 PodReadyToStartContainersCondition 设置为 true, 才能在 v1.28.0 及更高版本中使用这一新特性。

这与现在为 Pod 所报告的 Intialized 状况有何不同?

根据 Pod 中是否存在 Init 容器,kubelet 会设置在 Pod 的 status 字段中报告的 Initialized 状况的状态。

如果 Pod 指定了 Init 容器,则 Pod 状态中的 Initialized 状况的 status 将不会设置为 "True", 直到该 Pod 的所有 Init 容器都成功为止。但是,用户配置的 Init 容器可能会出现错误(有效负载崩溃、无效镜像等), 并且 Pod 中配置的 Init 容器数量可能因工作负载不同而异。 因此,关于 Pod 初始化的集群范围基础设施 SLI 不能依赖于 Pod 的 Initialized 状况。

如果 Pod 未指定 Init 容器,则在 Pod 生命周期的早期, Pod 状态中的 Initialized 状况的 status 会被设置为 "True"。 这一设置发生在 kubelet 开始创建 Pod 运行时沙箱及配置网络之前。 因此,即使容器运行时未能成功初始化 Pod 沙箱环境,没有 Init 容器的 Pod 也会将 Initialized 状况的 status 报告为 "True"

相对于上述任何一种情况,PodHasNetwork 状况会在 Pod 运行时沙箱被初始化并配置了网络时能够提供更准确的数据, 这样 kubelet 可以继续在 Pod 中启动用户配置的容器(包括 Init 容器)。

特殊场景

如果一个 Pod 指定 hostNetwork"True", 系统会根据 Pod 沙箱创建操作是否成功来决定要不要将 PodHasNetwork 状况设置为 "True", 设置此状况时会忽略 Pod 沙箱的网络配置状态。这是因为 Pod 的 hostNetwork 被设置为 "True" 时 CRI 实现通常会跳过所有 Pod 沙箱网络配置。

节点代理可以通过监视指定附加网络配置(例如 k8s.v1.cni.cncf.io/networks)的 Pod 注解变化, 来动态地为 Pod 重新配置网络接口。Pod 沙箱被 Kubelet 初始化(结合容器运行时)之后 Pod 网络配置的动态更新不反映在 PodHasNetwork 状况中。

试用 Pod 的 PodHasNetwork 状况

为了让 kubelet 在 Pod 的 status 字段中报告 PodHasNetwork 状况,需在 kubelet 上启用 PodHasNetworkCondition 特性门控。

对于已成功创建运行时沙箱并已配置网络的 Pod,在 status 设置为 "True" 后, kubelet 将报告 PodHasNetwork 状况:

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

对于尚未创建运行时沙箱(也未配置网络)的 Pod,在 status 设置为 "False" 后, kubelet 将报告 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 和 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)。