
# 如何驱逐节点上的所有Pod？
您可使用**kubectl drain**命令从节点安全地逐出所有Pod。
![](https://support.huaweicloud.com/cce_faq/public_sys-resources/note_3.0-zh-cn.png)
默认情况下，**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文档](https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#drain)。
