作为 Kubernetes 集群的可视化管理门户,Dashboard 提供了直观的 Web UI 界面,让管理员能够轻松查看和管理集群资源。我在多个生产环境中部署过不同版本的 Dashboard,今天将分享最实用的部署方案和避坑经验。
这次我们以 v2.7.0 版本为例,重点解决内网环境部署、节点调度控制、访问安全配置等实际问题。不同于官方文档的通用方案,我会特别说明每个调整背后的考量,并针对 Kubernetes 1.24 版本前后的重要变化给出兼容性方案。
在内网环境部署时,需要提前下载好相关镜像。这里有两个关键镜像:
bash复制# 控制台主镜像 (178MB)
docker pull kubernetesui/dashboard:v2.7.0
# 指标采集器镜像 (40MB)
docker pull kubernetesui/metrics-scraper:v1.0.8
保存镜像到本地文件:
bash复制docker save kubernetesui/dashboard:v2.7.0 -o dashboard-v2.7.0.tar
docker save kubernetesui/metrics-scraper:v1.0.8 -o metrics-scraper-v1.0.8.tar
经验之谈:即使有外网访问权限,也建议提前下载镜像。我曾遇到过因网络抖动导致 kubectl apply 超时的情况,提前准备能确保部署过程一气呵成。
下载对应版本的部署清单文件:
bash复制wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml
文件结构解析:
原始配置需要调整三个关键点:
yaml复制kind: Service
spec:
type: NodePort # 修改为NodePort
ports:
- nodePort: 30098 # 添加nodePort定义
yaml复制kind: Deployment
spec:
nodeName: k8s-master.obboda.org # 指定运行节点
yaml复制containers:
- imagePullPolicy: IfNotPresent # 改为优先使用本地镜像
NodePort vs Ingress:
节点绑定的必要性:
拉取策略调整:
bash复制kubectl apply -f recommended.yaml
验证部署状态:
bash复制kubectl -n kubernetes-dashboard get pod,svc
预期输出应显示两个 Running 状态的 Pod 和 NodePort 类型的 Service。
创建管理员级 ServiceAccount:
bash复制kubectl create serviceaccount dashboard-admin -n kubernetes-dashboard
绑定集群角色:
bash复制kubectl create clusterrolebinding dashboard-admin-binding \
--clusterrole=cluster-admin \
--serviceaccount=kubernetes-dashboard:dashboard-admin
安全提示:生产环境应遵循最小权限原则,可根据实际需求创建定制化 Role 而非直接使用 cluster-admin。
通过 NodePort 暴露的地址访问:
code复制https://<节点IP>:30098
注意:
自动生成的 Secret 令牌查看方式:
bash复制kubectl -n kubernetes-dashboard get secret
kubectl -n kubernetes-dashboard describe secret <token-secret-name>
特点:
手动创建临时令牌:
bash复制# 默认1小时有效期
kubectl -n kubernetes-dashboard create token dashboard-admin
# 可指定有效期(如7天)
kubectl -n kubernetes-dashboard create token dashboard-admin --duration=168h
重要变化:
症状:
解决方案:
bash复制docker images | grep kubernetesui
症状:
排查步骤:
bash复制kubectl -n kubernetes-dashboard get svc
bash复制curl -k https://localhost:30098
症状:
解决方法:
bash复制kubectl -n kubernetes-dashboard get secret <token-name> -o jsonpath='{.data.token}' | base64 --decode | jq -R 'split(".")[1] | @base64d | fromjson | .exp'
Ingress 集成:
审计日志:
yaml复制apiVersion: v1
kind: ConfigMap
metadata:
name: dashboard-audit-log
namespace: kubernetes-dashboard
data:
audit-log-enabled: "true"
audit-log-path: "/var/log/dashboard-audit.log"
自动令牌续期:
bash复制# 使用kubectl定时任务更新令牌
while true; do
kubectl -n kubernetes-dashboard create token dashboard-admin --duration=8h > token.txt
sleep 6h
done
资源限制:
yaml复制resources:
limits:
cpu: "1"
memory: 512Mi
requests:
cpu: "0.5"
memory: 256Mi
我在实际运维中发现,Dashboard 在以下场景特别有价值:
对于关键生产环境,建议配合 Prometheus 和 Grafana 实现更全面的监控体系。Dashboard 更适合作为辅助管理工具而非唯一的监控方案。