本文发表已超过一年。较旧的文章可能包含过时的内容。请检查页面中的信息自发布以来是否已不正确。
Kubernetes 1.25:应用滚动更新的两项功能升级为稳定版
此博客描述了两个特性,即 StatefulSets 的 minReadySeconds
和 DaemonSets 的 maxSurge
,SIG Apps 很高兴能在 Kubernetes 1.25 中将其升级为稳定版。
当在 .spec.updateStrategy
字段中使用 RollingUpdate
值时,指定 minReadySeconds
会通过等待每个 Pod 达到期望的时间来减慢 StatefulSet 的滚动更新速度。此时间可用于初始化 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)通常作为 DaemonSet 运行。如果这些 DaemonSet 在升级期间暂时关闭,这些组件可能会影响工作负载的可用性。该功能允许 DaemonSet Pod 临时增加其数量,从而确保 DaemonSet 的零停机时间。
请注意,不允许在 DaemonSet 中将 hostPort
与 maxSurge
结合使用,因为 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 的名称> -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 邮件列表 [email protected] 与我们联系。