


有时候可能会在生产环境中的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
# 删除节点
kubectl delete node node-name
# 这时候把需要做的事情做一下。比如上面说的更改docker文件daemon.json或者说node节点故障需要进行的处理操作
# 然后恢复node,恢复接收新的pod进程
kubectl uncordon [node-name]
drain参数解释:
--force:
不加force参数只会删除该NODE上由ReplicationController, ReplicaSet, DaemonSet,StatefulSet or Job创建的Pod。加了后还会删除'裸奔的pod'(没有绑定到任何replication controller)。即当一些pod不是经 ReplicationController, ReplicaSet, Job, DaemonSet 或者 StatefulSet 管理的时候就需要用--force来强制执行 (例如:kube-proxy)。
--ignore-daemonsets:
忽略DaemonSet管理下的Pod。如果不忽略,deamonset控制器控制的pod被删除后可能马上又在此节点上启动起来,会成为死循环。
--delete-local-data:
即使pod使用了emptyDir也删除。如果有mount local volumn的pod,会强制杀掉该pod并把数据清除掉。另外如果跟本身的配置讯息有冲突时,drain就不会执行。
例如你在一个运行了三个replica的statefulSet中设定了PodDisruptionBudget,而minAvaliability又设成了2,当正在运行的pod数量等于或者少于2的时候,drain就会停止执行。
另外推荐两个博客:
https://www.cnblogs.com/kevingrace/p/11302555.html https://www.cnblogs.com/hh2737/p/9070596.html
官方文档:https://kubernetes.io/docs/tasks/administer-cluster/safely-drain-node/
完
------------------------------------------------------
公众号:竹下侯小姜运维
个人博客:https://www.ayunw.cn
重要的事情认真做,普通的事情规范做!
------------------------------------------------------
不定期更新优质内容,技术干货!如果觉得对你有帮助,请扫描下方二维码关注!

温馨提示
如果你喜欢本文,请分享到朋友圈,想要获得更多信息,请关注我!




