Kubernetes多HPA未绑定对应Deployment CPU指标异常扩容排查
根因定位
该问题的核心原因是三个Deployment的标签与选择器配置冲突。
你提供的app1 Deployment配置中,spec.selector.matchLabels设置为app: app,Pod模板的metadata.labels也设置为app: app,且你提到app2、app3的Deployment仅名称、启动脚本存在差异,说明三个Deployment的选择器、Pod标签完全一致。
Deployment通过选择器匹配自己管理的Pod实例,三个Deployment共用同一套选择器和标签,会导致每个Deployment都能匹配到该命名空间下所有带app: app标签的Pod(即三个应用的全部Pod)。HPA计算指标时会获取绑定Deployment匹配到的所有Pod的CPU平均值,自然三个HPA拿到的指标完全相同,等价于统计了整个命名空间下所有相关Pod的平均负载。
修复方案
逐个调整三个Deployment的标签和选择器,保证每个Deployment的标识唯一:
- 调整app1的Deployment配置:
apiVersion: apps/v1 kind: Deployment metadata: name: app1 labels: app: app1 # 替换为应用唯一标识 spec: replicas: 2 selector: matchLabels: app: app1 # 和Pod标签对应,保持唯一 template: metadata: labels: app: app1 # 替换为应用唯一标识,和选择器匹配 # 其余资源、启动命令等配置保持不变
- 同理修改app2、app3的Deployment,分别将标签、选择器设置为
app: app2、app: app3 - 由于Kubernetes不允许直接修改已存在Deployment的
matchSelector字段,你需要先删除原有三个Deployment再重新创建,若业务不允许中断可采用蓝绿发布的方式逐步替换。
验证方法
- 修复完成后执行
kubectl get pods -n my-namespace -l app=app1,确认返回结果仅包含app1的Pod - 执行
kubectl describe hpa app1-hpa -n my-namespace,查看指标部分是否和app1实际Pod的CPU占用一致,等待几分钟后即可看到副本数自动调整到符合预期的数值。
内容的提问来源于stack exchange,提问作者gbt
相关产品推荐
相关产品推荐

