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

StatefulSet 的最小就绪秒数

此博客描述了 StatefulSet 工作负载的可用性概念,以及 Kubernetes 1.22 中新增的 alpha 功能,该功能为 StatefulSet 添加了 minReadySeconds 配置。

这解决了什么问题?

在 Kubernetes 1.22 版本之前,一旦 StatefulSetPod 处于 Ready 状态,就被认为可以接收流量。对于某些 StatefulSet 工作负载来说,情况可能并非如此。例如,像 Prometheus 这样具有多个 Alertmanager 实例的工作负载,只有在 Alertmanager 的状态传输完成时才应被认为是 Available,而不是在 Pod 处于 Ready 状态时。由于 minReadySeconds 添加了缓冲区,状态传输可能会在 Pod 变为 Available 之前完成。虽然这并非确定状态传输是否完成的万无一失的方法,但它为最终用户提供了一种表达其意图的方式,即在 Pod 被认为是 Available 且准备好服务请求之前等待一段时间。

在云提供商中使用带有 LoadBalancerServices 时,minReadySeconds 也有帮助。由于 minReadySecondsPod 处于 Ready 状态后增加了延迟,因此它提供了缓冲时间,以防止在新的 Pod 出现之前轮换杀死 Pod。想象一下,一个负载均衡器在异常路径下需要 10-15 秒才能传播。如果您有 2 个副本,那么只有在第一个副本启动后才会杀死第二个副本,但实际上,第一个副本是不可见的,因为它尚未准备好服务请求。

因此,总的来说,StatefulSets 中的 Availability 概念非常有用,此功能有助于解决上述问题。这是一个已经存在于 DeploymentsDaemonSets 中的功能,现在我们也在 StatefulSets 中提供了该功能,以给用户带来一致的工作负载体验。

它是如何工作的?

statefulSet 控制器会监视 StatefulSets 以及与其关联的 Pods。当与此功能关联的功能门启用时,statefulSet 控制器会识别与 StatefulSet 关联的特定 Pod 处于 Running 状态的时间长度。

如果此值大于或等于最终用户在 .spec.minReadySeconds 字段中指定的时间,则 statefulSet 控制器会更新 StatefulSet 的状态子资源中名为 availableReplicas 的字段,以包含此 PodStatefulSet 状态中的 status.availableReplicas 是一个整数字段,用于跟踪 Available 的 Pod 的数量。

我如何使用它?

您需要准备以下事项才能试用此功能

  • 下载并安装大于 v1.22.0 版本的 kubectl
  • kube-apiserverkube-controller-manager 上使用命令行标志 --feature-gates=StatefulSetMinReadySeconds=true 打开功能门

成功启动 kube-apiserverkube-controller-manager 后,您将在状态中看到 AvailableReplicas,并在规范中看到 minReadySeconds(默认值为 0)。

为任何 StatefulSet 指定 minReadySeconds 的值,您可以使用以下命令通过检查 AvailableReplicas 字段来检查 Pods 是否可用: kubectl get statefulset/<statefulset 的名称> -o yaml

如何了解更多?

如何参与?

请在 Slack 上的 #sig-apps 频道中联系我们(如果您需要邀请,请访问 https://slack.k8s.io/),或者在 SIG Apps 邮件列表中联系我们: [email protected]