自建 K8s 1.25 集群里 kubectl top nodes 直接报 error: Metrics API not available,Prometheus 里 node-exporter 的 CPU 曲线一直正常,HPA 也因此不扩缩容。

这类报错背后常见的原因有几处,逐个排除就行。metrics-server 的 Service 没有 Endpoints,Pod 因为证书校验失败一直重启,HPA 读到的永远是一条空指标;aggregation 层没配 APIService,kubectl 找不到 metrics.k8s.io 这个 API 组;metrics-server 启动参数缺少 –kubelet-insecure-tls,自签证书场景直接退出;节点间 10250 端口被安全组挡住,抓不到 kubelet 的 summary 接口。

动手时先看 APIService 是否存在且可用

kubectl get apiservice v1beta1.metrics.k8s.io -o wide

接着查 metrics-server 的 Pod 状态和报错

kubectl -n kube-system logs deploy/metrics-server --tail=50

补上跳过 kubelet 证书校验的参数

kubectl -n kube-system patch deploy metrics-server --type=json -p '[{"op":"add","path":"/spec/template/spec/containers/0/args/-","value":"--kubelet-insecure-tls"}]'

等前面都确认过,再确认 Service 已经挂上后端

kubectl -n kube-system get endpoints metrics-server

那几天正好在做别的变更,先把时间线对齐才敢动手。

排查用的命令都是临时敲的,没有写成脚本,事后才整理。

改完先别撤,确认这几项。kubectl top nodes 能列出各节点 CPU 与内存用量,HPA 的 TARGETS 从 unknown 变成百分比,metrics-server 的重启次数不再增加。

补一句。Prometheus 有数据和 metrics API 可用是两件事,HPA 只认后者;自签证书集群里丢了这个参数,Pod 会反复 CrashLoop 而不报证书错误。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。

作者 9823189