1. Kubernetes Dashboard 部署全指南
作为 Kubernetes 集群的官方 Web UI,Dashboard 提供了直观的资源管理和监控界面。我在生产环境中部署过数十次 Dashboard,这里分享一套经过验证的标准化安装流程和避坑经验。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与前置检查
2.1 集群健康状态确认
在开始部署前,必须确保集群基础服务正常运行:
bash复制kubectl get componentstatuses
预期应看到 scheduler、controller-manager、etcd 等组件状态均为 Healthy。我曾遇到过因证书过期导致 Dashboard 无法连接 API Server 的情况,所以建议同时检查证书有效期:
bash复制openssl x509 -noout -dates -in /etc/kubernetes/pki/apiserver.crt
2.2 资源配额评估
Dashboard 默认配置需要:
- 至少 300MiB 内存
- 0.5 核 CPU
- 1GiB 持久化存储(如果启用日志归档)
对于生产环境,建议通过 Helm values.yaml 调整资源限制:
yaml复制resources:
limits:
cpu: "1"
memory: "512Mi"
requests:
cpu: "0.5"
memory: "256Mi"
3. 三种部署方案对比
3.1 原生 YAML 部署(推荐测试环境)
bash复制kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml
这个官方 manifest 会创建:
- dashboard-metrics-scraper 服务
- kubernetes-dashboard 服务
- 对应的 ClusterRole 和 ServiceAccount
注意:v2.7.0 版本修复了 CVE-2022-3172 漏洞,务必使用最新版本
3.2 Helm 部署(适合生产环境)
bash复制helm repo add kubernetes-dashboard https://kubernetes.github.io/dashboard/
helm install kubernetes-dashboard kubernetes-dashboard/kubernetes-dashboard \
--namespace kubernetes-dashboard \
--create-namespace \
--set protocolHttp=true \
--set service.type=LoadBalancer
Helm 的优势在于可以灵活配置:
- 通过 values.yaml 自定义证书
- 调整副本数量实现高可用
- 集成 Prometheus metrics
3.3 Kustomize 定制化部署
对于需要深度定制的场景,建议使用 kustomization.yaml:
yaml复制apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- https://github.com/kubernetes/dashboard/blob/v2.7.0/aio/deploy/recommended.yaml
patchesStrategicMerge:
- patch.yaml
其中 patch.yaml 可修改服务类型、增加 sidecar 容器等。
4. 访问控制配置
4.1 ServiceAccount 权限管理
默认的 kubernetes-dashboard ServiceAccount 权限过大,应该创建最小权限角色:
yaml复制apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: dashboard-readonly
rules:
- apiGroups: [""]
resources: ["pods", "services", "nodes"]
verbs: ["get", "list", "watch"]
4.2 认证方式选择
4.2.1 Token 认证(开发环境)
创建 admin-user:
bash复制kubectl create serviceaccount admin-user -n kubernetes-dashboard
kubectl create clusterrolebinding admin-user \
--clusterrole=cluster-admin \
--serviceaccount=kubernetes-dashboard:admin-user
获取 Token:
bash复制kubectl -n kubernetes-dashboard create token admin-user
4.2.2 OIDC 集成(生产环境推荐)
修改 deployment 添加参数:
yaml复制args:
- --authentication-mode=oidc
- --oidc-issuer-url=https://your-oidc-provider.com
- --oidc-client-id=your-client-id
- --oidc-username-claim=email
5. 网络暴露方案
5.1 Ingress 配置示例(Nginx)
yaml复制apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: dashboard-ingress
namespace: kubernetes-dashboard
annotations:
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
nginx.ingress.kubernetes.io/ssl-passthrough: "true"
spec:
ingressClassName: nginx
rules:
- host: dashboard.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: kubernetes-dashboard
port:
number: 443
5.2 安全加固措施
- 启用审计日志:
yaml复制apiVersion: v1
kind: ConfigMap
metadata:
name: kubernetes-dashboard-settings
namespace: kubernetes-dashboard
data:
audit-log-path: "/var/log/dashboard/audit.log"
audit-log-maxage: "30"
- 网络策略限制访问源IP:
yaml复制apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: dashboard-firewall
namespace: kubernetes-dashboard
spec:
podSelector:
matchLabels:
k8s-app: kubernetes-dashboard
policyTypes:
- Ingress
ingress:
- from:
- ipBlock:
cidr: 192.168.1.0/24
6. 故障排查指南
6.1 常见错误及解决方案
| 错误现象 | 可能原因 | 解决方案 |
|---|---|---|
| 503 Service Unavailable | 证书不匹配 | 检查 secret 中的证书是否过期 |
| "your connection is not private" | 浏览器证书警告 | 导入自签名证书到受信任根 |
| "gateway token missing" | 认证配置错误 | 检查 --token-ttl 参数设置 |
| "permission denied" | RBAC 配置问题 | 验证 ClusterRoleBinding |
6.2 日志分析技巧
查看 Dashboard 容器日志:
bash复制kubectl logs -n kubernetes-dashboard \
$(kubectl get pods -n kubernetes-dashboard -o name) \
--tail=100 -f
重点关注以下日志模式:
"Metric client health check failed"→ 检查 metrics-server 安装"secret not found"→ 确认 kubernetes-dashboard-certs secret 存在"forbidden: User cannot..."→ 调整 RBAC 权限
7. 性能优化实践
7.1 缓存配置优化
在 deployment 中增加环境变量:
yaml复制env:
- name: DEFAULT_CACHE_TTL
value: "300"
- name: STORE_POLL_PERIOD
value: "60"
7.2 大集群处理方案
当节点超过 100 个时:
- 调整 API 查询分页大小:
yaml复制args:
- --apiserver-list-paginate=true
- --apiserver-list-batch-size=50
- 禁用不需要的聚合 API:
yaml复制args:
- --enable-insecure-login=false
- --disable-settings-authorizer=true
8. 高阶功能扩展
8.1 自定义插件开发
- 创建插件目录结构:
code复制plugins/
└── my-plugin/
├── backend/
│ └── main.go
└── frontend/
└── src/
└── plugin.ts
- 修改 deployment 挂载插件卷:
yaml复制volumeMounts:
- name: plugins-volume
mountPath: /plugins
8.2 与 Prometheus 集成
通过 annotations 暴露指标:
yaml复制template:
metadata:
annotations:
prometheus.io/scrape: "true"
prometheus.io/port: "8443"
prometheus.io/path: "/metrics"
9. 版本升级策略
9.1 滚动升级流程
- 先备份现有配置:
bash复制kubectl get all,secret,sa,role,rolebinding -n kubernetes-dashboard -o yaml > backup.yaml
- 执行 Helm upgrade:
bash复制helm upgrade kubernetes-dashboard kubernetes-dashboard/kubernetes-dashboard \
--version 2.7.0 \
--reuse-values
- 验证新版本:
bash复制kubectl -n kubernetes-dashboard get pods -w
10. 生产环境检查清单
- [ ] 确认已配置 Pod 反亲和性
- [ ] 验证 HPA 自动伸缩策略
- [ ] 检查网络策略是否限制出口流量
- [ ] 审计日志是否接入集中式日志系统
- [ ] 定期轮换 ServiceAccount token
我在实际运维中发现,Dashboard 最常见的性能瓶颈其实出现在 etcd 查询层。建议为 Dashboard 专用的 etcd 查询配置单独的 rate limit,避免影响集群核心组件通信。
