安全地清空一个节点
本页展示了如何在确保PodDisruptionBudget的前提下,安全地清空一个节点。
在开始之前
您的Kubernetes服务器必须是1.5版或更高版本。要检查版本,请输入kubectlversion。
此任务假定你已经满足了以下先决条件:
(可选)配置干扰预算
为了确保你的负载在维护期间仍然可用,你可以配置一个PodDisruptionBudget。如果可用性对于正在清空的该节点上运行或可能在该节点上运行的任何应用程序很重要,首先配置一个PodDisruptionBudgets并继续遵循本指南。
使用kubectldrain从服务中删除一个节点
在对节点执行维护(例如内核升级、硬件维护等)之前,可以使用kubectldrain从节点安全地逐出所有Pods。安全的驱逐过程允许Pod的容器体面地终止,并确保满足指定的PodDisruptionBudgets。
Note:默认情况下,kubectldrain将忽略节点上不能杀死的特定系统Pod;有关更多细节,请参阅kubectldrain文档。
kubectldrain的成功返回,表明所有的Pods(除了上一段中描述的被排除的那些),已经被安全地逐出(考虑到期望的终止宽限期和你定义的PodDisruptionBudget)。然后就可以安全地关闭节点,比如关闭物理机器的电源,如果它运行在云平台上,则删除它的虚拟机。
首先,确定想要清空的节点的名称。可以用以下命令列出集群中的所有节点:
kubectl get nodes
接下来,告诉Kubernetes清空节点:
kubectl drain
一旦它返回(没有报错),你就可以下线此节点(或者等价地,如果在云平台上,删除支持该节点的虚拟机)。如果要在维护操作期间将节点留在集群中,则需要运行:
kubectl uncordon
然后告诉Kubernetes,它可以继续在此节点上调度新的Pods。
并行清空多个节点
kubectldrain命令一次只能发送给一个节点。但是,你可以在不同的终端或后台为不同的节点并行地运行多个kubectldrain命令。同时运行的多个drain命令仍然遵循你指定的PodDisruptionBudget。
例如,如果你有一个三副本的StatefulSet,并设置了一个PodDisruptionBudget,指定minAvailable:2。如果所有的三个Pod均就绪,并且你并行地发出多个drain命令,那么kubectldrain只会从StatefulSet中逐出一个Pod,因为Kubernetes会遵守PodDisruptionBudget并确保在任何时候只有一个Pod不可用(最多不可用Pod个数的计算方法:replicas-minAvailable)。任何会导致就绪副本数量低于指定预算的清空操作都将被阻止。
驱逐API
如果你不喜欢使用kubectldrain(比如避免调用外部命令,或者更细化地控制pod驱逐过程),你也可以用驱逐API通过编程的方式达到驱逐的效果。