Kubernetes Dashboard 安装部署、访问与管理实战实验
本次实验旨在完成 Kubernetes Dashboard 的部署、配置及访问,掌握通过 Helm 安装 Dashboard、创建访问权限、配置端口转发及 NodePort 访问方式,并实现基于令牌的安全登录,最终通过 Web 界面管理 Kubernetes 集群资源。
实验环境
- 单节点 Kubernetes 集群(master 节点)
- 操作系统:CentOS/RHEL
- Kubernetes 版本:v1.24+
- Helm 版本:v3.12.3
Dashboard 是基于网页的 Kubernetes 用户界面。
你可以使用 Dashboard 将容器应用部署到Kubernetes 集群中,也可以对容器应用排错,还能管理集群资源。 你可以使用 Dashboard 获取运行在集群中的应用的概览信息,也可以创建或者修改 Kubernetes 资源 (如 Deployment、Job、DaemonSet 等等)。 例如,你可以对 Deployment 实现弹性伸缩、发起滚动升级、重启 Pod 或者使用向导创建新的应用。
Dashboard 同时展示了 Kubernetes 集群中的资源状态信息和所有报错信息。
https://kubernetes.io/zh-cn/docs/tasks/access-application-cluster/web-ui-dashboard/ 官方解释
Kubernetes Dashboard 目前仅支持基于 Helm 的安装,因为它速度更快, 并且可以让我们更好地控制
Dashboard 运行所需的所有依赖项。
https://cloud.tencent.com/developer/article/2497939 Kubernetes 包管理工具之 Helm 简介
注意:要在有k8s的虚拟机中完成
1.手动下载安装Helm (适用于内网/离线环境)
也可以使用官方脚本一键安装,二选一即可,我选择手动安装
# 官方脚本一键安装helm
# 原理:脚本会自动下载最新版本的 Helm 二进制文件并安装到系统路径。
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
chmod 700 get_helm.sh
sudo ./get_helm.sh
helm version
手动安装helm
# 下载wget工具
yum install -y wget# 下载 Helm v3.12.3(根据系统架构,如 `linux-amd64`,选择版本)
wget https://get.helm.sh/helm-v3.12.3-linux-amd64.tar.gz# 解压后将 `helm` 文件移动到系统 PATH 目录(如 `/usr/local/bin`)
tar -zxvf helm-v3.12.3-linux-amd64.tar.gz
sudo mv linux-amd64/helm /usr/local/bin/helm# 验证安装
helm version
2.默认情况下不会部署 Dashboard,可以通过以下命令部署
# 进入目录
cd /etc/yum.repos.d/# 添加 kubernetes-dashboard 仓库
helm repo add kubernetes-dashboard https://kubernetes.github.io/dashboard/# 使用 kubernetes-dashboard Chart 部署名为 kubernetes-dashboard 的 Helm Release
helm upgrade --install kubernetes-dashboard kubernetes-dashboard/kubernetes-dashboard --create-namespace --namespace kubernetes-dashboard# 多了一个命名空间kubernetes-dashboard
kubectl get namespaces# 查看kubernetes-dashboard 产生的pod
kubectl get pod -n kubernetes-dashboard# 查看service,其中 kubernetes-dashboard-kong-proxy 是我们访问的主要pod;
kubectl get svc -A
错误情况处理:
从输出来看,Kubernetes Dashboard 已经成功部署,但所有 Pod 都处于 Pending 状态,这表示它们无法被调度到节点上运行。
进行诊断,定位问题出现在哪,可以将以下命令的输出导入ai询问解决办法
# 检查 Pod 的 Pending 原因
kubectl describe pods -n kubernetes-dashboard重点关注 Events 部分的错误信息,常见原因包括:
资源不足(CPU/内存不够)。
节点选择器/污点不匹配。
PV/PVC 问题(如果 Dashboard 需要持久化存储)。# 检查节点资源状态
kubectl get nodes# 定位具体原因
kubectl describe pods
kubectl describe nodes
从你的诊断信息来看,Kubernetes Dashboard 的 Pod 处于 Pending 状态的主要原因是 节点调度问题。具体表现为:
核心问题分析
-
节点状态异常:
-
master
节点:Ready
,但有污点node-role.kubernetes.io/control-plane:NoSchedule
(默认不允许调度普通 Pod)。 -
node1
和node2
:NotReady
,且有污点node.kubernetes.io/unreachable:NoSchedule
(节点失联导致不可调度)。
-
-
调度失败的直接原因:
-
所有 Dashboard Pod 因节点污点无法调度到任何节点:
0/3 nodes are available:
1 node(s) had untolerated taint {node-role.kubernetes.io/control-plane: },
2 node(s) had untolerated taint {node.kubernetes.io/unreachable: }.
-
由于本实验仅使用一台k8s的master节点的机子,可采用临时的解决办法,不需要将node1和node2变成ready,只需要临时允许 Pod 调度到 master
# 1. 删除 master 的 NoSchedule 污点
kubectl taint nodes master node-role.kubernetes.io/control-plane:NoSchedule-# 2. 重新部署 Dashboard(触发重新调度)
helm upgrade --install kubernetes-dashboard kubernetes-dashboard/kubernetes-dashboard \--namespace kubernetes-dashboard
https://localhost:8443
验证修复结果
# 查看kubernetes-dashboard 产生的pod
kubectl get pod -n kubernetes-dashboard# 查看service,其中 kubernetes-dashboard-kong-proxy 是我们访问的主要pod;
kubectl get svc -A
3.访问 Dashboard 用户界面
访问方式 | 原理 | 优势 | 常见问题 |
---|---|---|---|
NodePort(10.1.1.85:30083) | 通过集群节点的物理端口访问,无需本地进程 | 可远程访问 | 防火墙限制、证书验证 |
端口转发(localhost:8443) | 通过 kubectl 进程将本地端口映射到集群 Service,仅本地可用 | 无需开放节点防火墙 | 进程终止、端口占用、浏览器限制 |
(1)执行如下指令:启动dashboard(本地开发访问方式)
# 启动命令进行端口转发
kubectl -n kubernetes-dashboard port-forward svc/kubernetes-dashboard-kong-proxy 8443:443 --address 0.0.0.0 &kubectl 会使得 Dashboard 可以通过 [https://localhost:8443](https://localhost:8443/)
访问。
UI **只能**通过执行这条命令的机器进行访问。# 验证端口已绑定
ss -tulnp | grep 8443# 若返回 HTML 内容,说明端口转发正常
curl -k https://localhost:8443
此时正常情况可以通过访问Kubernetes 仪表板(本地访问)
注意:登录需要token,且token有时效性,获得令牌的步骤在下面
https://10.1.1.85:8443/
(2)创建 ServiceAccount 及ClusterRoleBinding角色绑定
K8S有两种用户:User 和 Service Account,User 给人用,Service Account 给进程用,让进程有相关权限,Dashboard 是一个进程,我们就可以创建一个Service Account 给它
通过命令方式创建用户和绑定角色(也可以通过yaml 文件创建)
创建 ServiceAccount 和 ClusterRoleBinding(授予管理员权限)# 创建 ServiceAccount(管理员账户)
kubectl create serviceaccount admin01 -n kubernetes-dashboard# 绑定 ClusterRoleBinding(授予集群管理员权限)
kubectl create clusterrolebinding admin01 --clusterrole=cluster-admin \--serviceaccount=kubernetes-dashboard:admin01
(3)创建对应服务账号的token,我选择自定义token有效期为24h
生成访问令牌(Token)正常来说时间不用太长# 生成默认有效期(1小时)的令牌
kubectl -n kubernetes-dashboard create token admin01# 生成自定义有效期(24小时)的令牌
kubectl -n kubernetes-dashboard create token admin01 --duration 24heyJhbGciOiJSUzI1NiIsImtpZCI6ImxTR3lxNnE3UlI2em9qLUM0d3JMWHFOcG5MOUllWDZRY1ZYOU5MRGs3NTQifQ.eyJhdWQiOlsiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWwiXSwiZXhwIjoxNzQ4NDIzMjk1LCJpYXQiOjE3NDgzMzY4OTUsImlzcyI6Imh0dHBzOi8va3ViZXJuZXRlcy5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsIiwia3ViZXJuZXRlcy5pbyI6eyJuYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsInNlcnZpY2VhY2NvdW50Ijp7Im5hbWUiOiJhZG1pbjAxIiwidWlkIjoiNTM2ZjZjODYtMDQ1Mi00MTA2LTg4MzYtNmZkZDFlYzY4OTc3In19LCJuYmYiOjE3NDgzMzY4OTUsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlcm5ldGVzLWRhc2hib2FyZDphZG1pbjAxIn0.Uh55Iqr1gWlcCXrEFMhQcB2gmNDSiqNkJPv4b_m7kQqKxL59sSOgPTNov4PCgrP9mmYgb-hahBarMJ0JRPelYPA3vFt20sT1MAQR3V-xNpRITUUkqEY3UZ_5D7UTSYjP9624r5-vsZ_cQj60Kfcm9zsmZTXD67nAX_MB8RtYBwWvg-fEcvRDYpSugTQz8TePmcGTFUyOxClGDby4n9N6SKFtoSJFaBJVa7neKeFE6DWA3L3Xlc1S9HObzbo2_BZct4LJnqHoIcjv2uQoRy2goiVJzuRU_fqnZaJkKjQDxmp8IBfkQScSpBQwECNvqeP3wLwPR34CshwjrBjzRMWneg
(4)修改端口类型,可以实现外部访问
修改 Service 类型为 NodePort(外部访问)# 修改 Service 类型为 NodePort
kubectl patch svc kubernetes-dashboard-kong-proxy -n kubernetes-dashboard \--type='json' -p '[{"op":"replace","path":"/spec/type","value":"NodePort"}]'# 指定固定 NodePort(例如 30083)
kubectl patch svc kubernetes-dashboard-kong-proxy -n kubernetes-dashboard \--type='json' -p '[{"op":"add","path":"/spec/ports/0/nodePort","value":30083}]'
测试访问:https://10.1.1.85:30083/
由于 Dashboard 使用的是自签名证书,浏览器会显示安全警告。不同浏览器的处理方式如下:
- Chrome/Edge:
输入地址后可能会看到 “此站点不安全” 的提示,点击 “高级” → “继续前往 localhost(不安全)”。 - Firefox:
点击 “高级” → “接受风险并继续”。 - Safari:
可能需要先在 “系统偏好设置” → “安全性与隐私” 中允许访问该证书。
输入令牌点击登录
出现以下页面即可
4. k8s dashboard 的基本使用
(1)点击pods,创建pod(三种方式)
直接编写yaml或json 文件;导入已经写好的yaml或json;通过表单创建
点击部署,刷新状态查看
点击对应的pod 能看到详细信息;类似与 kubectl describe pod xx
(2)pod具体操作——点击 如下图标,看看作用
1为查看日志
2为在pod中运行
3为编辑资源
4为删除资源
5.扩展内容
(1)权限查询
role: 名称空间的系统权限
clusterrole:全局权限
(2)系统权限
查询某一个名称空间内的所有系统权限
kubectl -n kube-system get role
查询名称空间内的系统权限的详细信息
kubectl -n kube-system describe role kube-proxy
(3)全局权限
查看所有全局权限
kubectl -n kube-system get clusterrole
指定查看某一个权限的详细信息
kubectl -n kube-system describe clusterrole admin
(4)查看用户
kubectl get serviceaccounts [用户名] -n kubernetes-dashboard
示例:
# 查询 kubernetes-dashboard 命名空间下的所有 ServiceAccount
kubectl get serviceaccounts -n kubernetes-dashboard
6.验证内容
-
部署验证
- Dashboard 相关 Pod 均处于
Running
状态,包括 API、Auth、Kong 代理和 Web 组件 - Service 配置正确,
kubernetes-dashboard-kong-proxy
暴露目标端口
- Dashboard 相关 Pod 均处于
-
访问验证
- 本地端口转发访问
https://localhost:8443
成功返回 Dashboard 页面 - NodePort 方式访问
https://10.1.1.85:30083
可正常登录 - 令牌验证通过,可进入集群管理界面
- 本地端口转发访问
-
功能验证
- 成功通过 Web 界面创建 Pod、查看资源状态
- 实现 Pod 日志查看、在线编辑、删除等操作
- 验证 RBAC 权限查询功能,可查看 Role、ClusterRole 及 ServiceAccount 信息
7.关键问题与解决方案
-
Pod 调度失败
- 原因:master 节点默认禁止调度普通 Pod(
NoSchedule
污点) - 解决:移除污点
kubectl taint nodes master node-role.kubernetes.io/control-plane:NoSchedule-
- 原因:master 节点默认禁止调度普通 Pod(
-
端口占用问题
- 原因:
port-forward
进程未正确终止导致端口残留 - 解决:强制终止进程
pkill -9 -f "kubectl port-forward"
,重新启动转发
- 原因:
-
证书验证失败
- 原因:自签名证书未被浏览器信任
- 解决:Chrome 中输入
thisisunsafe
强制跳过,或导入证书到浏览器信任列表
-
令牌失效问题
- 原因:默认令牌有效期仅 1 小时
- 解决:使用
--duration
参数生成长期令牌(如24h
)
本次实验完整实现了 Kubernetes Dashboard 的部署与访问,验证了从环境准备、组件部署、权限配置到界面操作的全流程。通过解决节点调度、端口占用、证书验证等典型问题,掌握了 Dashboard 在单节点集群中的实用部署方案。Dashboard 作为 Kubernetes 的图形化管理工具,有效降低了集群操作门槛,但其安全配置和性能优化仍需在实际应用中持续关注。