kubeadm搭建的Kubernetes集群metrics-server无法启动,kubectl top node报错
Kubernetes metrics-server 指标采集失败问题解决方案
问题现象
使用kubeadm搭建的1主1工作节点Kubernetes集群,部署metrics-server后执行kubectl top node返回如下报错:
W1122 19:36:25.770078 4684 top_node.go:119] Using json format to get metrics. Next release will switch to protocol-buffers, switch early by passing --use-protocol-buffers flag Error from server (ServiceUnavailable): the server is currently unable to handle the request (get nodes.metrics.k8s.io)
metrics-server自身启动日志无异常,所有内置组件均正常启动。
排查&解决步骤
你当前部署配置中已经给metrics-server绑定了cluster-admin集群角色,RBAC权限足够,无需排查权限问题,按以下步骤排查即可:
- 第一步:确认APIService注册状态
执行kubectl get apiservice v1beta1.metrics.k8s.io,查看STATUS列是否为Available。如果显示False/ServiceUnavailable,执行kubectl describe apiservice v1beta1.metrics.k8s.io查看具体失败原因,绝大多数情况是metrics-server服务无法被kube-apiserver访问导致。 - 第二步:确认metrics-server服务连通性
- 先确认metrics-server pod运行正常:
kubectl get pods -n kube-system | grep metrics-server,确保pod处于Running状态,无重启记录。 - 测试集群内部是否能正常访问metrics-server服务:
启动临时测试pod:kubectl run -it --rm test --image=busybox:1.28 --restart=Never
在pod内执行请求:wget --no-check-certificate https://metrics-server.kube-system.svc/healthz
如果返回200状态码说明服务正常,否则排查集群CNI插件连通性、网络策略限制问题。
- 先确认metrics-server pod运行正常:
- 第三步:检查节点kubelet 10250端口连通性
metrics-server需要访问每个节点的kubelet 10250端口拉取指标,确认所有节点的防火墙、安全组已经放开10250端口的集群内部入站规则,没有被拦截。 - 第四步:调整metrics-server启动参数
你当前配置已经添加了--kubelet-insecure-tls=true跳过kubelet证书校验,部分场景下因为节点Hostname无法解析、ExternalIP未配置会导致拉取指标超时,可以将--kubelet-preferred-address-types参数调整为仅保留InternalIP:
替换原有的多类型配置即可。- --kubelet-preferred-address-types=InternalIP - 第五步:确认CoreDNS服务正常
执行kubectl get pods -n kube-system | grep coredns,确认所有CoreDNS pod处于Running状态,集群内部域名解析正常。
验证
调整配置重新部署metrics-server后,等待2-3分钟让指标采集完成,再执行kubectl top node即可正常返回节点CPU、内存使用率指标。
内容的提问来源于stack exchange,提问作者Cosss
相关产品推荐
相关产品推荐

