更新时间:2024-10-14 GMT+08:00

如何驱逐节点上的所有Pod?

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

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

  1. 使用kubectl连接集群。
  2. 查看集群中的节点。

    kubectl get node

  3. 选择一个节点,查看节点上存在的所有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>

  4. 驱逐该节点上的所有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

  5. 驱逐成功后,该节点被自动标记为不可调度,即该节点将会被打上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文档