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,ExternalIPargs数组里,不是其他字段,而且没有拼写错误。 - 验证参数是否真的生效:进入Metrics Server的Pod,查看进程启动参数,确认
--kubelet-insecure-tls存在:
如果看不到这个参数,说明yaml配置没生效,可能是你修改的位置不对,或者部署时yaml没更新成功(可以先删除旧的再重新部署:kubectl exec -n kube-system <你的metrics-server-pod名称> -- ps auxkubectl 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
相关产品推荐
相关产品推荐

