Kubernetes 部署滚动更新
Kubernetes Deployment Rolling Updates
我有一个部署在 Kubernetes 上的应用程序。
此应用程序有 4 个副本,我正在对每个部署进行滚动更新。
此应用程序正常关闭可能需要数十分钟(它必须等待 运行 个任务完成)。
我的问题是在更新期间,我的容量过剩,因为所有旧版本 pods 都停留在 "Terminating" 状态,而所有新 pods 都已创建。
在更新期间,我最终得到了 运行 8 个容器,这是我试图避免的事情。
我尝试将 maxSurge
设置为 0,但此设置未考虑 "Terminating" pods,因此部署期间我的服务器负载过高.
我想要得到的行为是新的 pods 只会在旧版本 pods 成功完成后创建,所以在任何时候我都不会超过副本的数量我设置了。
我想知道是否有办法实现这种行为。
让我建议以下策略:
部署实施就绪的概念 pods 以帮助滚动更新。 准备情况探测 允许部署逐步更新 pods,同时让您可以控制滚动更新何时可以进行。
Ready pod 被 Deployment 视为已成功更新并且将不再计入部署的激增计数。如果 Pod 的就绪探测成功并且自创建 Pod 以来 spec.minReadySeconds
已通过 ,则 Pod 将被视为就绪 。这些选项的默认值将导致 pod 在其容器启动后立即准备就绪。
因此,您可以做的是为您的 pods 实施(如果您还没有这样做的话)readiness probe 将 spec.minReadySeconds
设置为对 pods 终止所需的时间有意义(最坏情况)的值。
这将确保根据您的要求逐步推出。
除此之外,不要忘记为推出配置截止日期。
默认情况下,上线后10分钟内无法取得任何进展,视为失败。部署被视为失败的时间可通过部署规范中的 progressDeadlineSeconds
属性 配置。
我最后做的是用 podManagementPolicy: Parallel
和 updateStrategy
创建一个 StatefulSet
到 OnDelete
。
我还将 terminationGracePeriodSeconds
设置为 pod 终止所需的最长时间。
作为部署过程的一部分,我将新 StatefulSet
与新映像一起应用,然后删除所有 运行 pods.
这样所有 pods 都会进入 Terminating
状态,每当一个 pod 完成它的任务并终止一个带有新图像的新 pod 时,就会替换它。
这样我就可以在整个部署过程中保持静态数量的副本。
我有一个部署在 Kubernetes 上的应用程序。
此应用程序有 4 个副本,我正在对每个部署进行滚动更新。
此应用程序正常关闭可能需要数十分钟(它必须等待 运行 个任务完成)。
我的问题是在更新期间,我的容量过剩,因为所有旧版本 pods 都停留在 "Terminating" 状态,而所有新 pods 都已创建。
在更新期间,我最终得到了 运行 8 个容器,这是我试图避免的事情。
我尝试将 maxSurge
设置为 0,但此设置未考虑 "Terminating" pods,因此部署期间我的服务器负载过高.
我想要得到的行为是新的 pods 只会在旧版本 pods 成功完成后创建,所以在任何时候我都不会超过副本的数量我设置了。
我想知道是否有办法实现这种行为。
让我建议以下策略:
部署实施就绪的概念 pods 以帮助滚动更新。 准备情况探测 允许部署逐步更新 pods,同时让您可以控制滚动更新何时可以进行。
Ready pod 被 Deployment 视为已成功更新并且将不再计入部署的激增计数。如果 Pod 的就绪探测成功并且自创建 Pod 以来
spec.minReadySeconds
已通过 ,则 Pod 将被视为就绪 。这些选项的默认值将导致 pod 在其容器启动后立即准备就绪。
因此,您可以做的是为您的 pods 实施(如果您还没有这样做的话)readiness probe 将 spec.minReadySeconds
设置为对 pods 终止所需的时间有意义(最坏情况)的值。
这将确保根据您的要求逐步推出。
除此之外,不要忘记为推出配置截止日期。
默认情况下,上线后10分钟内无法取得任何进展,视为失败。部署被视为失败的时间可通过部署规范中的 progressDeadlineSeconds
属性 配置。
我最后做的是用 podManagementPolicy: Parallel
和 updateStrategy
创建一个 StatefulSet
到 OnDelete
。
我还将 terminationGracePeriodSeconds
设置为 pod 终止所需的最长时间。
作为部署过程的一部分,我将新 StatefulSet
与新映像一起应用,然后删除所有 运行 pods.
这样所有 pods 都会进入 Terminating
状态,每当一个 pod 完成它的任务并终止一个带有新图像的新 pod 时,就会替换它。
这样我就可以在整个部署过程中保持静态数量的副本。