我有一个在Kubernetes上部署的应用程序。
此应用程序有4个副本,我正在对每个部署进行滚动更新。
此应用程序正常关闭,可能需要数十分钟(它必须等待正在运行的任务完成)。
我的问题是,在更新期间,由于所有较旧版本的Pod在创建所有新Pod时都处于“终止”状态,因此我的容量过大。
在更新过程中,我最终运行了8个容器,这是我要避免的事情。
我尝试将maxSurge
设置为0,但是此设置未考虑“终结”窗格,因此部署期间服务器上的负载过高。
我试图获得的行为是,只有在旧版本的Pod成功完成之后才能创建新的Pod,所以在任何时候我都不会超过设置的副本数。
我想知道是否有一种方法可以实现这种行为。
答案 0 :(得分:1)
我最终要做的是创建一个StatefulSet
和podManagementPolicy: Parallel
到updateStrategy
的{{1}}。
我还将OnDelete
设置为吊舱终止的最长时间。
作为部署过程的一部分,我将新的terminationGracePeriodSeconds
与新的映像一起应用,然后删除所有正在运行的Pod。
这样,所有Pod都将进入StatefulSet
状态,并且每当Pod完成其任务并以新映像终止新Pod时,它将替换它。
这样,我可以在整个部署过程中保持静态数量的副本。
答案 1 :(得分:0)
让我提出以下策略:
部署实现了准备就绪Pod的概念来辅助滚动更新。 准备情况探针允许部署逐步更新容器,同时使您能够确定何时可以进行滚动更新。
“就绪”窗格是部署已成功更新的窗格,将不再计入部署的高峰期计数。 如果准备就绪探测成功,并且自{pod创建以来spec.minReadySeconds
已通过,则该Pod将被视为已就绪。这些选项的默认设置将导致容器在容器启动后立即准备就绪。
因此,您可以执行的操作是(如果尚未执行的话)为Pod设置readiness probe,此外将spec.minReadySeconds
设置为(最坏的情况)对于吊舱终止所花费的时间有意义的值。
这将确保根据您的要求逐步进行部署。
除此之外,别忘了为推出配置截止日期。
默认情况下,发布在10分钟之内无法取得任何进展后,就视为失败。可以通过“部署”规范中的progressDeadlineSeconds
属性来配置部署失败的时间。