我的应用程序作为具有 1 个副本的部署运行。
当我执行时kubectl rollout restart deployment my-app
,它首先启动新的 pod,等待它准备好,然后删除旧的 pod。这提供了零停机重新启动,同时保留单个副本。
然而,当某些东西(例如集群自动缩放器或节点耗尽)决定从节点中驱逐 pod 时,它会立即删除 pod。新的 Pod 被安排在新节点上,但是需要一些时间来拉取镜像、启动容器、初始化应用程序。在此期间,有一个停机时间。
问题是:当 pod 从节点被逐出时,是否有可能以某种方式实现零停机重启?我希望它的工作方式与推出重启类似:在不同的节点上启动新的 Pod,等待它准备好,然后删除被逐出的 Pod。
不幸的是,在普通 Kubernetes 中,无法直接实现因自动缩放器或节点耗尽等外部因素而被逐出的单副本部署的零停机重启。这些驱逐通常突然发生,没有留下像
kubectl rollout restart
.然而,有几种解决方法可以最大限度地减少停机时间并接近零停机时间,例如:
使用 PodDisruptionBudgets (PDB)
实施 PreStop 挂钩
为您的 Pod 配置适当的活性和就绪探针
当 pod 从节点被逐出时,它会立即被删除,并且新的 pod 会被调度到不同的节点上。然而,拉取镜像、启动容器和初始化应用程序需要一些时间,从而导致停机。为了在 Pod 从节点中逐出时实现零停机重启,建议使用 Deployment 而不是单个副本部署。
要了解更多有关如何使用 Kubernetes 实现零停机应用程序的信息,请参阅此链接。