# 节点排水
#### 操作场景
您可以通过控制台、kubectl命令行或API使用节点排水功能，系统会将节点设置为不可调度，然后安全地将节点上所有符合[节点排水规则说明]的Pod驱逐，后续新建的Pod都不会再调度到该节点。
在节点故障场景下，该功能可帮助您快速排空节点，将故障节点进行隔离，原节点上被驱逐的Pod将会由工作负载controller转移到其他正常可调度的节点上。
![](https://support.huaweicloud.com/usermanual-cce/public_sys-resources/notice_3.0-zh-cn.png)
为保障排水期间业务可用性，建议为负载设置[干扰预算（Disruption Budget）](https://kubernetes.io/zh-cn/docs/tasks/run-application/configure-pdb/)，否则Pod重新调度期间负载功能可能无法正常使用。
#### 前提条件
- 您已创建一个集群，且集群版本满足以下要求：
  - v1.21集群：v1.21.10-r0及以上版本
  
  - v1.23集群：v1.23.8-r0及以上版本
  
  - v1.25集群：v1.25.3-r0及以上版本
  
  - v1.25以上版本集群
   
- 如果您通过IAM用户使用节点排水功能，至少需要具有以下一项权限，详情请参见[配置命名空间权限（Kubernetes RBAC授权）](https://support.huaweicloud.com/usermanual-cce/cce_10_0189.html)。
  - cluster-admin（管理员权限）：对全部命名空间下所有资源的读写权限。
  
  - drainage-editor：节点排水操作权限，可执行节点排水。
  
  - drainage-viewer：节点排水只读权限，仅可查看节点排水状态，无法执行节点排水。
   
 
 #### 节点排水规则说明
节点排水功能会安全驱逐节点上的Pod，但对于满足以下过滤规则的Pod，系统会进行例外处理：
| Pod筛选条件                                                                                                                   | 使用强制排水 | 不使用强制排水                                                                                                                                                |
|:---|:---|:---|
| Pod的[status.phase](https://kubernetes.io/zh-cn/docs/concepts/workloads/pods/pod-lifecycle/#pod-phase)字段为Succeeded或Failed | 删除    | 删除                                                                                                                                                      |
| Pod不受工作负载controller管理                                                                                                   | 删除     | 放弃排水                                                                                                                                                   |
| Pod由DaemonSet管理                                                                                                          | 忽略    | 放弃排水 说明： v1.23.18-r10、v1.25.16-r0、v1.27.16-r0、v1.28.13-r0、v1.29.8-r0、v1.30.4-r0及以上集群版本，由DaemonSet管理的Pod，在不使用强制排水时的默认操作为忽略。 |
| Pod中挂载了emptyDir类型的volume                                                                                                  | 驱逐     | 放弃排水                                                                                                                                                   |
| 由kubelet直接管理的[静态Pod](https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/static-pod/)                          | 忽略      | 忽略                                                                                                                                                     |
   
![](https://support.huaweicloud.com/usermanual-cce/public_sys-resources/note_3.0-zh-cn.png)
节点排水过程中可能会对Pod执行的操作如下：
- 删除：Pod会从当前节点上删除，不会重新调度至其他节点。
- 驱逐：Pod会从当前节点上删除，且会重新调度至其他节点。
- 忽略：Pod不会被驱逐或删除。
- 放弃排水：若节点上存在放弃排水的Pod，节点排水过程会中止，不会驱逐或删除任何Pod。
 
#### 节点排水操作
您可以参考以下方式进行节点排水。
- [通过控制台操作]
  1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称进入集群。
  
  2. 在集群控制台左侧导航栏中选择"节点管理"，切换至"节点"页签。
  
  3. 找到目标节点，单击节点后的"更多 \> 节点排水"。
  
  4. 在弹出的"节点排水"窗口中，进行排水设置。 
     - 超时时间（秒）：超过设定的时间后排水任务会自动失败，0表示不设置超时时间。
     
     - 强制排水：使用强制排水时，将忽略DaemonSet管理的Pod，但会删除挂载了emptyDir卷的Pod和不受controller管理的Pod。详情请参见[节点排水规则说明]。
     
     
     
     
  
  5. 单击"确定"，等待完成节点排水。
   
- [通过kubectl命令行操作]
  1. 请参见[通过kubectl连接集群](https://support.huaweicloud.com/usermanual-cce/cce_10_0107.html)，使用kubectl连接集群。
  
  2. 编辑Drainage资源的YAML。 
     Drainage-test.yaml示例如下：
     ```
     apiVersion: node.cce.io/v1
     kind: Drainage
     metadata:
       name: 192.168.1.67-1721616409999   #Drainage资源名称
     spec:
       nodeName: 192.168.1.67     #待排水节点的K8s名称，可以使用kubectl get node命令查询
       force: true
       timeout: 0
     ```
     - nodeName：表示待排水的节点，参数值为Kubernetes中的节点名称，而不是控制台上的节点名称。 Kubernetes中的节点名称可以使用**kubectl get node**命令查询。
       
     
     - force：是否使用强制排水。true表示使用强制排水，false表示不使用强制排水。
     
     - timeout：超时时间，单位为秒。超过设定的时间后排水任务会自动失败，0表示不设置超时时间。
     
     
     
     
  
  3. 创建Drainage资源。 
     ```
     kubectl create -f Drainage-test.yaml
     ```
     回显如下，表示Drainage资源创建成功：
     ```
     drainage.node.cce.io/192.168.1.67-1721616409999 created
     ```
     
     
  
  4. 查看结果。 
     ```
     kubectl get drainages 192.168.1.67-1721616409999 -o yaml
     ```
     回显如下，如果phase参数为Succeeded则为成功。
     ```
     apiVersion: node.cce.io/v1
     kind: Drainage
     metadata:
       creationTimestamp: "2024-07-22T03:12:56Z"
       generation: 1
       name: 192.168.1.67-1721616409999
       resourceVersion: "2683143"
       uid: 3ec131e4-0505-4c88-8255-ef9d0eb02712
     spec:
       force: true
       nodeName: 192.168.1.67
       timeout: 0
     status:
       conditions:
       - lastTransitionTime: "2024-07-22T03:12:56Z"
         message: start to drain node
         reason: Started
         status: "True"
         type: Started
       - lastTransitionTime: "2024-07-22T03:13:26Z"
         message: node has been drained
         reason: Succeeded
         status: "True"
         type: Finished
       phase: Succeeded
     ```
     
     
   
- [通过API操作]
  1. 获取集群所在区域的Token，获取方式请参见[获取Token](https://support.huaweicloud.com/api-cce/cce_02_0004.html)。
  
  2. 根据接口格式确定节点排水接口URL。 
     节点排水接口的URL为：
     ```
     https://{clusterid}.Endpoint/apis/node.cce.io/v1/drainages
     ```
     - **{clusterid}**：集群ID，可通过CCE控制台的"概览"页面查询。
     
     - **Endpoint** ：集群所在区域的终端节点。
       对应的值请参见[地区和终端节点](https://developer.huaweicloud.com/endpoint)。
       例如CCE服务在"华东-上海一"区域的Endpoint为"cce.cn-east-3.myhuaweicloud.com"
       
      
     
     
  
  3. 使用**POST** 请求方法，并设置请求Header参数。
     
     ```
     curl --location --request POST 'https://{clusterid}.Endpoint/apis/node.cce.io/v1/drainages' \
     --header 'Content-Type: application/json' \
     --header 'X-Auth-Token: MIIWvw******' \
     --data @Drainage.json
     ```
     请求中包含的Header参数如下：
     表1请求Header参数 
     | 参数             | 是否必选 | 参数类型      | 描述                                                                                           |
     |:---|:---|:---|:---|
     | Content-Type | 是   | String  | 消息体的类型（格式），例如application/json                                                               |
     | X-Auth-Token  | 是    | String | 使用Token调用接口，Token的获取方式请参见[获取Token](https://support.huaweicloud.com/api-cce/cce_02_0004.html)。 |
        
     其中Drainage.json为当前路径下的本地文件，内容如下：
     ```
     {
         "apiVersion": "node.cce.io/v1",
         "kind": "Drainage",
         "metadata": {
             "name": "192.168.1.67-1721616404940"
         },
         "spec": {
             "nodeName": "192.168.1.67",
             "force": true,
             "timeout": 0
         }
     }
     ```
     - nodeName：表示待排水的节点，参数值为Kubernetes中的节点名称，而不是控制台上的节点名称。 Kubernetes中的节点名称可以使用**kubectl get node**命令查询。
       
     
     - force：是否使用强制排水。true表示使用强制排水，false表示不使用强制排水。
     
     - timeout：超时时间，单位为秒。超过设定的时间后排水任务会自动失败，0表示不设置超时时间。
     
     
     
     
   
#### 取消节点排水
如果在排水过程中需要取消排水，可参考以下方式。
![](https://support.huaweicloud.com/usermanual-cce/public_sys-resources/note_3.0-zh-cn.png)
v1.23.16-r0、v1.25.11-r0、v1.27.8-r0、v1.28.6-r0、v1.29.2-r0及以上版本的集群中，节点排水支持取消。
该操作将中止节点上的排水流程，但已经从这些节点上迁移的工作负载不会自动迁移回来。
- [通过控制台操作]
  1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称进入集群。
  
  2. 在集群控制台左侧导航栏中选择"节点管理"，切换至"节点"页签。
  
  3. 找到处于"排水中"状态的节点，单击"取消排水"。
  
  4. 在确认框中单击"确定"，节点变成"排水已取消"状态，您可以单击"开启调度"，将节点恢复可调度状态。
   
- [通过kubectl命令行操作]
  1. 请参见[通过kubectl连接集群](https://support.huaweicloud.com/usermanual-cce/cce_10_0107.html)，使用kubectl连接集群。
  
  2. 查询Drainage资源。 
     ```
     kubectl get drainages
     ```
     回显如下：
     ```
     NAME                         AGE
     192.168.1.67-1721616409999   13s
     ```
     
     
  
  3. 取消排水。 
     ```
     kubectl annotate drainages 192.168.1.67-1721616409999 node.cce.io/drainage-disable=true
     ```
     
     
  
  4. 查看结果。 
     ```
     kubectl get drainages 192.168.1.67-1721616409999 -o yaml
     ```
     回显如下，此时phase参数为Cancelled。
     ```
     apiVersion: node.cce.io/v1
     kind: Drainage
     metadata:
       annotations:
         node.cce.io/drainage-disable: "true"
       creationTimestamp: "2024-07-22T03:12:56Z"
       generation: 1
       name: 192.168.1.67-1721616409999
       resourceVersion: "2689858"
       uid: 3ec131e4-0505-4c88-8255-ef9d0eb02712
     spec:
       force: true
       nodeName: 192.168.1.67
       timeout: 0
     status:
       conditions:
       - lastTransitionTime: "2024-07-22T03:12:56Z"
         message: start to drain node
         reason: Started
         status: "True"
         type: Started
       - lastTransitionTime: "2024-07-22T03:13:26Z"
         message: node has been drained
         reason: Succeeded
         status: "True"
         type: Finished
       - lastTransitionTime: "2024-07-22T03:37:48Z"
         message: node drainage has been cancelled
         reason: Cancelled
         status: "True"
         type: Cancelled
       phase: Cancelled
     ```
     
     
   
- [通过API操作]
  1. 获取集群所在区域的Token，获取方式请参见[获取Token](https://support.huaweicloud.com/api-cce/cce_02_0004.html)。
  
  2. 根据接口格式确定节点排水接口URL。 
     取消节点排水接口的URL为：
     ```
     https://{clusterid}.Endpoint/apis/node.cce.io/v1/drainages/{drainageName}
     ```
     - **{clusterid}**：集群ID，可通过CCE控制台的"概览"页面查询。
     
     - **Endpoint** ：集群所在区域的终端节点。
       对应的值请参见[地区和终端节点](https://developer.huaweicloud.com/endpoint)。
       例如CCE服务在"华东-上海一"区域的Endpoint为"cce.cn-east-3.myhuaweicloud.com"
       
     
     - **{drainageName}** ：Drainage资源的名称。Drainage资源名称可以使用**kubectl get drainages**命令查询。
      
     
     
  
  3. 使用**PATCH** 请求方法，并设置请求Header参数。
     
     ```
     curl --location --request PATCH 'https://{clusterid}.Endpoint/apis/node.cce.io/v1/drainages/{drainageName}' \
     --header 'Content-Type: application/merge-patch+json' \
     --header 'X-Auth-Token: MIIWvw******' \
     --data @Drainage-cancel.json
     ```
     请求中包含的Header参数如下：
     表2请求Header参数 
     | 参数            | 是否必选 | 参数类型   | 描述                                                                                               |
     |:---|:---|:---|:---|
     | Content-Type | 是   | String | 消息体的类型（格式），使用PATCH方式时参数值为application/merge-patch+json。                                           |
     | X-Auth-Token  | 是   | String  | 使用Token调用接口，Token的获取方式请参见[获取Token](https://support.huaweicloud.com/api-cce/cce_02_0004.html)。 |
        
     其中Drainage-cancel.json为当前路径下的本地文件，内容如下：
     ```
     {
         "metadata": {
             "annotations": {
                 "node.cce.io/drainage-disable": "true"
             }
         }
     }
     ```
     
     
   
