本文发表于一年多前。旧文章可能包含过时内容。请检查页面中的信息自发布以来是否已变得不正确。
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
(就绪)了给定的秒数。Ready
和 Available
的概念对于工作负载非常重要。例如,某些工作负载,如具有多个 Alertmanager 实例的 Prometheus,只有在 Alertmanager 的状态转移完成后才应被视为 Available
。minReadySeconds
在使用云提供商的负载均衡器时也很有帮助。由于 Pod 应 Ready
给定的秒数,它提供了缓冲时间,以防止在新 Pod 出现之前杀死轮换中的 Pod。
DaemonSets 的 maxSurge
像 CNI、CSI 这样的 Kubernetes 系统级组件通常作为 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_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
- 文档: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 与我们联系。