蓝易云:k8s版本v1.24,kubectl top pod
发布时间:2025-12-14 00:01       
蓝易云:K8s v1.24 中 kubectl top pod 提示
error: Metrics API not available 的排查与修复 ✅

一、先把问题说清楚:这条报错说明了什么?
在 Kubernetes v1.24 集群中执行:
kubectl top pod -A
出现:
error: Metrics API not available
本质含义是:集群的 metrics.k8s.io API 没有就绪,最常见原因就是:
- Metrics Server 没安装,或者
- 已安装但启动失败 / TLS 配置不通 / 权限有问题。(博客园)
二、步骤 1:先确认 Metrics Server 有没有装 😅
1)检查是否存在 Deployment
kubectl get deployment metrics-server -n kube-system
解释:
kubectl get deployment:查看指定命名空间中的 Deployment 列表。metrics-server:Metrics Server 默认的 Deployment 名称。-n kube-system:Metrics Server 通常部署在kube-system命名空间。
典型情况:
- 返回
metrics-servernot found:说明根本没装。 - 返回 1/1、2/2 Running:说明 Deployment 存在,再看 Pod 状态。(博客园)
2)查看 Pod 具体状态
kubectl get pods -n kube-system | grep metrics-server
解释:
kubectl get pods -n kube-system:列出系统命名空间所有 Pod。| grep metrics-server:只过滤出名称包含metrics-server的 Pod。- 如果状态是
Running:说明容器跑起来了;如果是CrashLoopBackOff、ImagePullBackOff等,需要进一步看日志。
三、步骤 2:检查 Metrics Server 日志 🔍
kubectl logs -n kube-system deployment/metrics-server
解释:
kubectl logs:查看某个 Pod 或 Deployment 的日志。-n kube-system:命名空间还是系统级。deployment/metrics-server:直接看 Deployment 控制的 Pod 日志。- 如果日志中出现证书校验失败、无法访问 kubelet 等字样,就可以定位到是 TLS 或网络问题。(GitHub)
四、步骤 3:安装或重新安装 Metrics Server(适配 1.24)
1)准备官方组件清单
做法建议是:
- 从官方仓库下载当前版本的
components.yaml(与 v1.24 兼容的 Metrics Server,比如 0.6.x 或更新版本)。(Gbase8) - 保存为本地文件,例如
metrics-server-components.yaml。
2)应用安装清单
kubectl apply -f metrics-server-components.yaml
解释:
kubectl apply -f:根据本地 YAML 文件创建或更新集群资源。metrics-server-components.yaml:里边通常包含 ServiceAccount、ClusterRole、ClusterRoleBinding、Deployment、Service 等一整套对象。- 命令执行成功后,稍等十几秒再查看 Pod 状态。
注意:K8s v1.24 之后不再自动为 ServiceAccount 创建旧式 token Secret,老版本 manifest 可能因此有问题,一定要使用官方更新后的清单。(GitHub)
五、步骤 4:为自签名 kubelet 证书环境加启动参数(高频坑)⚠️
在很多自建集群、内网集群中,kubelet 使用自签名证书,这时 Metrics Server 访问 kubelet 容易出现证书校验失败。典型修复方式是在 Deployment 中为容器增加参数。
1)示例:Metrics Server Deployment 关键片段
spec:
template:
spec:
containers:
- name: metrics-server
args:
- --secure-port=4443
- --kubelet-insecure-tls
- --kubelet-preferred-address-types=InternalIP,Hostname,ExternalIP
- --metric-resolution=15s
解释(每一行都很关键):
--secure-port=4443- Metrics Server 自身对外提供 HTTPS 服务的端口,一般默认即可,不用改。
--kubelet-insecure-tls- 忽略访问 kubelet 时的证书校验,解决自签名证书不被信任导致的错误。
- 这是最常见的“加上就好了”的参数,但要清楚这是在放宽安全校验,只适合可信内网环境。(Last9)
--kubelet-preferred-address-types=InternalIP,Hostname,ExternalIP- 指定 Metrics Server 访问 kubelet 时优先使用的节点地址类型,一般优先 InternalIP 以走内网。
--metric-resolution=15s- 指定采集间隔为 15 秒。频率越高数据越实时,对 Metrics Server 压力也越大。
修改完成后,需要滚动重启:
kubectl rollout restart deployment metrics-server -n kube-system
解释:
kubectl rollout restart:触发 Deployment 的滚动重启。deployment metrics-server:目标是 Metrics Server 的 Deployment。-n kube-system:仍然是系统命名空间。
六、步骤 5:验证 Metrics API 是否已经恢复 ✅
1)检查 APIService 注册情况
kubectl get apiservices | grep metrics
解释:
kubectl get apiservices:查看聚合 API 服务注册情况。