K8s-在旧的Pod终止之前安排新的Pod

时间:2020-05-13 13:43:06

标签: kubernetes kubernetes-pod

我已经阅读了Kubernetes文档,但无法获得有关问题的明确答案。我正在使用官方的cluster-autoscaler。

  1. 我有一个部署,该部署指定一个副本应正在运行。当Pod终止时(例如,正在按比例缩小的节点上运行)新Pod是在终止开始之前还是在终止完成之后进行调度的?文档说调度发生了终止时,但不提及在哪个阶段。
  2. 要在不中断任何服务的情况下实现无缝的节点缩减,我希望k8将Pod扩展到N + 1个副本(此时,pod仅调度到未缩减的节点上),然后耗尽节点。根据我的测试,它会先排干水分,然后根据配置安排所有丢失的豆荚。 是否可以配置此行为,或者当前无法执行此操作?

据我了解,RollingUpdate策略可以轻松实现无缝更新。我找不到缩小比例的相同“滚动”策略。

编辑

TL; DR我正在寻找a)两个以上副本部署和b)一个副本部署上的HA

a)可以通过使用PDB来实现。查看Fritz的答案。如果您需要将Pod安排在不同的节点上,请利用抗亲和力(马克的回答)

b)如果您对短暂的中断没事,那么PDB是官方的解决方法。如果您需要解决方法,我的答案可能会很有启发性。

3 个答案:

答案 0 :(得分:3)

可以使用Disruption Budget

配置按比例缩小行为

在部署清单中,您可以在自愿中断(例如排空节点)期间定义$("input[type=date]").val(""); maxUnavailable的Pod数量。

有关操作方法,请查看the K8s Documentation

答案 1 :(得分:1)

下面是一些见解,希望对您有所帮助:

  1. 如果使用部署,则调度程序将检查您始终在运行所需数量的副本。不多不多。因此,当您杀死一个节点(具有您的一个副本)时,将在 终止您的原始副本之一后安排新的Pod。您可以自行决定是否要进行计划内的维护。

  2. 如果您有很多节点(意味着有多个节点),并希望为您的部署实现HA(高可用性),那么您应该看看 pod关联性/反关联性 >。您可以找到更多in the official doc

答案 2 :(得分:0)

讨厌回答我自己的问题,但是仅使用一个Pod(不浪费资源并运行一个空闲副本)的高可用性服务的简单解决方案是使用PreStop钩子(在适当的情况下阻止操作)未与terminationGracePeriodSeconds一起执行SIGTERM处理),并且有足够的时间启动其他服务。

与这里所说的相反,调度发生在pod终止时。经过快速测试(应该与阅读文档一起完成),在其中创建了一个带有一个副本并将terminationGracePeriodSeconds设置为240秒的busybox(sh sleep 3600)部署。

通过删除Pod,它将进入“终止”状态并保持240秒。在标记该广告连播为“正在终止”之后,立即安排了新的广告连播而不是它。 因此,上一个吊舱有时间完成其所做的一切,而另一个吊舱可以无缝代替它。

自从LB将停止发送新请求以来,我还没有测试网络的行为,但是我认为停机时间将比不将terminationGracePeriodSeconds设置为比默认值大的情况下要短得多。 >

请注意,这绝对不是官方的,但可以用作我的用例的解决方法。