节点排水
操作场景
您可以通过控制台使用节点排水功能,系统会将节点设置为不可调度,然后安全地将节点上所有符合节点排水规则说明的Pod驱逐,后续新建的Pod都不会再调度到该节点。
在节点故障等场景下,该功能可帮助您快速排空节点,将故障节点进行隔离,原节点上被驱逐的Pod将会由工作负载controller转移到其他正常可调度的节点上。
为保障排水期间业务可用性,建议为负载设置干扰预算(Disruption Budget),否则Pod重新调度期间负载功能可能无法正常使用。
前提条件
- 您已创建一个集群,且集群版本满足以下要求:
- v1.21集群:v1.21.10-r0及以上版本
- v1.23集群:v1.23.8-r0及以上版本
- v1.25集群:v1.25.3-r0及以上版本
- v1.25以上版本集群
- 如果您通过IAM用户使用节点排水功能,至少需要具有以下一项权限,详情请参见命名空间权限(Kubernetes RBAC授权)。
- cluster-admin(管理员权限):对全部命名空间下所有资源的读写权限。
- drainage-editor:节点排水操作权限,可执行节点排水。
- drainage-viewer:节点排水只读权限,仅可查看节点排水状态,无法执行节点排水。
节点排水规则说明
节点排水功能会安全驱逐节点上的Pod,但对于满足以下过滤规则的Pod,系统会进行例外处理:
Pod筛选条件 |
使用强制排水 |
不使用强制排水 |
---|---|---|
Pod的status.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 |
忽略 |
忽略 |
节点排水过程中可能会对Pod执行的操作如下:
- 删除:Pod会从当前节点上删除,不会再重新调度至其他节点。
- 驱逐:Pod会从当前节点上删除,且会重新调度至其他节点。
- 忽略:Pod不会被驱逐或删除。
- 放弃排水:若节点上存在放弃排水的Pod,节点排水过程会中止,不会驱逐或删除任何Pod。
节点排水操作
您可以参考以下方式进行节点排水。
- 登录CCE控制台,单击集群名称进入集群。
- 在集群控制台左侧导航栏中选择“节点管理”,切换至“节点”页签。
- 找到目标节点,单击节点后的“更多 > 节点排水”。
- 在弹出的“节点排水”窗口中,进行排水设置。
- 超时时间(秒):超过设定的时间后排水任务会自动失败,0表示不设置超时时间。
- 强制排水:使用强制排水时,将忽略DaemonSet管理的Pod,但会删除挂载了emptyDir卷的Pod和不受controller管理的Pod。详情请参见节点排水规则说明。
- 单击“确定”,等待完成节点排水。
- 请参见通过kubectl连接集群,使用kubectl连接集群。
- 编辑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
- 创建Drainage资源。
kubectl create -f Drainage-test.yaml
回显如下,表示Drainage资源创建成功:
drainage.node.cce.io/192.168.1.67-1721616409999 created
- 查看结果。
kubectl get drainages 192.168.1.67-1721616409999 -o yaml
回显如下,如果phase参数为Successded则为成功。
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
- 获取集群所在区域的Token,获取方式请参见获取Token。
- 根据接口格式确定节点排水接口URL。
节点排水接口的URL为:
https://{clusterid}.Endpoint/apis/node.cce.io/v1/drainages
- {clusterid}:集群ID,可通过CCE控制台的“总览”页面查询。
- Endpoint:集群所在区域的终端节点。
对应的值请参见地区和终端节点。
例如CCE服务在“华东-上海一”区域的Endpoint为“cce.cn-east-3.myhuaweicloud.com”
- 使用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。
其中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 } }
取消节点排水
如果在排水过程中需要取消排水,可参考以下方式。
v1.23.16-r0、v1.25.11-r0、v1.27.8-r0、v1.28.6-r0、v1.29.2-r0及以上版本的集群中,节点排水支持取消。
该操作将中止节点上的排水流程,但已经从这些节点上迁移的工作负载不会自动迁移回来。
- 登录CCE控制台,单击集群名称进入集群。
- 在集群控制台左侧导航栏中选择“节点管理”,切换至“节点”页签。
- 找到处于“排水中”状态的节点,单击“取消排水”。
- 在确认框中单击“确定”,节点变成“已取消排水”状态,您可以单击“开启调度”,将节点恢复可调度状态。
- 请参见通过kubectl连接集群,使用kubectl连接集群。
- 查询Drainage资源。
kubectl get drainages
回显如下:NAME AGE 192.168.1.67-1721616409999 13s
- 取消排水。
kubectl annotate drainages 192.168.1.67-1721616409999 node.cce.io/drainage-disable=true
- 查看结果。
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
- 获取集群所在区域的Token,获取方式请参见获取Token。
- 根据接口格式确定节点排水接口URL。
取消节点排水接口的URL为:
https://{clusterid}.Endpoint/apis/node.cce.io/v1/drainages/{drainageName}
- {clusterid}:集群ID,可通过CCE控制台的“总览”页面查询。
- Endpoint:集群所在区域的终端节点。
对应的值请参见地区和终端节点。
例如CCE服务在“华东-上海一”区域的Endpoint为“cce.cn-east-3.myhuaweicloud.com”
- {drainageName}:Drainage资源的名称。Drainage资源名称可以使用kubectl get drainages命令查询。
- 使用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。
其中Drainage-cancel.json为当前路径下的本地文件,内容如下:
{ "metadata": { "annotations": { "node.cce.io/drainage-disable": "true" } } }