Kubernetes Metrics-Server从所有节点获取数据时返回403错误
看起来你已经把集群的基础部署都搞定了,结果卡在Metrics-Server的403权限问题上——这在测试集群里确实挺常见的,我来给你捋捋几个可能的解决方向:
检查RBAC权限配置
官方的components.yaml里其实已经包含了Metrics-Server需要的ClusterRole和ClusterRoleBinding,但有时候因为集群初始化时的RBAC设置差异,可能会出现权限缺失的情况。你可以先确认对应的资源绑定是否正确:- 查看ClusterRole:
kubectl get clusterrole metrics-server,检查它是否包含nodes/metrics、pods/metrics、nodes/stats这些关键权限 - 查看ClusterRoleBinding:
kubectl get clusterrolebinding metrics-server,确认它绑定到了kube-system:metrics-server这个ServiceAccount
如果发现权限有遗漏,你可以重新apply官方的配置文件,或者手动补全缺失的权限规则。
- 查看ClusterRole:
调整kubelet的认证与地址配置
你已经加了--kubelet-insecure-tls跳过证书验证,但403是权限认证问题,和TLS验证是两码事。试试给Metrics-Server的Deployment再加个参数:--kubelet-preferred-address-types=InternalIP,有时候节点的地址解析(比如用了主机名但DNS没配置好)会导致kubelet无法正确识别Metrics-Server的身份。
另外,你可以检查节点上的kubelet配置(通常在/var/lib/kubelet/config.yaml),看看是否开启了匿名认证:如果authentication.anonymous.enabled设为false,那Metrics-Server必须用有效的ServiceAccount令牌访问kubelet,这时候就得确保前面的RBAC配置完全正确。验证ServiceAccount令牌的有效性
你可以直接进入Metrics-Server的Pod,测试它的令牌能不能正常访问kubelet的metrics端点:- 先获取Pod名称:
kubectl get pods -n kube-system | grep metrics-server - 进入Pod并复制令牌:
kubectl exec -n kube-system <metrics-server-pod-name> -- cat /var/run/secrets/kubernetes.io/serviceaccount/token - 用curl测试访问(替换成你的节点IP):
如果返回403,那说明这个令牌确实没有访问权限,得回头检查ClusterRole的权限规则是否覆盖了kubelet的metrics端点。curl -k https://<node-ip>:10250/metrics/resource -H "Authorization: Bearer <刚才复制的令牌>"
- 先获取Pod名称:
排查网络连通性问题
虽然你说其他功能都正常,但还是得确认Metrics-Server的Pod能访问到节点的10250端口(kubelet的metrics端口)。可以在Pod里用telnet测试:kubectl exec -n kube-system <metrics-server-pod-name> -- telnet <node-ip> 10250如果连接失败,可能是CNI插件的防火墙规则限制了这个端口的访问,需要调整插件的网络策略。
你可以先从RBAC权限和kubelet认证这两点入手排查,测试集群里通常这两个地方出问题的概率最高。如果还是不行,可以把Metrics-Server的具体日志贴出来,这样能更精准定位问题~
备注:内容来源于stack exchange,提问作者Seididieci

