使用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集群并在集群中完成节点创建。
- 已使用kubectl命令行工具或CloudShell连接集群。
- CCE集群中已安装云原生监控插件,部署模式需选择“本地数据存储“,且已开启Mtrics API。
操作步骤
- 登录CCE控制台。
- 单击集群名称进入集群,单击左侧导航栏选的“插件中心“。搜索“CCE突发弹性引擎(对接 CCI)“插件,单击“安装“。

- 选择插件版本,推荐使用最新版本。规格配置,选择系统预置规格,系统会根据不同的预置规格配置插件的实例数及资源配额,具体配置值请以控制台显示为准。
- 网络互通(可选),开启后,支持CCE集群中的Pod与CCI集群中的Pod通过Kubernetes Service互通,并在插件安装时部署Proxy组件。详细功能介绍请参考网络。
- 参数配置,配置”CCI资源池默认子网”和”CCI 2.0资源池(bursting-node)扩展子网(可选)”。
- 单击左侧导航栏的“工作负载“,通过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 --- - 单击左侧导航栏的“服务”,通过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 - 单击左侧导航栏的“策略”,通过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 - 通过工具构造请求访问创建的Service,进行压测,参考命令如下,发起3000万个请求,并发300个客户端。
hey -n 30000000 -c 300 "http://$<service_ip>/"
$<service_ip>:4创建的Service的ClusterIP。

本文示例使用hey压测工具进行过压测,您也可以自定义配置其他压测工具。进行压测时,需保证配置的压测工具所在的网络环境可正常访问CCE集群。
- 观察HPA和负载状态。
压测前:


压测后:


常见问题
- 为什么业务流量回落后,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异步摘除节点留出充足时间,有效保障缩容期间的业务连续性。