Kubernetes部署滚动更新

时间:2020-05-11 19:10:35

标签: kubernetes kubernetes-deployment

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

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

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

我的问题是,在更新期间,由于所有较旧版本的Pod在创建所有新Pod时都处于“终止”状态,因此我的容量过大。

在更新过程中,我最终运行了8个容器,这是我要避免的事情。

我尝试将maxSurge设置为0,但是此设置未考虑“终结”窗格,因此部署期间服务器上的负载过高。

我试图获得的行为是,只有在旧版本的Pod成功完成之后才能创建新的Pod,所以在任何时候我都不会超过设置的副本数。

我想知道是否有一种方法可以实现这种行为。

2 个答案:

答案 0 :(得分:1)

我最终要做的是创建一个StatefulSetpodManagementPolicy: ParallelupdateStrategy的{​​{1}}。

我还将OnDelete设置为吊舱终止的最长时间。

作为部署过程的一部分,我将新的terminationGracePeriodSeconds与新的映像一起应用,然后删除所有正在运行的Pod。

这样,所有Pod都将进入StatefulSet状态,并且每当Pod完成其任务并以新映像终止新Pod时,它将替换它。

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

答案 1 :(得分:0)

让我提出以下策略:

  1. 部署实现了准备就绪Pod的概念来辅助滚动更新。 准备情况探针允许部署逐步更新容器,同时使您能够确定何时可以进行滚动更新。

  2. “就绪”窗格是部署已成功更新的窗格,将不再计入部署的高峰期计数。 如果准备就绪探测成功,并且自{pod创建以来spec.minReadySeconds已通过,则该Pod将被视为已就绪。这些选项的默认设置将导致容器在容器启动后立即准备就绪。

因此,您可以执行的操作是(如果尚未执行的话)为Pod设置readiness probe此外spec.minReadySeconds设置为(最坏的情况)对于吊舱终止所花费的时间有意义的值。

这将确保根据您的要求逐步进行部署。

除此之外,别忘了为推出配置截止日期。 默认情况下,发布在10分钟之内无法取得任何进展后,就视为失败。可以通过“部署”规范中的progressDeadlineSeconds属性来配置部署失败的时间。