暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

k8s之驱逐node上的pod

云原生小记 2020-06-08
2421


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

重要的事情认真做,普通的事情规范做!

------------------------------------------------------

不定期更新优质内容,技术干货!如果觉得对你有帮助,请扫描下方二维码关注!

温馨提示

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

文章转载自云原生小记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论