Kubernetes 部署滚动更新

Kubernetes Deployment Rolling Updates

我有一个部署在 Kubernetes 上的应用程序。

此应用程序有 4 个副本,我正在对每个部署进行滚动更新。

此应用程序正常关闭可能需要数十分钟(它必须等待 运行 个任务完成)。

我的问题是在更新期间,我的容量过剩,因为所有旧版本 pods 都停留在 "Terminating" 状态,而所有新 pods 都已创建。

在更新期间,我最终得到了 运行 8 个容器,这是我试图避免的事情。

我尝试将 maxSurge 设置为 0,但此设置未考虑 "Terminating" pods,因此部署期间我的服务器负载过高.

我想要得到的行为是新的 pods 只会在旧版本 pods 成功完成后创建,所以在任何时候我都不会超过副本的数量我设置了。

我想知道是否有办法实现这种行为。

让我建议以下策略:

  1. 部署实施就绪的概念 pods 以帮助滚动更新。 准备情况探测 允许部署逐步更新 pods,同时让您可以控制滚动更新何时可以进行。

  2. Ready pod 被 Deployment 视为已成功更新并且将不再计入部署的激增计数。如果 Pod 的就绪探测成功并且自创建 Pod 以来 spec.minReadySeconds 已通过 ,则 Pod 将被视为就绪 。这些选项的默认值将导致 pod 在其容器启动后立即准备就绪。

因此,您可以做的是为您的 pods 实施(如果您还没有这样做的话)readiness probe spec.minReadySeconds 设置为对 pods 终止所需的时间有意义(最坏情况)的值。

这将确保根据您的要求逐步推出。

除此之外,不要忘记为推出配置截止日期。 默认情况下,上线后10分钟内无法取得任何进展,视为失败。部署被视为失败的时间可通过部署规范中的 progressDeadlineSeconds 属性 配置。

我最后做的是用 podManagementPolicy: ParallelupdateStrategy 创建一个 StatefulSetOnDelete

我还将 terminationGracePeriodSeconds 设置为 pod 终止所需的最长时间。

作为部署过程的一部分,我将新 StatefulSet 与新映像一起应用,然后删除所有 运行 pods.

这样所有 pods 都会进入 Terminating 状态,每当一个 pod 完成它的任务并终止一个带有新图像的新 pod 时,就会替换它。

这样我就可以在整个部署过程中保持静态数量的副本。