如何驱逐节点上的所有Pod?
您可使用kubectl drain命令从节点安全地逐出所有Pod。
默认情况下,kubectl drain命令会保留某些系统级Pod不被驱逐,例如everest-csi-driver。
- 使用kubectl连接集群。
- 查看集群中的节点。
kubectl get node
- 选择一个节点,查看节点上存在的所有Pod。
kubectl get pod --all-namespaces -owide --field-selector spec.nodeName=192.168.0.160
驱逐前该节点上的Pod如下:
NAMESPACE 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。
kubectl drain 192.168.0.160
如果节点上存在绑定了本地存储的Pod或是一些守护进程集管理的Pod,将提示“error: unable to drain node "192.168.0.160" due to error: cannot delete DaemonSet-managed Pods...”。驱逐命令将不会生效,您可在上述命令后面添加如下参数进行强制驱逐:
- --delete-emptydir-data:强制驱逐节点上绑定了本地存储的Pod,例如coredns。
- --ignore-daemonsets:忽略节点上的守护进程集Pod,例如everest-csi-driver。
示例中节点上存在绑定本地存储的Pod和守护进程集Pod,因此驱逐命令如下:
kubectl drain 192.168.0.160 --delete-emptydir-data --ignore-daemonsets
- 驱逐成功后,该节点被自动标记为不可调度,即该节点将会被打上node.kubernetes.io/unschedulable = : NoSchedule的污点。
驱逐后该节点上的Pod如下,节点上仅保留了不可驱逐的系统级Pod。
NAMESPACE 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文档。