You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kubernetes v1.25三主集群部署Metrics Server后执行kubectl top nodes报错ServiceUnavailable及后续证书、超时问题求助

Kubernetes v1.25三主集群部署Metrics Server后执行kubectl top nodes报错ServiceUnavailable及后续证书、超时问题求助

我来帮你梳理下遇到的问题,结合你描述的几个阶段,咱们一步步排查和尝试解决:

先明确你的环境信息:

Kubernetes版本:v1.25.0
集群节点:
NAME              STATUS   ROLES           AGE    VERSION
master21.server   Ready    control-plane   77d    v1.25.0
master22.server   Ready    control-plane   22h    v1.25.0
master23.server   Ready    control-plane   265d   v1.25.0
worker31.server   Ready    worker          265d   v1.25.0
worker32.server   Ready    worker          265d   v1.25.0

问题阶段梳理&解决建议

1. 初始阶段:部署Metrics Server后执行kubectl top nodes报ServiceUnavailable

这个报错通常意味着Metrics Server的服务还没正常提供metrics数据,或者API Server还没和Metrics Server的APIService建立连接。你当时看到Pod没有重启/报错,可能是Pod看起来Running但实际内部逻辑有问题,这时候查看Pod日志是正确的方向——你后来也确实找到了证书相关的报错。

2. 第二阶段:日志出现x509: cannot validate certificate for 192.168.1.22 because it doesn't contain any IP SANs

这个报错是因为Metrics Server用节点IP访问kubelet时,kubelet的证书里没有包含对应IP的SAN字段,导致证书验证失败。你修改--kubelet-preferred-address-types优先用Hostname是正确的思路,但这里要注意两个点:

  • 确认集群内的DNS服务能正确解析master23.server这类主机名,如果DNS解析有问题,用Hostname访问也会失败。
  • 检查kubelet的证书是否包含主机名的SAN字段,默认情况下kubelet证书应该会包含主机名,但如果是手动生成的证书可能遗漏了。

3. 第三阶段:修改地址类型后出现超时,怀疑--kubelet-insecure-tls未生效

这是当前核心问题,建议从这几个方向排查:

  • 确认--kubelet-insecure-tls参数是否正确配置:有些命令行参数是flag型(不需要赋值=true),只需要写--kubelet-insecure-tls即可。检查你components.yaml里的Metrics Server容器args配置,确保格式正确,比如:
    containers:
    - name: metrics-server
      image: k8s.gcr.io/metrics-server/metrics-server:v0.6.4
      args:
        - --cert-dir=/tmp
        - --secure-port=4443
        - --kubelet-insecure-tls
        - --kubelet-preferred-address-types=Hostname,InternalDNS,InternalIP,ExternalDNS,ExternalIP
    
    要确保参数是在容器的args数组里,不是其他字段,而且没有拼写错误。
  • 验证参数是否真的生效:进入Metrics Server的Pod,查看进程启动参数,确认--kubelet-insecure-tls存在:
    kubectl exec -n kube-system <你的metrics-server-pod名称> -- ps aux
    
    如果看不到这个参数,说明yaml配置没生效,可能是你修改的位置不对,或者部署时yaml没更新成功(可以先删除旧的再重新部署:kubectl delete -f components.yaml && kubectl apply -f components.yaml)。
  • 排查网络连通性:超时报错context deadline exceeded大概率是网络问题。在Metrics Server的Pod里尝试访问master23.server的kubelet端口:
    kubectl exec -n kube-system <你的metrics-server-pod名称> -- curl https://master23.server:10250/metrics/resource -k
    
    这里加-k是忽略证书验证,如果还是超时,说明节点之间的10250端口被防火墙、网络策略或者集群网络插件拦截了,需要检查:
    • 节点防火墙是否开放了10250端口(集群内部节点之间的访问)
    • 有没有配置NetworkPolicy阻止了kube-system命名空间的Pod访问其他节点的10250端口
    • 集群网络插件(比如Calico、Flannel)是否正常,有没有网络不通的情况
  • 检查Metrics Server的APIService状态:执行kubectl get apiservices v1beta1.metrics.k8s.io,如果状态不是Available,说明API Server还没成功连接Metrics Server,这时候可以查看APIService的事件:kubectl describe apiservices v1beta1.metrics.k8s.io,里面会有详细的错误信息。

额外建议

如果上述排查都没问题,可以尝试降级Metrics Server版本到适配v1.25的稳定版(比如v0.6.4,这是官方推荐的适配v1.25的版本),有时候新版本可能和特定K8s版本有兼容性问题。

备注:内容来源于stack exchange,提问作者kaushal47

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.20 07:48:13