GKE环境Spring Boot应用启动阶段HPA异常触发扩容问题
问题根因
- HPA默认统计Pod内所有容器的CPU利用率总和,计算基数是Pod所有容器的CPU request总和。你当前Pod包含业务容器(CPU request 200m)和cloudsql-proxy sidecar(CPU request 100m),总计算基数为300m。
- Spring Boot应用启动阶段需要初始化上下文、加载类、建立数据库连接等操作,会产生临时CPU峰值,即使没有业务流量,启动阶段CPU占用也可能达到240m以上,对应整体Pod CPU利用率超过80%的阈值,触发HPA扩容。
- HPA默认不会过滤未就绪Pod的CPU指标,Pod还在启动、未通过readinessProbe检测时,其CPU占用已经被纳入HPA的利用率计算,临时峰值直接触发扩容逻辑。
解决方案
- 使用容器级HPA指标(推荐)
K8s 1.20及以上版本支持单独指定HPA统计某一个容器的资源利用率,避免sidecar容器的request占用计算基数,更贴合业务实际负载情况。配置示例如下:
apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: myapp-api labels: app: myapp spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: myapp-api minReplicas: 1 maxReplicas: 10 metrics: - type: ContainerResource containerResource: name: cpu container: myapp # 仅统计业务容器的CPU利用率 target: type: Utilization averageUtilization: 80 - type: ContainerResource containerResource: name: memory container: myapp # 仅统计业务容器的内存利用率 target: type: Utilization averageUtilization: 80
- 配置HPA扩容稳定窗口
在HPA中添加behavior配置,设置扩容前的稳定窗口时长,过滤启动阶段的临时CPU峰值,窗口时长建议大于应用启动的最长耗时(此处建议设为120秒,大于你配置的90秒存活探针初始延迟):
spec: # 其他原有配置保持不变 behavior: scaleUp: stabilizationWindowSeconds: 120 # 过去2分钟的指标平均满足阈值才会触发扩容 policies: - type: Percent value: 100 periodSeconds: 60 scaleDown: stabilizationWindowSeconds: 300
- 优化Spring Boot启动性能
降低应用启动阶段的CPU峰值:
- 开启Spring Boot懒加载,配置
spring.main.lazy-initialization=true - 裁剪不必要的依赖组件,减少启动时的初始化逻辑
- 调整JVM启动参数,避免启动阶段不必要的资源占用
- 调整业务容器CPU request
如果启动阶段CPU峰值确实较高,可以适当调优业务容器的CPU request值,降低计算得到的利用率百分比,避免触发阈值。
内容的提问来源于stack exchange,提问作者Muktesh Arya
相关产品推荐
相关产品推荐

