autoscaling/v2beta2 HPA与apiregistration.k8s.io/v1 APIService搭配时无法获取自定义指标问题排查
从你描述的现象来看:手动请求自定义指标完全正常,但HPA却无法获取指标,且问题是在将APIService升级到v1版本后出现的,大概率是APIService v1版本的配置细节或HPA的指标引用规范发生了严格化变化,以下是几个针对性的排查和解决步骤:
1. 补充HPA中对象引用的namespace字段
你的HPA配置里,object.describedObject没有指定namespace字段:
describedObject: kind: Service name: services-metrics-service
虽然HPA默认会使用自身所在的namespace,但APIService v1版本对自定义指标API的调用规范更严格,可能要求明确指定对象的命名空间。尝试补充namespace字段:
describedObject: kind: Service name: services-metrics-service namespace: test
更新HPA后观察是否恢复正常。
2. 修正自定义指标返回的apiVersion格式
从你手动请求的结果来看,返回的describedObject.apiVersion是"/v1",这不符合Kubernetes API规范:
"describedObject": { "kind": "Service", "namespace": "test", "name": "services-metrics-service", "apiVersion": "/v1" // 此处格式错误 }
Service属于core API组,正确的apiVersion应该是"v1"。APIService v1beta1可能对这种不规范格式有兼容,但v1版本的API校验更严格,直接导致HPA无法解析返回结果。
你需要修改自定义指标暴露服务的代码,将apiVersion修正为"v1",重新部署后再测试HPA。
3. 检查APIService的状态与优先级配置
先确认APIService是否处于正常就绪状态:
kubectl get apiservice v1.custom.metrics.k8s.io -o yaml
查看status.conditions中type: Ready对应的status是否为True。如果状态异常,检查对应的metrics服务Pod是否正常运行、端口是否可达。
另外,检查优先级配置:
spec.groupPriorityMinimum设为1000是合理的(自定义指标组优先级通常高于内置组)spec.versionPriority设为5时,要确保没有残留的v1beta1版本APIService(如果有,会导致版本优先级冲突)
如果存在旧的v1beta1 APIService,执行删除操作:
kubectl delete apiservice v1beta1.custom.metrics.k8s.io
4. 排查HPA控制器的自定义指标API访问权限
手动请求正常不代表HPA控制器有对应的访问权限。检查HPA控制器所在的ServiceAccount(通常在kube-system命名空间下的horizontal-pod-autoscaler)是否有权限访问custom.metrics.k8s.io API组:
kubectl auth can-i get services.custom.metrics.k8s.io --as=system:serviceaccount:kube-system:horizontal-pod-autoscaler -n test
如果返回no,需要创建对应的RBAC规则:
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: hpa-custom-metrics-reader rules: - apiGroups: ["custom.metrics.k8s.io"] resources: ["services/*"] verbs: ["get", "list"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: hpa-custom-metrics-binding roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: hpa-custom-metrics-reader subjects: - kind: ServiceAccount name: horizontal-pod-autoscaler namespace: kube-system
应用配置后等待RBAC权限生效,或重启HPA控制器。
内容的提问来源于stack exchange,提问作者Urko Lekuona

