这篇文章已发布一年多。较旧的文章可能包含过时内容。请检查页面信息自发布以来是否已失效。
Kubernetes 1.25: 应用部署的两项功能达到稳定阶段
本篇博客介绍了 SIG Apps 很高兴在 Kubernetes 1.25 中升级至 Stable 版本的两个特性:StatefulSets 的 minReadySeconds
和 DaemonSets 的 maxSurge
。
在 .spec.updateStrategy
字段中使用 RollingUpdate
值时,指定 minReadySeconds
会让 StatefulSet 的滚动更新变慢,通过等待每个 Pod 达到指定时间。这段时间可用于初始化 Pod(例如预热缓存)或作为确认 Pod 前的延迟。
在 .spec.updateStrategy
字段中使用 RollingUpdate
值时,maxSurge
允许 DaemonSet 工作负载在滚动更新期间在同一节点上运行同一 Pod 的多个实例。这有助于最大限度地减少 DaemonSet 对消费者的停机时间。
这些特性已经在 Deployment 和其他工作负载中可用。这次升级有助于在各种工作负载之间统一此功能。
这些特性解决了什么问题?
StatefulSets 的 minReadySeconds
minReadySeconds
确保 StatefulSet 工作负载在将 Pod 报告为 Available
之前,已经处于 Ready
状态达到指定的秒数。Ready
和 Available
的概念对于工作负载来说非常重要。例如,某些工作负载(如带有多个 Alertmanager 实例的 Prometheus)只有在 Alertmanager 的状态转移完成后才应被视为 Available
。minReadySeconds
在与云提供商的负载均衡器一起使用时也很有帮助。由于 Pod 必须处于 Ready
状态达到指定的秒数,这提供了一段缓冲时间,可以防止在新的 Pod 出现之前终止轮换中的 Pod。
DaemonSets 的 maxSurge
Kubernetes 系统级组件,如 CNI、CSI 通常作为 DaemonSets 运行。如果这些 DaemonSets 在升级过程中短暂停止,可能会影响工作负载的可用性。该特性允许 DaemonSet Pods 临时增加其数量,从而确保 DaemonSets 的零停机。
请注意,DaemonSets 中结合使用 hostPort
和 maxSurge
是不允许的,因为 DaemonSet Pod 绑定到单个节点,两个活跃的 Pod 不能在同一个节点上共享同一个端口。
它是如何工作的?
StatefulSets 的 minReadySeconds
StatefulSet 控制器监视 StatefulSet Pods 并计算特定 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
字段来查看 Pods 是否可用,命令如下:
kubectl get statefulset/<有状态副本集的名称> -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
- 文档:https://k8s.io/docs/concepts/workloads/controllers/statefulset/#minimum-ready-seconds
- KEP:https://github.com/kubernetes/enhancements/issues/2599
- API 变更:https://github.com/kubernetes/kubernetes/pull/100842
DaemonSets 的 maxSurge
- 文档:https://k8s.io/docs/tasks/manage-daemon/update-daemon-set/
- KEP:https://github.com/kubernetes/enhancements/issues/1591
- API 变更:https://github.com/kubernetes/kubernetes/pull/96375
如何参与?
请在 Slack 的 #sig-apps 频道联系我们,或通过 SIG Apps 邮件列表 kubernetes-sig-apps@googlegroups.com 联系。