我有一个在Kubernetes上部署的应用程序。
此应用程序有4个副本,我正在对每个部署进行滚动更新。
此应用程序有一个正常的关闭状态,可能需要数十分钟的时间(必须等待正在运行的任务完成)。
我的问题是,在更新期间,由于所有较旧版本的Pod在创建所有新Pod时都处于“终止”状态,因此我的容量过大。
在更新期间,我最终使用8个容器运行,这是我要避免的事情。
我尝试将maxSurge
设置为0,但是此设置未考虑“终结”窗格,因此部署期间服务器上的负载过高。
我试图获得的行为是,只有在旧版本的Pod成功完成之后才能创建新的Pod,因此,在任何时候我都不会超过设置的副本数。
我想知道是否有办法实现这种行为。
让我建议以下策略:
部署实施就绪吊舱的概念以辅助滚动更新。 Readiness Probes允许部署逐步更新Pod,同时使您能够确定何时可以进行滚动更新。
Ready pod是被部署成功更新的一个,将不再计入部署的高峰期数。吊舱将被视为已准备就绪如果其准备工作成功,并且自从创建吊舱以来已经通过spec.minReadySeconds
。这些选项的默认设置将使容器在容器启动后立即准备就绪。
因此,您可以做的是为吊舱实现readiness probe(如果尚未这样做)此外,将spec.minReadySeconds
设置为有意义的值(最坏的情况)到吊舱终止的时间。
这将确保按您的要求逐步进行部署。
此外,请不要忘记为发布设置最终期限。默认情况下,首次部署10分钟之内无法取得任何进展后,就视为失败。可以通过“部署”规范中的progressDeadlineSeconds
属性来配置部署失败的时间。