K8s HPA拉取Pods自定义指标失败 自动扩缩容故障排查
根因分析
报错URL里出现的%!A(MISSING)、%!D(MISSING)是Go语言fmt包的典型格式化错误输出,代表字符串格式化时传入参数和占位符不匹配,结合现象可以定位两个核心问题:
- 你只验证了自定义指标API的根路径可访问,没有验证Pod维度的
http_requests指标是否真的被适配器正确注册,绝大多数情况下自定义指标适配器(最常用的是Prometheus Adapter)默认不会自带http_requests的Pod维度关联规则,HPA请求对应指标路径时适配器无法正确路由。 - 你使用的
autoscaling/v2beta1版本HPA属于已废弃的旧API,和当前集群部署的自定义指标适配器存在版本兼容问题,HPA向适配器发起请求时参数传递不匹配,导致适配器端拼接请求路径时触发格式化bug,生成了非法的请求URL,最终返回资源不存在的错误。
修复步骤
- 首先验证Pod维度自定义指标的可用性,不要只检查API根路径,执行以下命令确认指标可正常返回:
如果该命令返回错误,先修改自定义指标适配器的配置(比如Prometheus Adapter的ConfigMap),添加kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1/namespaces/default/pods/*/http_requests"http_requests指标的Pod维度关联规则,确保指标和Pod资源能正确关联,直到上面的命令能返回正常的指标数据。 - 将HPA的API版本从废弃的
autoscaling/v2beta1升级为稳定版autoscaling/v2,同步适配新API的字段格式,修正后的完整HPA配置如下:apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: podinfo spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: podinfo minReplicas: 2 maxReplicas: 10 metrics: - type: Pods pods: metric: name: http_requests target: type: AverageValue averageValue: 1 - 应用新的HPA配置后等待1~2分钟,执行
kubectl describe hpa podinfo查看事件状态,如果没有拉取指标的相关报错,即代表HPA已经恢复自动扩缩容能力。 - 如果调整后仍然出现相同的
%!MISSING类格式化错误,直接将自定义指标适配器升级到和当前K8s集群版本匹配的稳定版本,该类错误属于适配器自身的代码逻辑bug,升级版本即可解决。
内容的提问来源于stack exchange,提问作者itida
相关产品推荐
相关产品推荐

