Kubernetes集群中HPA无法从Prometheus获取指标,请求排查原因
首先得澄清一下:你当前的HPA错误不是因为无法从Prometheus获取指标,而是Kubernetes的基础资源指标API(metrics.k8s.io)没有正常运行。HPA默认依赖这个API来获取CPU、内存这类原生资源的使用率数据,和Prometheus暂时还没扯上关系——除非你特意配置了用Prometheus提供自定义指标。
看错误信息里的关键提示:unable to fetch metrics from resource metrics API: the server could not find the requested resource (get pods.metrics.k8s.io),这说明集群里没有提供pods.metrics.k8s.io这个API服务的组件,也就是Metrics Server没部署或者没正常工作。
1. 检查Metrics Server状态
先确认集群里有没有部署Metrics Server:
kubectl get pods -n kube-system | grep metrics-server
如果没有任何输出,说明你还没部署Metrics Server——这是Kubernetes集群的可选组件,默认不会自动安装。
部署Metrics Server(如果缺失)
你可以通过Kubernetes官方提供的Metrics Server组件清单进行部署,或者使用Helm Chart安装(比如执行helm install metrics-server metrics-server/metrics-server)。
测试环境中,如果Metrics Server启动后报错无法连接kubelet,你可以在它的Deployment里添加--kubelet-insecure-tls参数跳过证书验证(生产环境建议配置合法的TLS证书)。
验证Metrics Server是否正常工作
部署完成后,等几分钟,然后执行:
kubectl top pods
如果能返回所有Pod的CPU和内存使用率数据,说明Metrics Server已经正常提供metrics.k8s.io API服务了。
2. 检查Pod的CPU Request配置
HPA计算CPU使用率的前提是你的Deployment里的Pod模板必须设置了CPU Request,因为HPA是基于实际CPU使用率 / CPU Request的百分比来判断是否需要扩缩容的。
检查你的php-apache Deployment配置,确保有类似这样的片段:
spec: containers: - name: php-apache image: php:apache resources: requests: cpu: "100m" # 必须设置CPU请求值 limits: cpu: "500m"
如果没有设置CPU Request,HPA会无法计算使用率,同样会出现<unknown>的指标值。
3. 如果你确实想通过Prometheus实现HPA(而非原生Metrics Server)
如果你的需求是用Prometheus采集的自定义指标(比如业务相关的QPS、延迟等)来做HPA,那需要额外部署Prometheus Adapter,它的作用是把Prometheus的指标转换成Kubernetes的自定义指标API(custom.metrics.k8s.io)。
关键配置步骤:
- 部署Prometheus Adapter:通常可以通过kube-prometheus-stack这个Helm Chart一键部署,它包含Prometheus、Grafana和Adapter
- 配置Adapter的ConfigMap:定义要从Prometheus抓取的指标规则,比如把Prometheus里的
container_cpu_usage_seconds_total转换成Kubernetes能识别的自定义指标 - 修改HPA配置:使用
type: Pods或者type: Object的自定义指标,而不是默认的Resource类型
比如一个基于Prometheus CPU指标的HPA配置示例:
apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: php-apache spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: php-apache minReplicas: 1 maxReplicas: 10 metrics: - type: Pods pods: metric: name: container_cpu_usage_percentage target: type: AverageValue averageValue: 50%
等Metrics Server(或Prometheus Adapter)正常运行后,重新查看HPA状态:
kubectl get hpa php-apache
如果指标从<unknown>变成具体的数值,说明问题已经解决,HPA会开始根据CPU使用率自动扩缩容。
内容的提问来源于stack exchange,提问作者Aditya Datta

