如何驱逐节点上的所有Pod

使用 kubectl drain 命令从节点安全地逐出所有 Pod。

说明:

默认情况下,kubectl drain 命令会保留某些系统级 Pod 不被驱逐,例如 everest-csi-driver。

  1. 使用 kubectl 连接集群。

  2. 查看集群中的节点。

  3. 选择一个节点,查看节点上存在的所有 Pod。

    1
    kubectl get pod --all-namespaces -owide --field-selector spec.nodeName=192.168.0.160

    驱逐前该节点上的 Pod 如下:

    1
    2
    3
    4
    5
    6
    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>
  4. 驱逐该节点上的所有 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
  5. 驱逐成功后,该节点被自动标记为不可调度,即该节点将会被打上 node.kubernetes.io/unschedulable = : NoSchedule 的污点。

    驱逐后该节点上的 Pod 如下,节点上仅保留了不可驱逐的系统级 Pod。

    1
    2
    3
    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 文档