使用 kubectl drain 从集群中移除节点
使用 kubectl drain 从集群中移除节点
对节点执行维护操作之前(例如:内核升级,硬件维护等),您可以使用 kubectl drain
安全驱逐节点上面所有的 pod。安全驱逐的方式将会允许 pod 里面的容器遵循指定的 PodDisruptionBudgets
执行优雅的中止。
注: 默认情况下,kubectl drain
会忽略那些不能杀死的系统类型的 pod,如果您想了解更多详细的内容,请参考kubectl drain
kubectl drain
返回成功表明所有的 pod (除了前面排除的那些)已经被安全驱逐(遵循期望优雅的中止期,并且没有违反任何应用程序级别的中断预算)。然后,通过对物理机断电或者在云平台上删除节点所在的虚拟机,都能安全的将节点移除。
首先,需要确定希望移除的节点的名称。您可以通过下面命令列出集群里面所有的节点:
kubectl get nodes
接下来,告知 Kubernetes 移除节点:
kubectl drain <node name>
执行完成后,如果没有任何错误返回,您可以关闭节点(如果是在云平台上,可以删除支持该节点的虚拟机)。如果在维护操作期间想要将节点留在集群,那么您需要运行下面命令:
kubectl uncordon <node name>
然后,它将告知 Kubernetes 允许调度新的 pod 到该节点。
example
设置node不可调度
$kubectl cordon 172.16.21.26
$ kubectl drain foo --force
$ kubectl drain foo --grace-period=900
$ kubectl drain 172.16.21.26 --delete-local-data --ignore-daemonsets --force
参数说明:
–delete-local-data: 即使pod使用了emptyDir也删除
–ignore-daemonsets: 忽略deamonset控制器的pod,如果不忽略,deamonset控制器控制的pod被删除后可能马上又在此节点上启动起来,会成为死循环;
–force: 不加force参数只会删除该NODE上由ReplicationController, ReplicaSet, DaemonSet,StatefulSet or Job创建的Pod,加了后还会删除’裸奔的pod’(没有绑定到任何replication controller)
--pod-selector="" Label selector to filter pods on the node;按标签过滤掉不驱逐得pod
-l, --selector="" Selector (label query) to filter on
--skip-wait-for-delete-timeout=0 If pod DeletionTimestamp older than N seconds, skip waiting for the pod. Seconds must be greater than 0 to skip.
--timeout=0s The length of time to wait before giving up, zero means infinite
观察pod重建情况后,对节点进行维护操作。
维护结束后对节点重新配置可以调度。
kubectl uncordon 172.16.21.26
现在学习还不晚;
分类: k8s,kubernetes
时来天地皆同力,运去英雄不自由