本文发表于一年多前。旧文章可能包含过时内容。请检查页面中的信息自发布以来是否已变得不正确。

Kubernetes 1.25:两个用于应用发布的特性进阶至稳定版

本博客描述了 SIG Apps 很高兴在 Kubernetes 1.25 中发布为稳定版的两个特性,即 StatefulSets 的 minReadySeconds 和 DaemonSets 的 maxSurge

当在 .spec.updateStrategy 字段中使用 RollingUpdate 值时,指定 minReadySeconds 可以通过为每个 Pod 等待所需时间来减慢 StatefulSet 的发布速度。这段时间可用于初始化 Pod(例如,预热缓存)或作为确认 Pod 之前的延迟。

当在 .spec.updateStrategy 字段中使用 RollingUpdate 值时,maxSurge 允许 DaemonSet 工作负载在发布期间在节点上运行同一 Pod 的多个实例。这有助于最大限度地减少 DaemonSet 对消费者的停机时间。

这些特性已经在 Deployment 和其他工作负载中可用。这次升级有助于在所有工作负载中统一此功能。

这些特性解决了什么问题?

StatefulSets 的 minReadySeconds

minReadySeconds 确保 StatefulSet 工作负载在报告 Pod 为 Available(可用)之前,已经 Ready(就绪)了给定的秒数。ReadyAvailable 的概念对于工作负载非常重要。例如,某些工作负载,如具有多个 Alertmanager 实例的 Prometheus,只有在 Alertmanager 的状态转移完成后才应被视为 AvailableminReadySeconds 在使用云提供商的负载均衡器时也很有帮助。由于 Pod 应 Ready 给定的秒数,它提供了缓冲时间,以防止在新 Pod 出现之前杀死轮换中的 Pod。

DaemonSets 的 maxSurge

像 CNI、CSI 这样的 Kubernetes 系统级组件通常作为 DaemonSet 运行。如果这些 DaemonSet 在升级过程中瞬间中断,可能会影响工作负载的可用性。该特性允许 DaemonSet Pod 临时增加其数量,从而确保 DaemonSet 的零停机时间。

请注意,不允许在 DaemonSet 中将 hostPortmaxSurge 结合使用,因为 DaemonSet Pod 绑定到单个节点,两个活动的 Pod 不能在同一节点上共享相同的端口。

它是如何工作的?

StatefulSets 的 minReadySeconds

StatefulSet 控制器监视 StatefulSet 的 Pod,并计算特定 Pod 处于 Running 状态的时长,如果该值大于或等于 StatefulSet 的 .spec.minReadySeconds 字段中指定的时间,StatefulSet 控制器会更新 StatefulSet 状态中的 AvailableReplicas 字段。

DaemonSets 的 maxSurge

DaemonSet 控制器根据 .spec.strategy.rollingUpdate.maxSurge 中给定的值创建额外的 Pod(超出 DaemonSet 规约中期望的数量)。额外的 Pod 将在旧的 DaemonSet Pod 所在的同一节点上运行,直到旧 Pod 被杀死。

  • 默认值为 0。
  • MaxUnavailable 为 0 时,该值不能为 0
  • 该值可以指定为 Pod 的绝对数量,或期望 Pod 数量的百分比(向上取整)。

我该如何使用它?

StatefulSets 的 minReadySeconds

为任何 StatefulSet 指定一个 minReadySeconds 的值,并使用以下命令检查 AvailableReplicas 字段,以查看 Pod 是否可用

kubectl get statefulset/<statefulset_name> -o yaml

请注意,minReadySeconds 的默认值为 0。

DaemonSets 的 maxSurge

.spec.updateStrategy.rollingUpdate.maxSurge 指定一个值,并将 .spec.updateStrategy.rollingUpdate.maxUnavailable 设置为 0

然后在下一次发布中观察到更快的发布速度和同时运行的更多 Pod。

kubectl rollout restart daemonset <name_of_the_daemonset>
kubectl get pods -w

我如何了解更多信息?

StatefulSets 的 minReadySeconds

DaemonSets 的 maxSurge

我如何参与?

请通过 Slack 上的 #sig-apps 频道或 SIG Apps 邮件列表 kubernetes-sig-apps@googlegroups.com 与我们联系。