通过RKE部署K8S集群后无法外部访问Kubernetes Dashboard
解决Kubernetes Dashboard无法通过API Server Proxy外部访问的问题
你这种场景我遇到过好几次——用Rancher RKE在AWS EC2(CentOS7 + Docker 17.03.2-ce)搭好K8S集群,Dashboard服务明明正常跑着,但就是没法通过API Server的proxy地址从外部访问。别着急,咱们一步步排查解决:
1. 先把AWS安全组这个最容易踩的坑排除掉
AWS的安全组是外部访问EC2的第一道关卡,先确认控制平面节点(也就是API Server所在的EC2实例)的安全组规则:
- 检查是否允许你的公网IP(或者测试环境临时放开0.0.0.0/0)访问6443端口(TCP)
- 如果没加这个规则,赶紧加上——很多时候问题就出在这!
2. 先在节点本地验证API Server Proxy是否正常
先排除外部网络的干扰,登录到API Server所在的EC2节点,执行这条命令测试本地访问:
curl -k https://127.0.0.1:6443/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/
- 如果返回一堆HTML代码,说明API Server的proxy功能本身是好的,问题出在外部网络或者节点防火墙;
- 如果返回错误,咱们继续往下查。
3. 检查CentOS 7的防火墙规则
CentOS7默认开着firewalld,很可能把6443端口拦了:
- 先看看当前的防火墙规则:
firewall-cmd --list-all
- 如果没看到6443端口的允许规则,添加并重启防火墙:
firewall-cmd --add-port=6443/tcp --permanent firewall-cmd --reload
- 测试环境图省事的话,也可以临时关掉firewalld:
systemctl stop firewalld systemctl disable firewalld
4. 验证Dashboard的RBAC权限配置
有时候权限不足也会导致访问异常(哪怕服务看起来正常):
- 先看看Dashboard的ServiceAccount和ClusterRoleBinding是否存在:
kubectl get serviceaccount kubernetes-dashboard -n kube-system kubectl get clusterrolebinding kubernetes-dashboard -n kube-system
- 如果ClusterRoleBinding缺失,直接创建一个高权限的绑定(官方推荐的配置):
新建一个dashboard-rbac.yaml文件,内容如下:
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: kubernetes-dashboard roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - kind: ServiceAccount name: kubernetes-dashboard namespace: kube-system
然后应用这个配置:
kubectl apply -f dashboard-rbac.yaml
5. 检查API Server的启动参数
RKE部署的API Server有时候可能缺了proxy相关的参数,咱们确认下:
- 查看API Server Pod的启动参数:
kubectl describe pod kube-apiserver-$(hostname) -n kube-system
- 找一找有没有
--enable-aggregator-routing=true这个参数——这是允许通过API Server proxy访问服务的必要配置; - 如果没有,修改你的RKE
cluster.yml配置文件,在services.kube-api部分添加额外参数:
services: kube-api: extra_args: enable-aggregator-routing: "true"
然后重新运行rke up更新集群。
6. 实在不行?换个访问方式:用NodePort暴露Dashboard
如果上面的方法都没解决,咱们绕开API Server proxy,直接用NodePort暴露Dashboard:
- 修改Dashboard服务的类型为NodePort:
kubectl patch service kubernetes-dashboard -n kube-system -p '{"spec":{"type":"NodePort"}}'
- 查看分配的NodePort端口:
kubectl get service kubernetes-dashboard -n kube-system
你会看到类似443:30123/TCP的输出,30123就是分配的NodePort;
- 最后在AWS安全组中放行这个NodePort(TCP),然后访问
https://<EC2节点公网IP>:30123就能打开Dashboard了。
内容的提问来源于stack exchange,提问作者luke035
相关产品推荐
相关产品推荐

