GCP中Kubernetes HPA自定义日志指标无法读取求助
问题描述
用户在GCP中配置的Horizontal Pod Autoscaler(HPA)YAML片段如下:
//... metrics: - type: Pods pods: metric: name: "my-custom-metric" target: type: AverageValue averageValue: 60 //..
该自定义指标为日志型指标,已在Cloud Monitoring指标资源管理器中添加并可正常展示在仪表盘中,但HPA无法读取该指标,报错Unable to read all metrics。尝试使用指标完整路径名称时,又遇到“/不允许出现在名称中”的错误。用户提出以下疑问:
- 是否需要为服务账号添加特定权限?
- 是否必须使用Custom Metrics Adapter?
- 无适配器时HPA无法访问指标吗?
解决方案
1. Custom Metrics Adapter是必需的
没错,要让Kubernetes HPA读取Cloud Monitoring里的自定义指标(包括你这种日志型指标),必须部署Google Cloud Custom Metrics Adapter。原生HPA只能识别Kubernetes内置的CPU、内存这类指标,没法直接对接Cloud Monitoring的自定义指标。适配器作为中间层,会把Cloud Monitoring的指标转换成Kubernetes API能处理的格式,供HPA调用。没有适配器的话,HPA根本访问不到Cloud Monitoring的自定义指标。
2. 服务账号权限配置
部署适配器时,要给它用的服务账号配好权限:
- 给服务账号绑定
roles/monitoring.viewer角色,这个角色允许读取Cloud Monitoring里的所有指标数据。 - 自定义指标默认情况下项目内的
monitoring.viewer就有权限访问,不用额外配置指标级权限,除非你做了特殊的权限隔离。
另外,HPA控制器本身用的服务账号(一般在kube-system命名空间下的horizontal-pod-autoscaler)不需要额外加权限,它是通过Kubernetes API和适配器交互,不是直接调用Cloud Monitoring API。
3. 指标名称的正确用法
用了适配器之后,不用带斜杠的完整指标路径,直接用指标的短名称就行:
- 你在Cloud Monitoring里创建的日志型指标有个短名称(就是你YAML里写的
my-custom-metric),直接用这个就行。 - 如果还是拿不准正确名称,执行
kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1"查看适配器暴露的所有指标列表,找到对应指标后再配置到HPA里。
4. 额外排查步骤
- 先确认适配器正常运行:检查
kube-system命名空间下的custom-metrics-stackdriver-adapterPod是不是处于Running状态。 - 验证适配器能拿到指标:执行
kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1/namespaces/<你的命名空间>/pods/*/<你的指标名称>",如果能返回正常的指标数据,说明适配器对接没问题,重新配置HPA就可以了。
内容的提问来源于stack exchange,提问作者user11122042
相关产品推荐
相关产品推荐

