
# 根据推理业务GPU使用率创建HPA策略
在CCE Standard/Turbo集群中，用户可以通过GPU监控指标为使用GPU资源的工作负载配置弹性伸缩（HPA），使应用在业务高峰期自动扩容、低负载时缩容，从而优化资源利用率并降低成本。
#### 前提条件
- 目标集群已创建，且集群中包含GPU节点，并已运行GPU相关业务。
- 在集群中安装[CCE AI套件（NVIDIA GPU）](https://support.huaweicloud.com/usermanual-cce/cce_10_0141.html)，且插件正常上报GPU的metrics指标。您可以登录GPU节点，执行以下命令进行检查：
  ```
  curl {Pod IP}:2112/metrics
  ```
  其中*{Pod IP}*是CCE AI套件（NVIDIA GPU）插件中nvidia-gpu-device-plugin组件的Pod IP，返回指标结果则为正常。
  
- 在集群中安装3.9.5及以上版本的[云原生监控插件](https://support.huaweicloud.com/usermanual-cce/cce_10_0406.html)，且部署模式需选择"本地数据存储"。您还需将Prometheus注册为Metrics API的服务，详见[通过Metrics API提供基础资源指标](https://support.huaweicloud.com/usermanual-cce/cce_10_0406.html#section5)。如果集群中已安装[Kubernetes Metrics Server](https://support.huaweicloud.com/usermanual-cce/cce_10_0205.html)，该插件默认提供Metrics API，无需重复注册。
 
#### 采集GPU指标
1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称进入集群，在左侧导航栏中选择"配置项与密钥"。
2. 切换至"monitoring"命名空间，在"配置项"页签找到user-adapter-config配置项，并单击"更新"。 
   图1更新配置项   
   ![](https://support.huaweicloud.com/bestpractice-cce/zh-cn_image_0000002549913937.png "点击放大")
   
   
3. 在"配置数据"中单击config.yaml对应的"编辑"按钮，在rules字段下添加自定义指标采集规则。修改完成后单击"确定"保存配置。 
   如果您需要增加多个采集规则，可在rules字段下添加多个配置，关于采集规则配置详情请参见[Metrics Discovery and Presentation Configuration](https://github.com/kubernetes-sigs/prometheus-adapter/blob/master/docs/config.md)。
   针对cce_gpu_utilization指标的自定义采集规则示例如下，更多GPU指标请参见[GPU监控指标说明](https://support.huaweicloud.com/usermanual-cce/cce_10_0955.html)。
   ```
   rules:
     - seriesQuery: '{__name__=~"cce_gpu_utilization",container!="",namespace!="",pod!=""}'
       seriesFilters: []
       resources:
         overrides:
           namespace:
             resource: namespace
           pod:
             resource: pod
       metricsQuery: sum(last_over_time(<<.Series>>{<<.LabelMatchers>>}[1m])) by (<<.GroupBy>>)
   ```
   图2设置自定义采集规则   
   ![](https://support.huaweicloud.com/bestpractice-cce/zh-cn_image_0000002518274184.png "点击放大")
   
   
4. 重新部署monitoring命名空间下的custom-metrics-apiserver工作负载。 
   图3重新部署custom-metrics-apiserver   
   ![](https://support.huaweicloud.com/bestpractice-cce/zh-cn_image_0000002549913939.png "点击放大")
   
   
5. 重启后，可以通过以下指令查看对应的Pod的指标是否正常。 
   ```
   kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1"
   ```
   回显结果如下：
   ```
   {"kind":"APIResourceList","apiVersion":"v1","groupVersion":"custom.metrics.k8s.io/v1beta1","resources":[{"name":"pods/cce_gpu_memory_utilization","singularName":"","namespaced":true,"kind":"MetricValueList","verbs":["get"]},{"name":"namespaces/cce_gpu_memory_utilization","singularName":"","namespaced":false,"kind":"MetricValueList","verbs":["get"]}]}
   ```
   
   
 
#### 推理服务部署
1. 执行以下命令部署一个推理服务。 
   您可以把Qwen3-8B的checkPoint（<https://huggingface.co/Qwen/Qwen3-8B>）提前存储到指定路径，然后通过HostPath进行挂载。本例是存储到本地"/root/wx/checkpoints/qwen/"路径，镜像使用vllm/vllm-openai:v0.11.0。
   ```
   kind: Deployment
   apiVersion: apps/v1
   metadata:
     name: qwen-8b
     namespace: default
   spec:
     replicas: 1
     selector:
       matchLabels:
         app: qwen-8b
         version: v1
     template:
       metadata:
         labels:
           app: qwen-8b
           version: v1
       spec:
         volumes:
           - name: vol-ckpt
             hostPath:
               path: /root/wx/checkpoints/qwen/ # 本地存储的Qwen3-8B的checkPoint路径
               type: ''
         containers:
           - name: container-1
             image: vllm/vllm-openai:v0.11.0
             command:
               - /bin/sh
               - '-c'
             args:
               - vllm serve Qwen3-8B --model='/vllm-workspace/Qwen3-8B' --port=8000 --host=0.0.0.0 --max-model-len=20480 
             env:
               - name: TRANSFORMERS_OFFLINE
                 value: '1'
               - name: HF_DATASET_OFFLINE
                 value: '1'
             resources:
               limits:
                 cpu: '16'
                 memory: 80Gi
                 nvidia.com/gpu: '1'
               requests:
                 cpu: '16'
                 memory: 80Gi
                 nvidia.com/gpu: '1'
             volumeMounts:
               - name: vol-ckpt
                 mountPath: /vllm-workspace/Qwen3-8B
             imagePullPolicy: IfNotPresent
         restartPolicy: Always
         terminationGracePeriodSeconds: 30
         dnsPolicy: ClusterFirst
         securityContext: {}
         imagePullSecrets:
           - name: default-secret
     strategy:
       type: RollingUpdate
       rollingUpdate:
         maxUnavailable: 25%
         maxSurge: 25%
   ---
   apiVersion: v1
   kind: Service
   metadata:
     name: qwen-8b-svc
     namespace: default
   spec:
     selector:
       app: qwen-8b
       version: v1
     type: ClusterIP   
     ports:
       - name: http
         port: 8000        
         targetPort: 8000
   ```
   
   
2. 执行以下命令查看Pod和Service部署状态。 
   ```
   kubectl get pod
   kubectl get service
   ```
   预期如下：
   ![](https://support.huaweicloud.com/bestpractice-cce/zh-cn_image_0000002549890369.png "点击放大")
   
   
3. 执行以下命令验证推理服务，其中IP需要更换为Service IP。 
   ```
   curl http://10.247.90.143:8000/v1/completions -H "Content-Type: application/json" -d '{"model": "Qwen3-8B","prompt": "San Francisco is a","max_tokens": 100,"temperature": 0}'
   ```
   正常返回如下：
   ![](https://support.huaweicloud.com/bestpractice-cce/zh-cn_image_0000002518254180.png "点击放大")
   
   
 
#### 创建弹性伸缩策略
1. 单击左侧导航栏的"工作负载"，在目标工作负载的操作列中单击"弹性伸缩"。
2. 策略类型选择"HPA+CronHPA策略"，并启用HPA策略。 
   您可在"自定义策略"中选择GPU监控参数创建弹性伸缩策略，示例如下。
   图4选择自定义指标   
   ![](https://support.huaweicloud.com/bestpractice-cce/zh-cn_image_0000002550025585.png "点击放大")
   
   示例中以cce_gpu_utilization（GPU利用率）作为伸缩指标，其余HPA参数的设置请根据实际需求进行设置，详情请参见[创建HPA策略](https://support.huaweicloud.com/usermanual-cce/cce_10_0208.html)。
   
   
3. 返回"策略"页签，查看HPA策略已创建成功。 
   图5HPA策略创建成功   
   ![](https://support.huaweicloud.com/bestpractice-cce/zh-cn_image_0000002550014083.png "点击放大")
   
   
   
 
#### 测试推理服务弹性伸缩
**验证HPA扩容**
1. 下载Apache自带的压力测试工具ApacheBench（简称ab）。 
   ```
   #若OS为Ubuntu
   apt-get install apache2-utils
   #若OS为CentOS/HCE
   yum install httpd-tools
   ```
   
   
2. 执行以下命令进行压测，其中ab压测工具命令，body.json为请求体。 
   body.json内容如下：
   ```
   {
       "model": "Qwen3-8B",
       "prompt": "San Francisco is a",
       "max_tokens": 100,
       "temperature": 0
   }
   ```
   压测命令如下：
   ```
   ab -n 4000 -c 1 -p body.json -T application/json http://10.247.90.143:8000/v1/completions
   ```
   
   
3. 观察GPU负载情况和HPA状态。 
   - GPU利用率持续处于高位 ![](https://support.huaweicloud.com/bestpractice-cce/zh-cn_image_0000002518414696.png "点击放大")
     
   
   - HPA感知到GPU利用率超过20%，开始扩容 ![](https://support.huaweicloud.com/bestpractice-cce/zh-cn_image_0000002550014827.png "点击放大")
     
   
   - 查看Pod状态，Pod扩容成功 ![](https://support.huaweicloud.com/bestpractice-cce/zh-cn_image_0000002550014901.png "点击放大")
     
   
   
   
   
**验证HPA缩容**
压测结束后，查看GPU负载和HPA状态。
- GPU利用率降低 ![](https://support.huaweicloud.com/bestpractice-cce/zh-cn_image_0000002518415130.png "点击放大")
  
- 等待5分钟左右（默认缩容时间），HPA触发缩容 ![](https://support.huaweicloud.com/bestpractice-cce/zh-cn_image_0000002550015011.png "点击放大")
  
- 查看Pod状态，Pod缩容成功 ![](https://support.huaweicloud.com/bestpractice-cce/zh-cn_image_0000002518255360.png "点击放大")
  
 
