
# 故障GPU的Pod自动驱逐功能
GPU卡故障是指由于硬件损坏、驱动异常、通信失败或环境因素等原因，导致GPU无法正常提供计算服务的现象。当GPU卡发生故障时，可能导致Pod启动失败、任务中断、资源浪费等问题，对AI任务和高性能应用影响尤为显著。为了最小化GPU卡故障对业务的影响，CCE提供了故障GPU的Pod自动驱逐功能。开启该功能后，如果CCE AI套件（NVIDIA GPU）插件检测到特定的GPU故障场景，则可以将具有特定标签的Pod驱逐，驱逐后的Pod将由用户或控制器决定是否重建并调度。这有助于降低业务中断时间，提升系统稳定性。
#### 前提条件
- 已有Standard/Turbo集群，且版本在v1.27及以上。
- 集群中已有正常运行的NVIDIA GPU节点。
- 集群中已安装CCE AI套件（NVIDIA GPU）插件，插件版本要求如下：
  - 集群版本为v1.27时，插件版本在2.2.1及以上。
  
  - 集群版本为v1.28及以上时，插件版本在2.8.1及以上。
   
 
#### 约束与限制
- 开启故障GPU的Pod自动驱逐功能后，仅当CCE AI套件（NVIDIA GPU）插件检测到**特定类型的GPU故障** 时，才会触发自动驱逐Pod的机制。此外，不同故障类型的隔离策略不同，Pod的后续调度行为将根据故障GPU的隔离策略而定，具体如下。支持自动驱逐Pod的GPU故障类型以及各故障类型对应的隔离策略的详细信息，请参见[表1](https://support.huaweicloud.com/usermanual-cce/cce_10_0779.html#cce_10_0779__table15501153312715)。
  - **若故障发生后，系统对GPU卡进行隔离**（包括单点故障的GPU设备隔离和故障GPU节点的GPU设备隔离）：在GPU卡恢复为正常状态之前，Pod被驱逐后不会再次调度到该卡上，以防止业务反复受到影响。
  
  - **若故障发生后，系统不对GPU卡进行隔离**：Pod被驱逐后在后续调度中仍可能再次分配到该卡上。
   
- 故障GPU的Pod自动驱逐功能仅适用于使用整卡调度和共享模式的Pod，暂不支持驱逐使用GPU虚拟化模式的Pod。
 
#### 操作流程
| 操作步骤                                                                                                                     | 步骤说明                                                                                                                                                                                                                                                    |
|:---|:---|
| [步骤一：开启故障GPU的Pod自动驱逐功能](https://support.huaweicloud.com/usermanual-cce/cce_10_1023.html#cce_10_1023__section29015591454) | 在使用Pod自动驱逐功能时，需先在CCE AI套件（NVIDIA GPU）插件的device-plugin组件中启用对应开关。                                                                                                                                                                                         |
| [步骤二：部署具有指定驱逐标签的工作负载](https://support.huaweicloud.com/usermanual-cce/cce_10_1023.html#cce_10_1023__section870965964213)  | 开启故障GPU的Pod自动驱逐功能后，当检测到相关故障时，系统会将带有特定标签的Pod驱逐。因此，部署工作负载时需提前为Pod添加指定标签，以确保其能在故障发生时被正确识别并触发驱逐机制。                                                                                                                                                          |
| [步骤三：验证Pod是否能够被驱逐](https://support.huaweicloud.com/usermanual-cce/cce_10_1023.html#cce_10_1023__section168432025171215)  | 当故障发生时可以通过故障GPU所在节点的事件，验证Pod是否能够被驱逐。                                                                                                                                                                                                                    |
| [其他操作](https://support.huaweicloud.com/usermanual-cce/cce_10_1023.html#cce_10_1023__section1052543215233)                | **非必选操作，请结合需求进行配置**。 您可以根据业务需求，自定义哪些Xid错误类型属于"严重错误"，哪些属于"应用引发的错误"，二者不能重复。其中"严重错误"会对GPU卡进行隔离，而"应用引发的错误"则不会对GPU卡进行隔离。 Xid严重错误默认为74和79，Xid应用引发的错误默认为13、31、43、45、68和137。 |
   
 #### 步骤一：开启故障GPU的Pod自动驱逐功能
在使用Pod自动驱逐功能时，需首先在CCE AI套件（NVIDIA GPU）插件的device-plugin组件中启用对应开关，具体步骤如下：
1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称，进入集群"概览页"。
2. 在左侧导航栏中选择"插件中心"，在右侧找到CCE AI套件（NVIDIA GPU）插件，单击"编辑"。
3. 在"编辑插件"页面上方，单击"编辑YAML"。将YAML文件中的"**enable_pod_eviction_on_gpu_error** "值设置为true，以开启故障GPU的Pod自动驱逐功能。
   
   ```
   ...
   custom:
         annotations: {}
         compatible_with_legacy_api: false
         component_schedulername: kube-scheduler
         disable_mount_path_v1: false
         disable_nvidia_gsp: true
         driver_mount_paths: bin,lib64
         enable_fault_isolation: true
         enable_health_monitoring: true
         enable_metrics_monitoring: true
         enable_simple_lib64_mount: true
         enable_xgpu: false
         enable_xgpu_burst: false
         gpu_driver_config: {}
         health_check_xids_v2: 74,79    # 与Xid应用引发的错误不能重复
         install_nvidia_peermem: false
         is_driver_from_nvidia: true
         enable_pod_eviction_on_gpu_error: true 
   ...
   ```
   - **enable_pod_eviction_on_gpu_error** 用于控制是否开启故障GPU的Pod自动驱逐功能，取值如下：
     - true：表示开启故障GPU的Pod自动驱逐功能。
     
     - false：默认值，表示不开启故障GPU的Pod自动驱逐功能。
      
   
   
   
   
4. 配置完成后，在右下角单击"确定"。此时，CCE AI套件（NVIDIA GPU）插件将自动升级，待插件状态变为"运行中"后，故障GPU的Pod自动驱逐功能即可生效。
 
 #### 步骤二：部署具有指定驱逐标签的工作负载
开启故障GPU的Pod自动驱逐功能后，当检测到相关故障时，系统会将带有特定标签的Pod驱逐。因此，部署工作负载时需提前为Pod添加指定标签，以确保其能在故障发生时被正确识别并触发驱逐机制。
- [控制台方式]
  1. 返回[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称进入集群。在左侧导航栏单击"工作负载"，右上角单击"创建工作负载"。
  
  2. 在"容器配置 \> 基本信息 \>GPU配额"中选择"GPU整卡"或"共享模式"，并设置对应参数。 
     - GPU整卡：表示GPU整卡调度，即该容器将独立使用GPU卡，系统不会将该卡划分给其他容器使用。
     
     - 共享模式：表示GPU共享调度，即多个容器可共享同一张物理GPU卡的计算资源和显存。
     
     
     图1GPU整卡   
     ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002347063006.png "点击放大")
     
     
     
  
  3. 在"高级配置\>标签与注解"中，增加标签"**evict_on_gpu_error=true** "。插件检测到GPU故障时，会对故障GPU上带有此标签的Pod下发驱逐命令。
     
     图2增加驱逐标签   
     ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002380753253.png "点击放大")
     
     
     
  
  4. 其他参数请参考[创建工作负载](https://support.huaweicloud.com/usermanual-cce/cce_10_0673.html)进行配置。参数配置完成后，在右下角单击"创建工作负载"。待工作负载变为运行中后，则表示创建成功。
   
- [kubectl命令行方式]
  以Job为例，**其他类型工作负载在相同位置添加相同标签即可**。
  1. 登录客户端机器，并[通过kubectl连接集群](https://support.huaweicloud.com/usermanual-cce/cce_10_0107.html)。
  
  2. 执行以下命令，创建一个YAML文件，用于创建需要具有指定驱逐标签的Job。 
     ```
     vim k8-job.yaml
     ```
     文件内容如下，为负载添加驱逐标签**evict_on_gpu_error: "true"**。
     ```
     apiVersion: batch/v1
     kind: Job
     metadata:
       name: k8-job
     spec:
       completions: 2
       parallelism: 2
       template:
         metadata:                         # 手动为负载添加特定标签。
           labels:                         
             evict_on_gpu_error: "true"   # 插件检测到GPU故障时，会对故障GPU上带有此标签的Pod下发驱逐命令
         spec:
           restartPolicy: Never
           schedulerName: volcano
           containers:
             - name: k8-job
               image: pytorch:latest  # 替换为您镜像
               imagePullPolicy: IfNotPresent
               command: ["/bin/bash", "-c", "python /etc/scripts/run.py"]  # 替换为您的应用命令
               resources:
                 limits:
                   nvidia.com/gpu: 1
                 requests:
                   nvidia.com/gpu: 1
     ```
     
     
  
  3. 执行以下命令，创建工作负载。 
     ```
     kubectl apply -f k8-job.yaml
     ```
     回显结果如下，则说明工作负载已创建。
     ```
     job.batch/k8-job created
     ```
     
     
  
  4. 执行以下命令，查看Pod是否创建成功。 
     ```
     kubectl get pod -n default
     ```
     回显结果如下，状态皆为Running，则说明创建成功。
     ```
     NAME                      READY   STATUS        RESTARTS   AGE
     k8-job1-jdjbb             1/1     Running       0          28s
     k8-job1-pr5m4             1/1     Running       0          28s
     ```
     
     
   
 #### 步骤三：验证Pod是否能够被驱逐
当故障发生时可以通过故障GPU所在节点的事件，验证Pod是否能够被驱逐。
1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称，进入集群"概览页"。
2. 在左侧导航栏单击"节点列表，右侧切换至"节点"页签。
3. 在故障GPU所在节点的操作列，单击"事件"。若出现如下事件，则说明相关Pod驱逐成功。 
   图3Pod驱逐事件   
   ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002366990893.png "点击放大")
   
   
   
 
 #### 其他操作
Xid严重错误默认为74和79，Xid应用引发的错误默认为13、31、43、45、68和137。您可以根据业务需求，自定义哪些Xid错误类型属于"严重错误"，哪些属于"应用引发的错误"，二者不能重复。其中"严重错误"会对GPU卡进行隔离，而"应用引发的错误"则不会对GPU卡进行隔离。
**该操作非必选项，请结合需求进行配置。**
#### 配置Xid严重错误
1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称，进入集群"概览页"。
2. 在左侧导航栏中选择"插件中心"，在右侧找到CCE AI套件（NVIDIA GPU）插件，单击"编辑"。
3. 在"编辑插件"页面上方，单击"编辑YAML"。 
   ```
   ...
   custom:
         annotations: {}
         compatible_with_legacy_api: false
         component_schedulername: kube-scheduler
         disable_mount_path_v1: false
         disable_nvidia_gsp: true
         driver_mount_paths: bin,lib64
         enable_fault_isolation: true
         enable_health_monitoring: true
         enable_metrics_monitoring: true
         enable_simple_lib64_mount: true
         enable_xgpu: false
         enable_xgpu_burst: false
         gpu_driver_config: {}
         health_check_xids_v2: 74,79    # 与Xid应用引发的错误不能重复
         install_nvidia_peermem: false
         is_driver_from_nvidia: true
         enable_pod_eviction_on_gpu_error: true 
   ...
   ```
   - **health_check_xids_v2** 用于确定哪些Xid错误属于"Xid严重错误"，您可以自定义配置，不能与"Xid应用引发的错误"重复。**不配置时，默认为"74,79"** 。
     常见的Xid错误已整理在[GPU Xid常见错误](https://support.huaweicloud.com/usermanual-cce/cce_10_0779.html#cce_10_0779__section18656161533819)中，更多Xid错误信息请参见[Nvidia Xid Error](https://docs.nvidia.com/deploy/xid-errors/index.html)。
     
   
   
   
   
4. 配置完成后，在右下角单击"确定"。此时，CCE AI套件（NVIDIA GPU）插件将自动升级，待插件状态变为"运行中"后，故障GPU的Pod自动驱逐功能即可生效。
 
#### 配置Xid应用引发的错误
1. 登录客户端机器，并[通过kubectl连接集群](https://support.huaweicloud.com/usermanual-cce/cce_10_0107.html)。
2. 执行以下命令，编辑插件Configmap的YAML文件，用于自定义"Xid应用引发的错误"。**如果不修改，"Xid应用引发的错误"** **默认为"13,31,43,45,68,137"** 。
   
   ```
   kubectl edit cm -n kube-system gpu-device-plugin-configuration
   ```
   英文输入**i** ，开始编辑，对application-error-xids字段的值进行修改。常见的Xid错误已整理在[GPU Xid常见错误](https://support.huaweicloud.com/usermanual-cce/cce_10_0779.html#cce_10_0779__section18656161533819)中，更多Xid错误信息请参见[Nvidia Xid Error](https://docs.nvidia.com/deploy/xid-errors/index.html)。
   ```
   apiVersion: v1
   data:
     config.yaml: |-
       fault-detect-config:
         xid:
           application-error-xids: "13,31,43,45,68,137"  # 与Xid严重错误不能重复
           no-check-xids: ""
   ...
   ```
   修改完成后，**Esc键** 退出编辑，输入**:wq**保存修改内容。
   ![](https://support.huaweicloud.com/usermanual-cce/public_sys-resources/note_3.0-zh-cn.png)
   在对CCE AI套件（NVIDIA GPU）插件进行升级或修改操作时，插件中的Configmap内容将会还原为默认配置。如果需要继续使用自定义的"Xid应用引发的错误"，请重新进行配置。
   
   
 
