当您关闭旧节点时,其上运行的 Pod 也将被关闭。 如果需要清除 Pod 以正常关闭怎么办? 您正在使用的虚拟化系统可能不会等待清理过程完成。
如果同时关闭所有节点怎么办? 当 Pod 移动到新节点时,您将获得相当长的停机时间。
我们需要一种方法来从旧节点优雅地迁移 Pod,同时确保在对节点进行更改时没有任何工作进程在运行。 或者,当我们对集群进行完全替换时,如示例中所示(即替换虚拟机映像),我们希望将正在运行的应用程序从旧节点转移到新节点。 在这两种情况下,我们都希望阻止新的 pod 在旧节点上调度,然后从其中驱逐所有正在运行的 pod。 为了实现这些目标我们可以使用命令 kubectl drain.
重新分配节点上的所有 Pod
Drain 操作允许您重新分配节点中的所有 Pod。 在drain执行期间,节点被标记为不可调度(标志 NoSchedule)。 这可以防止新的 Pod 出现在其上。 然后drain开始从节点驱逐pod,关闭当前在节点上运行的容器,发送信号 TERM pod 中的容器。
虽然 kubectl drain 会很好地驱逐 Pod,但还有两个因素可能导致排空操作失败:
您的应用程序必须能够在提交后正常终止 TERM 信号。 当 pod 被驱逐时,Kubernetes 会发送一个信号 TERM 容器并等待它们停止指定的时间,之后,如果它们没有停止,则强制终止它们。 无论如何,如果您的容器无法正确感知信号,如果 Pod 当前正在运行(例如,数据库事务正在进行中),您仍然可能会错误地终止它们。
您将丢失包含您的应用程序的所有 pod。 当新容器在新节点上启动时,它可能不可用,或者如果您的 Pod 部署在没有控制器的情况下,它们可能根本不会重新启动。