HPA调用PubSub外部指标报错:one_of参数不足问题排查与修复
解决HPA基于PubSub外部指标的one_of参数错误问题
这个问题我之前踩过坑,核心原因是HPA把单个值的matchLabels转换成In操作时,生成的Cloud Monitoring查询用了one_of()函数,但该函数要求至少传2个参数,而你的配置里只有一个订阅ID,直接触发了API报错。
为什么之前能正常运行?
两天前没问题是因为旧版本的metrics adapter(比如GKE的Stackdriver Metrics Adapter)在处理单个标签值的matchLabels时,会生成=(等于)条件,而非In/one_of()。但最近组件更新后,逻辑变了:只要是matchLabels就会转换成In操作,哪怕只有单个值也不例外,这就导致Cloud Monitoring API拒绝了这个非法的one_of()调用。
修复方案
推荐用第一种方案,更规范且长期有效:
方案1:改用matchExpressions指定Equals操作符
把metricSelector里的matchLabels替换成matchExpressions,明确使用Equals操作符,这样生成的查询会用=而不是one_of(),完美避开这个问题:
apiVersion: autoscaling/v2beta1 kind: HorizontalPodAutoscaler metadata: name: pubsub spec: minReplicas: 1 maxReplicas: 5 metrics: - external: metricName: pubsub.googleapis.com|subscription|num_undelivered_messages metricSelector: matchExpressions: - key: resource.labels.subscription_id operator: Equals values: - my-subscription-name targetAverageValue: "2" type: External
方案2:临时凑够2个标签值(不推荐)
如果不想修改配置结构,可以临时加一个不存在的订阅ID凑数,让one_of()有两个参数,但这只是临时workaround,不建议长期使用:
metricSelector: matchLabels: resource.labels.subscription_id: my-subscription-name resource.labels.subscription_id: dummy-subscription-id # 无效ID,仅用于凑数
验证修复
重新应用HPA配置:
kubectl apply -f your-hpa-file.yaml
等待几分钟后,查看HPA状态确认指标正常:
kubectl get hpa pubsub
内容的提问来源于stack exchange,提问作者gstackoverflow
相关产品推荐
相关产品推荐

