k8s中清空一个node上所有pod

有时候可能会在生产环境中的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 po

# 命令node节点开始释放所有pod,并且不接收新的pod进程
kubectl drain [node-name] --force --ignore-daemonsets --delete-local-data

# 这时候把需要做的事情做一下。比如上面说的更改docker文件daemon.json或者说node节点故障需要进行的处理操作

# 然后恢复node,恢复接收新的pod进程
kubectl uncordon [node-name]
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就会停止执行

 

版权声明:
作者:allenjol
链接:https://www.ayunw.cn/archives/533
来源:爱生活,爱运维
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>