Linux系统安装Kubernetes Dashboard 可视化管理面板教程【详解】

直接使用 kubectl apply -f 部署官方的 recommended.yaml 文件,看起来是最简单的路径。但这里有个关键点:默认创建的服务类型是 ClusterIP,这意味着它只能在集群内部访问。如果你不修改 Service 类型或者使用 port-forward 进行端口转发,那么从浏览器是无论如何也连不上的,相当于白忙活一场。
为什么 dashboard 服务部署后打不开?
一个非常典型的场景是这样的:执行完 kubectl apply -f recommended.yaml 后,你用 kubectl get svc -n kubernetes-dashboard 命令查看,会发现 kubernetes-dashboard 服务的 TYPE 一栏赫然写着 ClusterIP,而 PORT(S) 也只有 443/TCP,没有任何对外暴露的端口。
- 这其实是官方有意为之的设计:默认配置以安全为优先,不主动开放外部访问。
- 如果你既没有配置
port-forward,也没有修改Service类型,那么用浏览器访问任何 IP 和端口组合,结果都只会是“连接被拒绝”。 - 更迷惑的是,错误日志里往往看不出什么端倪。运行
kubectl logs -n kubernetes-dashboard deploy/kubernetes-dashboard很可能显示一切正常,这很容易让人误以为服务已经“准备就绪”。
如何让 dashboard 从浏览器直接访问(NodePort 方式)
最直接的解决方案,是修改 recommended.yaml 文件中的 Service 定义。你需要把 type: ClusterIP 改成 type: NodePort,并且最好指定一个可用的端口号,比如 31313。
- 编辑你的 YAML 文件,找到
kind: Service下面的spec部分,确保它包含类似下面的配置:ports: - port: 443 targetPort: 8443 nodePort: 31313 type: NodePort
- 这里有个细节:
nodePort的取值范围必须是30000–32767。如果你指定了一个低于 30000 的端口,就会收到类似error validating data: ValidationError(Service.spec.ports[0]): invalid type for io.k8s.api.core.v1.ServicePort.nodePort的报错。 - 如果修改后应用时提示
Bind failed on port 31313,那说明宿主机上的这个端口已经被占用了,换个端口再试即可。 - 修改保存之后,重新运行
kubectl apply -f recommended.yaml就行。不用担心旧的资源,apply命令会自动完成更新。
token 登录失败的三个高频原因
服务能访问了,但拿到 token 粘贴到登录页后,却依然提示 Unauthorized 或 Forbidden?别急,这大概率是权限绑定或者 token 本身出了问题。
- 原因一:缺少 ClusterRoleBinding。 只运行
kubectl create serviceaccount dashboard-admin-sa创建服务账户是远远不够的。必须补上关键的一步:kubectl create clusterrolebinding dashboard-admin-sa --clusterrole=cluster-admin --serviceaccount=default:dashboard-admin-sa,将管理员权限绑定给这个账户。 - 原因二:token 过期了。 使用
kubectl create token命令生成的 token 默认有效期只有 1 小时,很容易过期。对于需要长期使用的场景,建议创建Secret类型的 token,或者改用kubeadm token create --ttl 0生成的永久 token。 - 原因三:命名空间搞错了。 运行
kubectl create token时,必须用-n kubernetes-dashboard指定 Dashboard 服务账户所在的命名空间,而不是默认的default空间。否则生成的 token 根本没有权限访问 Dashboard 的后端服务。
port-forward 临时调试更安全,但别用于生产
在开发或者测试阶段,其实更推荐使用 port-forward 的方式。它既不需要暴露节点端口,也免去了修改 YAML 文件的麻烦。
- 命令很简单:
kubectl -n kubernetes-dashboard port-forward svc/kubernetes-dashboard 8443:443。 - 然后在浏览器中打开
https://localhost:8443,并接受自签名证书的安全风险提示即可。 - 需要注意的是,这个命令默认在前台运行,你关闭终端,连接也就随之断开了。虽然可以加
&放到后台,但这个进程很容易随着 shell 退出而终止。 - 所以,必须警惕的是,这种方式绝对不要用于生产环境。因为它本质上依赖本地的
kubectl工具和集群 API Server 保持连接,一旦网络波动或者 kubeconfig 的权限发生变更,访问会立刻中断。
说到底,部署 Dashboard 真正的难点,往往不在于那几个步骤本身,而在于每一个环节都紧密依赖着前序配置的准确性:cgroup driver 是否和 Docker 保持一致、必要的 sysctl 参数是否已经生效、节点 hostname 里是否包含了不被允许的下划线、甚至 /etc/hosts 里 master 和 node 的解析能否双向可达……漏掉其中任何一环,Dashboard 就可能卡在永恒的 “Loading…” 状态,或者陷入登录重定向循环。因此,在动手应用 YAML 之前,花点时间确保 kubectl get nodes 和 kubectl get pods -A 都能正常返回结果,往往比急于求成更能节省你的时间。