文档首页> IDC服务> 蓝易云:k8s版本v1.24,kubectl top pod

蓝易云: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-server not 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:说明容器跑起来了;如果是 CrashLoopBackOffImagePullBackOff 等,需要进一步看日志。

三、步骤 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)准备官方组件清单

做法建议是:

  1. 从官方仓库下载当前版本的 components.yaml(与 v1.24 兼容的 Metrics Server,比如 0.6.x 或更新版本)。(Gbase8)
  2. 保存为本地文件,例如 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

解释: