EKS部署Metrics Server后HPA无法获取CPU/内存指标问题
我帮你梳理下EKS里Metrics Server配合HPA出问题的常见解决思路,你遇到的这个报错核心是Metrics Server没法从kubelet拿到节点/容器的指标数据,虽然你已经加了--kubelet-insecure-tls这类参数,但还有几个关键点要逐一排查:
1. 先确认Metrics Server自身的运行状态
首先得确保Metrics Server Pod本身没挂,再看看日志里有没有更具体的错误信息:
# 查看Metrics Server Pod状态 kubectl get pods -n kube-system | grep metrics-server # 查看Pod日志,找连接kubelet失败的细节 kubectl logs -n kube-system <你的metrics-server-pod-name>
如果日志里出现x509: certificate signed by unknown authority或者kubelet连接超时的信息,那大概率是TLS配置或者网络连通性的问题。
2. 检查Metrics Server到kubelet的网络连通性
EKS的kubelet默认用10250端口提供指标,你已经加了--kubelet-insecure-tls绕过证书验证,但得先确认Metrics Server能通到节点的这个端口。可以在Metrics Server Pod里直接测试:
kubectl exec -n kube-system <你的metrics-server-pod-name> -- curl -k https://<节点内部IP>:10250/stats/summary
如果返回一堆JSON格式的节点指标数据,说明网络和kubelet是正常的;如果超时或者报错,得去检查EKS的安全组配置,确保节点之间允许10250端口的入站流量。
3. 修正Metrics Server的启动参数配置
你当前的配置里command和args混用了,这会导致部分参数没生效!Kubernetes里如果用command覆盖了容器的默认启动命令,args里的参数不会被自动传递,得把所有参数都放到command里:
containers: - name: metrics-server image: k8s.gcr.io/metrics-server/metrics-server:v0.3.7 imagePullPolicy: IfNotPresent command: - /metrics-server - --kubelet-insecure-tls=true - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname - --v=2 - --cert-dir=/tmp - --secure-port=4443
之前args里的参数相当于白写了,Metrics Server根本没读到,这很可能是问题根源之一。
4. 验证Metrics API是否正常提供数据
Metrics Server启动后会注册metrics.k8s.io API,直接调用这个API就能确认指标能不能正常获取:
# 获取节点指标 kubectl get --raw "/apis/metrics.k8s.io/v1beta1/nodes" # 获取Pod指标 kubectl get --raw "/apis/metrics.k8s.io/v1beta1/pods"
如果这两个命令能返回正常的指标JSON,说明Metrics Server已经工作了,HPA的报错可能是暂时的,等几分钟指标同步就好;如果返回404或者空数据,那还是得回到前面的步骤排查Metrics Server的启动问题。
5. 检查HPA关联的Pod资源配置
HPA要获取CPU/内存利用率,前提是对应的Pod必须定义了resources.requests和resources.limits,比如:
resources: requests: cpu: "100m" memory: "128Mi" limits: cpu: "200m" memory: "256Mi"
如果Pod没配置这些资源请求,Metrics Server根本没法收集到对应的利用率指标,HPA自然会报错。
6. 考虑升级Metrics Server版本
v0.3.7是比较老的版本了,可能和新的EKS Kubernetes版本存在兼容性问题,建议升级到较新的稳定版(比如v0.6.4),新版本修复了很多kubelet通信的细节问题,配置也更简洁。
按照上面的步骤逐一排查,应该能解决HPA无法获取Metrics Server指标的问题。
内容的提问来源于stack exchange,提问作者Vikas Rathore

