![零停机时间 Pod 驱逐,实现单副本部署](https://linux22.com/image/792751/%E9%9B%B6%E5%81%9C%E6%9C%BA%E6%97%B6%E9%97%B4%20Pod%20%E9%A9%B1%E9%80%90%EF%BC%8C%E5%AE%9E%E7%8E%B0%E5%8D%95%E5%89%AF%E6%9C%AC%E9%83%A8%E7%BD%B2.png)
我的应用程序作为具有 1 个副本的部署运行。
当我执行时kubectl rollout restart deployment my-app
,它会先启动新的 pod,等待它准备就绪,然后删除旧 pod。这提供了零停机重启,同时保留了单个副本。
但是,当某些东西(例如 cluster-autoscaler 或 node drip)决定从节点中驱逐 pod 时,它会立即删除 pod。新的 pod 被安排在新节点上,但是需要一些时间来提取映像、启动容器、初始化应用程序。在此期间,会有停机时间。
问题是:当 Pod 从节点被逐出时,是否有可能以某种方式实现零停机重启?我希望它的工作方式类似于推出重启:在另一个节点上启动新的 Pod,等待它准备就绪,然后删除被逐出的 Pod。
答案1
遗憾的是,在原生 Kubernetes 中,无法直接实现由于自动扩缩器或节点耗尽等外部因素而被逐出的单副本部署的零停机重启。这些逐出通常发生得很突然,没有空间进行像 中那样的协调过渡kubectl rollout restart
。
但是,有几种解决方法可以最大限度地减少停机时间并接近零停机时间,例如:
使用 PodDisruptionBudgets (PDB)
实现 PreStop Hooks
为你的 Pod 配置适当的存活和就绪探测
当 Pod 从节点中被逐出时,它会被立即删除,新的 Pod 会调度到其他节点。但是,拉取映像、启动容器和初始化应用需要一些时间,从而导致停机。为了在 Pod 从节点中被逐出时实现零停机重启,建议使用 Deployment 而不是单个副本部署。
要了解如何使用 Kubernetes 实现零停机应用程序,请参阅关联。