
# 使用HPA+Bursting插件弹性CCE容器实例到CCI
#### 应用场景
在云容器引擎CCE服务中部署应用时，应用的流量大小时刻在进行变化，有高峰，有低谷，如果时刻保持高峰流量的节点数量，将导致资源闲置与成本浪费。通过配置HPA策略和安装CCE突发弹性引擎（对接 CCI），可以实现工作负载自动伸缩和快速使用Serverless容器资源（CCI）。CCI具有极速弹性、按需计费的特点，可以有效应对流量变化大的场景，并实现降本增效的目标。
HPA策略会持续监控应用程序的关键指标，如CPU使用率、内存使用率等，自动增加或减少Pod的数量，以适应当前应用流量大小，从而确保应用性能的稳定性和资源利用的高效性。CCE突发弹性引擎（对接 CCI）插件支持用户在短时高负载场景下，将部署在云容器引擎CCE上的无状态负载（Deployment）、有状态负载（StatefulSet）、普通任务（Job）、定时任务（CronJob）四种资源类型的容器实例（Pod）弹性调度至云容器实例CCI上，以减少集群扩容带来的消耗。
#### 示例说明
在CCE集群中安装云原生监控插件和CCE突发弹性引擎（对接 CCI）插件后，创建工作负载并配置HPA策略和强制弹性Pod至CCI2.0策略。通过hey压测工具构造请求访问工作负载模拟应用的流量变化，观察工作负载弹性伸缩状态。
#### 约束与限制
- **监控插件依赖** ：HPA的触发高度依赖容器监控指标。当工作负载通过Bursting插件弹性调度到CCI虚拟节点时，K8s集群原生的metrics-server可能无法完整采集虚拟节点上的Pod指标。需要在CCE集群的"插件中心"安装并使用**云原生监控插件（Cloud Native Monitoring）**，以确保HPA策略能够准确获取所有本地与CCI实例的CPU/内存使用率。
- **网络互通要求**：请确保CCE集群所在VPC的子网与CCI计划使用的子网网段不冲突，且已正确配置所需的VPC终端节点（VPCEP），否则弹性到CCI的Pod将无法拉取镜像或加入负载均衡（ELB）后端。
 
#### 前提条件
- 已[创建CCE集群](https://support.huaweicloud.com/usermanual-cce/cce_10_0028.html)并在集群中完成[节点创建](https://support.huaweicloud.com/usermanual-cce/cce_10_0363.html)。
- 已使用kubectl命令行工具或CloudShell[连接集群](https://support.huaweicloud.com/usermanual-cce/cce_10_0961.html)。
- CCE集群中已[安装云原生监控插件](https://support.huaweicloud.com/usermanual-cci2/cci_01_0039.html)，部署模式需选择"本地数据存储"，且已[开启Mtrics API](https://support.huaweicloud.com/usermanual-cce/cce_10_0406.html#section5)。
 
#### 操作步骤
1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)。
2. 单击集群名称进入集群，单击左侧导航栏选的"插件中心"。搜索"CCE突发弹性引擎（对接 CCI）"插件，单击"安装"。 
   ![](https://support.huaweicloud.com/bestpractice-cci2/zh-cn_image_0000002518063787.png "点击放大")
   
   - 选择插件版本，推荐使用最新版本。规格配置，选择系统预置规格，系统会根据不同的预置规格配置插件的实例数及资源配额，具体配置值请以控制台显示为准。
   
   - 网络互通（可选），开启后，支持CCE集群中的Pod与CCI集群中的Pod通过Kubernetes Service互通，并在插件安装时部署Proxy组件。详细功能介绍请参考[网络](https://support.huaweicloud.com/usermanual-cci2/cci_01_0031.html)。
   
   - 参数配置，配置"CCI资源池默认子网"和"CCI 2.0资源池(bursting-node)扩展子网(可选)"。
   
   
   
   
3. 单击左侧导航栏的"工作负载"，通过YAML创建无状态负载。YAML示例如下： 
   ```
   apiVersion: apps/v1
   kind: Deployment
   metadata:
     labels:
       version: v1
     name: n1
     namespace: default
   spec:
     selector:
       matchLabels:
         app: n1
         version: v1
     template:
       metadata:
         labels:
           app: n1
           version: v1
           bursting.cci.io/burst-to-cci: 'enforce'  # 配置强制弹性Pod到CCI
       spec:
         containers:
           - name: container-1
             image: nginx:latest   # 指定容器镜像。若使用“开源镜像中心”的镜像，可直接填写镜像名称；若使用SWR仓中的镜像，请在SWR中获取具体镜像地址
             resources:
               requests:
                 cpu: 500m
                 memory: 1Gi
               limits:
                 cpu: 500m
                 memory: 1Gi
         imagePullSecrets:       
           - name: default-secret
   ---
   ```
   
   
4. 单击左侧导航栏的"服务"，通过YAML创建服务。YAML示例如下：
   
   ```
   apiVersion: v1
   kind: Service
   metadata:
     name: n1
     namespace: default
     labels:
       app: n1
       version: v1
   spec:
     ports:
       - name: cce-service-0
         protocol: TCP    # 访问Service的协议，支持TCP和UDP
         port: 80         # 访问Service的端口
         targetPort: 80   # Service访问目标容器的端口，此端口与步骤2配置的容器中运行的应用强相关，如本例中nginx镜像默认使用80端口
     selector:
       app: n1
       version: v1
     type: ClusterIP
   ```
   
   
5. 单击左侧导航栏的"策略"，通过YAML创建HPA策略。YAML示例如下： 
   ```
   kind: HorizontalPodAutoscaler
   apiVersion: autoscaling/v2
   metadata:
     name: hpa-n1
     namespace: default
     annotations:
       extendedhpa.metrics: '[{"type":"Resource","name":"cpu","targetType":"Utilization","targetRange":{"low":"45","high":"56"}}]'
   spec:
     scaleTargetRef:
       kind: Deployment
       name: n1
       apiVersion: apps/v1
     minReplicas: 1
     maxReplicas: 10
     metrics:
       - type: Resource
         resource:
           name: cpu
           target:
             type: Utilization          
             averageUtilization: 50
   ```
   
   
6. 通过工具构造请求访问创建的Service，进行压测，参考命令如下，发起3000万个请求，并发300个客户端。 
   ```
   hey -n 30000000 -c 300 "http://$<service_ip>/"
   ```
   $\<service_ip\>：[4]创建的Service的ClusterIP。
   ![](https://support.huaweicloud.com/bestpractice-cci2/zh-cn_image_0000002517983799.png "点击放大")
   ![](https://support.huaweicloud.com/bestpractice-cci2/public_sys-resources/caution_3.0-zh-cn.png)
   本文示例使用hey压测工具进行过压测，您也可以自定义配置其他压测工具。进行压测时，需保证配置的压测工具所在的网络环境可正常访问CCE集群。
   
   
7. 观察HPA和负载状态。 
   压测前：
   ![](https://support.huaweicloud.com/bestpractice-cci2/zh-cn_image_0000002518063789.png "点击放大")
   ![](https://support.huaweicloud.com/bestpractice-cci2/zh-cn_image_0000002486023882.png "点击放大")
   压测后：
   ![](https://support.huaweicloud.com/bestpractice-cci2/zh-cn_image_0000002485863914.png "点击放大")
   ![](https://support.huaweicloud.com/bestpractice-cci2/zh-cn_image_0000002517983801.png "点击放大")
   
   
 
#### 常见问题
- **为什么业务流量回落后，CCI上的Pod没有立即缩容？**
  **现象**：停止压测或业务低谷时，HPA监控指标已下降，但CCI实例依然存活了一段时间才被删除。
  **原因** ：这是Kubernetes HPA的默认保护机制（缩容冷却期）。为防止监控指标瞬时抖动导致实例频繁创建和销毁（Thrashing），系统在触发缩容前默认会等待**5 分钟（300秒）** 的观察期。
  **结论**：在此期间实例仍处于存活状态属于正常现象，待冷却期结束后，系统会自动销毁CCI实例并立刻停止按秒计费。
  
- **弹性到 CCI 的 Pod，其计费规格是如何计算的？（如何避免超额费用？）**
  **规整机制** ：CCI底层具有固定的标准规格（如 0.25C1G、0.5C2G、1C4G 等）。当CCE的Pod弹性调度到CCI时，系统会提取该Pod YAML 中声明的requests和limits的**最大值**，并自动向上规整到最接近的CCI标准规格进行计费。
  **配置建议**：在配置HPA弹性时，必须在YAML中声明requests（HPA 扩容的计算基数）。为了避免调度到CCI后规格被意外放大，建议将requests与limits的数值设置为一致，或确保它们的最大值刚好等于某个具体的CCI标准规格（如0.25C1G、1C2G 等）。
  **示例**：若仅配置requests.cpu: 200m且未配置 limits，调度至CCI后，将按照最接近的0.25核规格进行计费。
  
- **进阶实践：如何避免缩容期间出现短暂的访问失败（502）？**
  **场景**：当CCI实例被缩容销毁时，若后端业务进程立即退出，而前端的负载均衡（ELB）尚未完成该实例IP的注销，会导致部分残留流量请求失败。
  **建议** ：在混合弹性架构中，强烈建议为工作负载配置**优雅下线（Graceful Shutdown）**。在Deployment的lifecycle中配置preStop钩子（例如执行sleep 15），让容器在收到终止信号后延迟15秒退出。这能为ELB异步摘除节点留出充足时间，有效保障缩容期间的业务连续性。
  
 
