有时候可能会在生产环境中的k8s的node节点对docker文件daemon.json进行更改并且重启或者node节点出现其他故障,但是该node节点上有很多pod还在跑着,这时候就需要用到drain和uncordon两个命令
drain:释放排空node上所有pod,并且不接收新的pod进程
uncordon:恢复node,恢复接收新的pod进程
kubectl drain在对节点执行维护之前,可以使用从节点安全地逐出所有pod.安全驱逐允许pod的容器优雅地终止并且将遵守您指定的PodDisruptionBudgets.
注意:默认情况下,kubectl drain将忽略节点上无法杀死的某些系统窗格; 有关更多详细信息,请参阅kubectl drain文档.
当kubectl drain成功返回时,表示所有pod(除了前一段中所述排除的那些)已被安全驱逐(尊重所需的正常终止期,并且不违反任何应用程序级别的中断SLO).然后通过关闭其物理机器来关闭节点是安全的,或者如果在云平台上运行,则删除其虚拟机.
一般流程:
确定要排空的节点的名称
kubectl get nodes
查看获取pod名字
kubectl get pods
#命令node节点开始释放所有pod,并且不接收新的pod进程
kubectl drain [node-name] --force --ignore-daemonsets --delete-local-data
#这时候把需要做的事情做一下。比如上面说的更改docker文件daemon.json或者说node节点故障需要进行的处理操作
#然后恢复node,恢复接收新的pod进程
kubectl uncordon [node-name]
kubectl get nodes
#查看获取pod名字
kubectl get pods
drain的参数
–force
当一些pod不是经 ReplicationController, ReplicaSet, Job, DaemonSet 或者 StatefulSet 管理的时候
就需要用–force来强制执行 (例如:kube-proxy)
–ignore-daemonsets
无视DaemonSet管理下的Pod
–delete-local-data
如果有mount local volumn的pod,会强制杀掉该pod并把料清除掉
另外如果跟本身的配置讯息有冲突时,drain就不会执行
例如
你在一个运行了三个replica的statefulSet中设定了PodDisruptionBudget,而minAvaliability又设成了2,当正在运行的pod数量等于或者少于2的时候,drain就会停止执行.
在master 执行
1, 不可调度
kubectl cordon k8s-node-1
kubectl uncordon k8s-node-1 #取消
2,驱逐已经运行的业务容器
kubectl drain --ignore-daemonsets k8s-node-1
3,如果想删除node 节点,则进行这个步骤
kubectl delete node k8s-node-1