metrics-server未正常工作导致Metrics API不可用,需检查Pod状态、日志、APIService注册状态,并排查TLS配置、RBAC权限、kubelet配置及网络连通性等问题。

这是因为 metrics-server 没有正确部署、运行异常,或未被 Kubernetes 正确识别为 Metrics API 的提供者。
检查 metrics-server 是否正常运行
执行以下命令确认 Pod 状态和日志:
-
kubectl get pods -n kube-system | grep metrics-server —— 查看 Pod 是否处于
Running状态,且READY为1/1 -
kubectl logs -n kube-system deployment/metrics-server —— 查看是否有 TLS、证书、连接 apiserver 失败等报错(常见如
x509: certificate signed by unknown authority) -
kubectl get apiservice | grep metrics —— 应看到
v1beta1.metrics.k8s.io的状态为True;若为False,说明该 API 未就绪,需进一步查原因
常见部署问题与修复方法
metrics-server 启动失败多由 TLS 配置或权限引起:
- 使用官方 YAML 部署时,务必关闭 --kubelet-insecure-tls(仅测试环境),生产环境应配置正确的 kubelet 客户端证书;否则会因证书校验失败无法拉取指标
- 确认 metrics-server 的 ServiceAccount 具备访问 kubelet 的权限(需 ClusterRoleBinding 绑定到
system:auth-delegator和system:metrics-reader) - 若集群启用了 NodeRestriction 准入控制器,需确保 metrics-server 使用的证书中
CommonName或SubjectAlternativeNames包含其可访问的节点 IP 或域名
验证 Metrics API 是否可用
绕过 kubectl top,直接测试 Metrics API 接口:
- kubectl get --raw "/apis/metrics.k8s.io/v1beta1/nodes" —— 应返回 JSON 格式节点指标数据
- kubectl get --raw "/apis/metrics.k8s.io/v1beta1/pods" —— 同理,查看 Pod 级别指标
- 若返回
error: the server doesn't have a resource type "nodes"或 404/503,说明 metrics-server 未成功注册 Metrics API
其他可能原因
排除非 metrics-server 自身的问题:
- kubelet 是否启用了
--enable-debugging-handlers=true和--authentication-token-webhook=true(部分发行版默认关闭) - 节点资源监控是否被禁用:检查 kubelet 启动参数中是否含
--cadvisor-port=0(v1.24+ 已弃用 cAdvisor,但旧版本依赖它) - 集群网络插件是否拦截了 metrics-server 到 kubelet 的 10250 端口通信(尤其在使用 NetworkPolicy 或服务网格时)










