1. 项目概述
在Kubernetes高可用集群中部署Dashboard是每个管理员都会遇到的基础任务。这次我们要在基于containerd运行时的HA集群上完成Dashboard部署,这个组合在Kubernetes 1.28版本中已经成为生产环境的标准配置。不同于简单的单节点部署,HA环境下的Dashboard需要考虑服务发现、负载均衡和访问控制等特殊因素。
我最近在三个不同的生产集群中实施了这套方案,发现containerd运行时下的Dashboard部署有些容易被忽略的细节。比如镜像拉取策略的配置、服务账户权限的精细控制,以及如何正确处理新版Dashboard的令牌认证流程。这些经验我都会在后续章节详细展开。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与前置检查
2.1 集群状态验证
在开始部署前,先用kubectl检查集群节点状态:
bash复制kubectl get nodes -o wide
正常输出应显示所有节点状态为Ready,且CONTAINER-RUNTIME列显示containerd://版本号。如果发现节点使用docker运行时,需要先完成运行时迁移。
注意:混合运行时环境会导致Dashboard Pod调度异常,我曾遇到过因为节点标签未正确设置,导致Pod被调度到docker节点无法启动的情况。
2.2 网络插件检查
Dashboard需要集群内网络互通,验证Calico/Flannel等CNI插件状态:
bash复制kubectl get pods -n kube-system | grep -E 'calico|flannel'
确保所有网络插件Pod运行正常。遇到过因为网络策略配置不当导致Dashboard无法访问API Server的情况,可以通过临时放宽策略来定位问题。
2.3 镜像仓库配置
containerd需要正确配置镜像仓库凭证(特别是私有仓库):
bash复制cat /etc/containerd/config.toml | grep -A 5 'registry.mirrors'
如果使用国内环境,建议配置镜像加速器。最近部署时发现官方Dashboard镜像拉取超时,换成阿里云镜像后解决。
3. Dashboard部署实战
3.1 部署清单解析
使用官方推荐的部署清单,但需要针对HA环境做以下修改:
yaml复制# dashboard.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: kubernetes-dashboard
namespace: kubernetes-dashboard
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
replicas: 2 # HA环境下建议至少2个副本
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 0 # 保证至少有一个Pod可用
selector:
matchLabels:
k8s-app: kubernetes-dashboard
template:
metadata:
labels:
k8s-app: kubernetes-dashboard
spec:
serviceAccountName: kubernetes-dashboard
containers:
- name: kubernetes-dashboard
image: kubernetesui/dashboard:v2.7.0
imagePullPolicy: IfNotPresent # 生产环境建议改为Always
ports:
- containerPort: 8443
protocol: TCP
args:
- --auto-generate-certificates
- --enable-skip-login # 允许跳过登录
volumeMounts:
- mountPath: /certs
name: kubernetes-dashboard-certs
volumes:
- name: kubernetes-dashboard-certs
emptyDir: {}
nodeSelector:
kubernetes.io/os: linux # 明确指定节点类型
关键修改点:
- 增加了replicas数量实现高可用
- 设置maxUnavailable为0确保服务不中断
- 明确指定linux节点调度
- 添加--enable-skip-login参数方便测试
3.2 服务暴露方式选择
HA环境下推荐使用Ingress暴露服务,配合负载均衡器:
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
如果使用NodePort方式,需要注意:
bash复制kubectl get svc -n kubernetes-dashboard
记录下NodePort端口,然后在所有节点配置防火墙规则。实测发现某些云平台需要额外配置安全组。
4. 认证与权限配置
4.1 服务账户RBAC配置
最小权限原则配置RBAC:
yaml复制apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: kubernetes-dashboard
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: kubernetes-dashboard
subjects:
- kind: ServiceAccount
name: kubernetes-dashboard
namespace: kubernetes-dashboard
重要安全提示:不要直接使用cluster-admin权限,这会导致严重的安全风险。我见过因为权限过大导致Dashboard被攻破后整个集群沦陷的案例。
4.2 令牌认证流程
新版Dashboard的认证流程有所变化:
- 创建访问令牌:
bash复制kubectl -n kubernetes-dashboard create token kubernetes-dashboard
-
复制输出的令牌字符串
-
在Dashboard登录界面选择"Token"方式粘贴
常见问题处理:
- 如果遇到"unauthorized: gateway token missing"错误,检查kube-apiserver的--enable-bootstrap-token-auth参数是否启用
- 令牌过期时间可以通过--token-ttl参数调整,默认是24小时
5. 运维与监控
5.1 健康检查配置
为Dashboard添加就绪和存活探针:
yaml复制livenessProbe:
httpGet:
scheme: HTTPS
path: /
port: 8443
initialDelaySeconds: 30
timeoutSeconds: 5
readinessProbe:
httpGet:
scheme: HTTPS
path: /
port: 8443
initialDelaySeconds: 5
timeoutSeconds: 5
5.2 日志收集配置
containerd下的日志收集方式与docker不同:
bash复制# 查看Dashboard容器日志
journalctl -u containerd -f | grep kubernetes-dashboard
建议配置Fluentd或Filebeat将日志收集到中央系统。遇到过因为日志量过大导致节点磁盘爆满的情况,可以通过logrotate控制。
6. 故障排查实录
6.1 常见问题速查表
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| Dashboard无法访问 | 网络策略限制 | 检查NetworkPolicy配置 |
| 令牌认证失败 | RBAC配置错误 | 验证ClusterRoleBinding |
| 镜像拉取失败 | containerd配置错误 | 检查/etc/containerd/config.toml |
| 页面加载缓慢 | 资源不足 | 增加Pod内存限制 |
6.2 典型错误处理
案例:Dashboard页面打开后立即跳转至空白页
排查步骤:
- 检查浏览器控制台发现401错误
- 查看kube-apiserver日志发现证书不匹配
- 确认Ingress配置了ssl-passthrough
- 最终发现是Nginx Ingress Controller版本过旧
解决方案:
bash复制helm upgrade ingress-nginx ingress-nginx/ingress-nginx --version 4.5.2
7. 性能优化建议
- 资源限制配置:
yaml复制resources:
limits:
cpu: "1"
memory: 512Mi
requests:
cpu: "0.5"
memory: 256Mi
- 启用浏览器缓存:
yaml复制args:
- --enable-skip-login
- --default-cert-dir=/certs
- --system-banner="Production Environment"
- --apiserver-host=https://kubernetes.default.svc:443
- 定期清理旧版本镜像:
bash复制crictl rmi --prune
在最后的生产部署中,我建议启用审计日志功能,记录所有通过Dashboard执行的操作。这可以通过kube-apiserver的--audit-log-path参数实现,对于安全调查非常有帮助。
