GCP GKE HPA调用自定义日志指标扩容时报错400问题咨询
问题原因分析
你之前可正常使用的kubernetes.io|pod|network|received_bytes_count等指标是GKE默认适配好的Pod维度指标,本次报错的核心原因是日志生成的自定义指标没有符合Custom Metrics Adapter的查询规则,具体分为三类常见情况:
- 指标绑定的监控资源类型不匹配:HPA中配置
Pods类型指标时,Adapter默认用k8s_pod作为资源类型查询,而你从日志生成的自定义指标大概率绑定的是global或k8s_container类型,导致API查询时资源描述符和指标不匹配,触发400错误。 - 指标特殊字符未正确转义:指标名中的括号
(RTS)属于特殊字符,Adapter在拼接查询条件时未做转义,导致GCP监控API无法识别到正确的指标。 - 指标缺少K8s资源标签:Adapter查询Pod维度指标时会默认带上
namespace_name、pod_name等标签过滤,如果你在生成日志指标时没有同步关联这些K8s资源标签,就会导致查询条件匹配不到任何时间序列。
解决方案
步骤1:确认指标的暴露状态
先执行以下命令验证目标指标是否在Pod维度正常暴露:
kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1/namespaces/relevancy/pods/*/logging.googleapis.com|user|Similar_Products(RTS)_Inbound_Request_Count"
如果返回404,说明指标确实没有在Pod维度做适配,按后续步骤配置即可。
步骤2:配置自定义指标适配规则
在Custom Metrics Adapter的配置中添加该日志指标的适配规则,将k8s_container类型的指标映射为Pod维度可查询的指标,规则示例如下:
rules: - seriesQuery: 'logging.googleapis.com/user/Similar_Products(RTS)_Inbound_Request_Count{k8s_namespace_name="",k8s_pod_name="",k8s_container_name=""}' resources: overrides: k8s_namespace_name: {resource: "namespace"} k8s_pod_name: {resource: "pod"} name: matches: "^(.*)$" as: "logging.googleapis.com|user|Similar_Products(RTS)_Inbound_Request_Count" metricsQuery: 'sum(<<.Series>>{<<.LabelMatchers>>}) by (<<.GroupBy>>)'
可选方案:修改HPA指标类型
如果你不想修改Adapter配置,也可以直接将HPA的指标类型改为External,手动指定查询过滤条件:
metrics: - type: External external: metric: name: "logging.googleapis.com|user|Similar_Products(RTS)_Inbound_Request_Count" selector: matchLabels: resource.labels.namespace_name: "relevancy" resource.labels.deployment_name: "similar-products" target: type: AverageValue averageValue: 25
步骤3:规避特殊字符问题
如果测试后确认是括号导致的识别异常,可以在创建日志指标时将指标名修改为不带特殊字符的格式,例如similar_products_rts_inbound_request_count,彻底避免转义问题。
步骤4:验证配置
修改完成后执行以下命令查看HPA状态,确认指标可正常获取:
kubectl describe hpa similar-products-rts-hpa -n relevancy
内容的提问来源于stack exchange,提问作者sankar
相关产品推荐
相关产品推荐

