如何驱逐节点上的所有Pod
使用 kubectl drain 命令从节点安全地逐出所有 Pod。
说明:
默认情况下,kubectl drain 命令会保留某些系统级 Pod 不被驱逐,例如 everest-csi-driver。
使用 kubectl 连接集群。
查看集群中的节点。
选择一个节点,查看节点上存在的所有 Pod。
1
kubectl get pod --all-namespaces -owide --field-selector spec.nodeName=192.168.0.160
驱逐前该节点上的 Pod 如下:
1
2
3
4
5
6NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
default nginx-5bcc57c74b-lgcvh 1/1 Running 0 7m25s 10.0.0.140 192.168.0.160 <none> <none>
kube-system coredns-6fcd88c4c-97p6s 1/1 Running 0 3h16m 10.0.0.138 192.168.0.160 <none> <none>
kube-system everest-csi-controller-56796f47cc-99dtm 1/1 Running 0 3h16m 10.0.0.139 192.168.0.160 <none> <none>
kube-system everest-csi-driver-dpfzl 2/2 Running 2 12d 192.168.0.160 192.168.0.160 <none> <none>
kube-system icagent-tpfpv 1/1 Running 1 12d 192.168.0.160 192.168.0.160 <none> <none>驱逐该节点上的所有 Pod。
1
kubectl drain 192.168.0.160
如果节点上存在绑定了本地存储的 Pod 或是一些守护进程集管理的 Pod,将提示 “error: unable to drain node “192.168.0.160”, aborting command…”。驱逐命令将不会生效,您可在上述命令后面添加如下参数进行强制驱逐:
- –delete-emptydir-data:强制驱逐节点上绑定了本地存储的 Pod,例如 coredns。
- –ignore-daemonsets:强制驱逐节点上的守护进程集 Pod,例如 everest-csi-controller。
示例中节点上存在绑定本地存储的 Pod 和守护进程集 Pod,因此驱逐命令如下:
1
kubectl drain 192.168.0.160 --delete-emptydir-data --ignore-daemonsets
驱逐成功后,该节点被自动标记为不可调度,即该节点将会被打上 node.kubernetes.io/unschedulable = : NoSchedule 的污点。
驱逐后该节点上的 Pod 如下,节点上仅保留了不可驱逐的系统级 Pod。
1
2
3NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
kube-system everest-csi-driver-dpfzl 2/2 Running 2 12d 192.168.0.160 192.168.0.160 <none> <none>
kube-system icagent-tpfpv 1/1 Running 1 12d 192.168.0.160 192.168.0.160 <none> <none>
相关操作
kubectl 的 drain、cordon 和 uncordon 操作:
- drain:从节点安全地逐出所有 Pod,并将该节点标记为不可调度。
- cordon:将节点标记为不可调度,即该节点将会被打上 node.kubernetes.io/unschedulable = : NoSchedule 的污点。
- uncordon:将节点标记为可调度。
更多说明请参考 kubectl 文档。