kubectl top无数据,从metrics-server到kubelet feature gate,OrbStack 2.0.5如何排查?
摘要:日期:2026-02-04 环境信息: OrbStack:2.0.5 (19905) kubectl:v1.32.7 kube-apiserverkubelet(集群):v1.33.5+orb1 问题出现:kubec
日期:2026-02-04
环境信息:
OrbStack:2.0.5 (19905)
kubectl:v1.32.7
kube-apiserver / kubelet(集群):v1.33.5+orb1
问题出现:kubectl top 失灵
我想在本地集群里看一下 Pod 的资源使用量,按惯例跑:
kubectl top pod -A
这一步如果正常,应该能看到每个 Pod 的 CPU(cores)/MEMORY(bytes)。
但现实是:top 没有指标可用(典型表现是无数据或 Metrics not available 之类的提示)。直觉告诉我:metrics-server 可能没装好。
先不要动 metrics-server:先把链路理清楚
kubectl top 的数据来源是 metrics.k8s.io API,而 metrics.k8s.io 是 metrics-server 聚合出来的。metrics-server 本身不采集,它去各节点 kubelet 拉指标。
所以链路是这样的:
kubelet 暴露 Summary API:/stats/summary
metrics-server 抓 Summary API(或相关 kubelet stats)
metrics-server 生成 metrics.k8s.io
kubectl top 读取 metrics.k8s.io
结论:排查时必须先确认 kubelet 有没有“原材料”。
metrics 层排查:API 还在,但可能只是空转
我先直接看 metrics.k8s.io 是否返回内容:
kubectl get --raw "/apis/metrics.k8s.io/v1beta1/pods" | head
当它返回 PodMetricsList 时,说明 metrics-server 至少活着、API 路由也通。
但这不代表数据就完整,因为 metrics-server 可能只是拿到了一部分,或者 kubelet 根本没吐 Pod/Container stats。
接着看 metrics-server 日志(用于确认它是否在抱怨 kubelet):
kubectl -n kube-system logs deploy/metrics-server --tail=200
Kubernetes 社区里有一类非常典型的错误:metrics-server 抓 kubelet 的 /stats/summary 时得到 500,然后 kubectl top 没数据。[1]
kubelet 层排查:Summary API 才是真相
既然 metrics-server 只是中间商,那就绕过它,直接查 kubelet Summary API。
先取一个 node 名:
NODE="$(kubectl get node -o name | head -n1 | cut -d/ -f2)"
然后通过 apiserver proxy 请求:
kubectl get --raw "/api/v1/nodes/$NODE/proxy/stats/summary" | head
关键点在 pods 字段。我用 rg 快速定位:
kubectl get --raw "/api/v1/nodes/$NODE/proxy/stats/summary" | rg '"pods"' -n
当时的核心现象是:Summary 里 Pod/Container 级别统计不对劲(常见就是 pods 为空或缺失)。
这就解释了为什么 kubectl top 没法工作:上游根本拿不到 Pod 的资源使用量。
查 GitHub:OrbStack issue 给了答案
到这一步,问题从“metrics-server 配置”变成了“kubelet 的 stats 从哪里来”。
