1. Kubernetes Dashboard 部署概述
在 Kubernetes 高可用集群环境中部署 Dashboard 是每个管理员都会遇到的基础任务。虽然官方文档提供了基本安装步骤,但在生产级 HA 环境中使用 containerd 作为容器运行时,会遇到许多文档中未提及的细节问题和优化点。本文将基于真实生产经验,分享从 YAML 定制到安全加固的完整实践。
Dashboard 作为 Kubernetes 的原生 Web UI,提供了集群资源可视化、故障排查和基础运维能力。与 kubectl 命令行工具形成互补,特别适合需要快速查看集群状态的场景。在 containerd 环境下部署时,需要特别注意镜像拉取策略、服务暴露方式和 RBAC 权限控制这三个核心维度。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 高可用环境下的部署准备
2.1 基础环境校验
在 HA 集群中部署前,需要确认以下基础条件:
bash复制# 检查 containerd 运行状态
systemctl status containerd --no-pager
# 验证节点就绪状态
kubectl get nodes -o wide | grep -v "Ready"
# 检查网络插件状态
kubectl -n kube-system get pods | grep -E 'flannel|calico|cilium'
常见问题排查点包括:
- containerd 配置文件中需要确保正确配置 sandbox_image(通常为 pause 镜像)
- 如果使用私有镜像仓库,需提前在 containerd 的 config.toml 中配置 registry.mirrors
- 确保 kubelet 的 --container-runtime-endpoint 参数指向正确的 containerd socket 路径
2.2 镜像拉取策略优化
官方推荐的 dashboard 镜像通常托管在 k8s.gcr.io(现已迁移到 registry.k8s.io),在国内环境需要特别处理:
yaml复制# 在 deployment 中增加 imagePullSecrets
spec:
template:
spec:
imagePullSecrets:
- name: registry-secret
替代方案是使用国内镜像源,通过 containerd 的配置文件进行全局替换:
toml复制# /etc/containerd/config.toml
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."k8s.gcr.io"]
endpoint = ["https://registry.cn-hangzhou.aliyuncs.com"]
3. Dashboard 部署实战
3.1 基础部署文件定制
推荐使用官方推荐的 2.7.x 版本部署文件,但需要进行以下关键修改:
yaml复制# 修改后的 deployment 片段示例
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
replicas: 2 # HA 环境下建议至少2个副本
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 0 # 保证服务不中断
selector:
matchLabels:
k8s-app: kubernetes-dashboard
template:
metadata:
labels:
k8s-app: kubernetes-dashboard
spec:
containers:
- name: kubernetes-dashboard
image: registry.k8s.io/dashboard:v2.7.0
imagePullPolicy: IfNotPresent # 生产环境推荐策略
ports:
- containerPort: 8443
protocol: TCP
args:
- --auto-generate-certificates
- --enable-skip-login # 允许跳过登录
- --enable-insecure-login # 仅限内网环境使用
volumeMounts:
- mountPath: /certs
name: certs
readOnly: false
securityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
runAsUser: 1001
runAsGroup: 2001
3.2 服务暴露方式选择
在 HA 环境中,建议使用以下两种暴露方式:
方案一:Ingress + NodePort(推荐)
yaml复制apiVersion: v1
kind: Service
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
type: NodePort
ports:
- port: 443
targetPort: 8443
nodePort: 30443 # 建议在30000-32767范围内
selector:
k8s-app: kubernetes-dashboard
方案二:LoadBalancer(云环境适用)
yaml复制spec:
type: LoadBalancer
externalTrafficPolicy: Local # 保持源IP
ports:
- port: 443
targetPort: 8443
重要提示:无论采用哪种方式,都必须配合网络策略限制访问来源IP,避免将Dashboard暴露在公网
4. 安全加固实践
4.1 RBAC 权限控制
最小权限原则的 RBAC 配置示例:
yaml复制apiVersion: v1
kind: ServiceAccount
metadata:
name: dashboard-admin
namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: dashboard-admin
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin # 生产环境应根据实际需求缩小权限范围
subjects:
- kind: ServiceAccount
name: dashboard-admin
namespace: kubernetes-dashboard
4.2 证书管理最佳实践
自签名证书生成脚本(适用于测试环境):
bash复制#!/bin/bash
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout dashboard.key -out dashboard.crt \
-subj "/CN=dashboard.example.com/O=example"
# 创建Kubernetes secret
kubectl -n kubernetes-dashboard create secret tls dashboard-cert \
--key dashboard.key \
--cert dashboard.crt
生产环境推荐使用 cert-manager 自动管理证书:
yaml复制apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: dashboard-cert
namespace: kubernetes-dashboard
spec:
secretName: dashboard-cert
duration: 2160h # 90d
renewBefore: 360h # 15d
issuerRef:
name: letsencrypt-prod
kind: ClusterIssuer
commonName: dashboard.example.com
dnsNames:
- dashboard.example.com
5. 运维与问题排查
5.1 常见问题处理
问题1:Dashboard 无法访问
排查步骤:
- 检查服务状态:
bash复制kubectl -n kubernetes-dashboard get pods -o wide
kubectl -n kubernetes-dashboard describe svc kubernetes-dashboard
- 查看容器日志:
bash复制kubectl -n kubernetes-dashboard logs -l k8s-app=kubernetes-dashboard --tail=50
- 验证网络连通性:
bash复制# 从集群内部测试
kubectl run -it --rm --restart=Never test \
--image=registry.cn-hangzhou.aliyuncs.com/acs/busybox \
-- wget -qO- --no-check-certificate https://kubernetes-dashboard.kubernetes-dashboard.svc:443
问题2:证书错误
典型报错:"x509: certificate signed by unknown authority"
解决方案:
bash复制# 将证书添加到信任链
kubectl -n kubernetes-dashboard get secret dashboard-cert -o jsonpath='{.data.ca\.crt}' | base64 -d >> /etc/ssl/certs/ca-certificates.crt
5.2 性能优化建议
- 调整 Dashboard 的内存限制:
yaml复制resources:
requests:
memory: "256Mi"
cpu: "100m"
limits:
memory: "512Mi"
cpu: "500m"
- 启用 gzip 压缩(在 deployment 的 args 中添加):
yaml复制args:
- --enable-gzip-compression=true
- 调整 metrics-scraper 的采集间隔:
yaml复制# 在 metrics-scraper 的 deployment 中添加
args:
- --scrape-interval=5m # 默认1m,可根据集群规模调整
6. 高级功能扩展
6.1 集成 Prometheus 监控
通过 annotations 暴露 Dashboard 的 metrics:
yaml复制template:
metadata:
annotations:
prometheus.io/scrape: "true"
prometheus.io/port: "8443"
prometheus.io/path: "/metrics"
6.2 自定义登录页面
创建 configmap 存储自定义配置:
yaml复制apiVersion: v1
kind: ConfigMap
metadata:
name: dashboard-config
namespace: kubernetes-dashboard
data:
custom-header.json: |
{
"headerText": "Production Cluster",
"logoUrl": "https://example.com/logo.png"
}
然后在 deployment 中挂载:
yaml复制volumeMounts:
- mountPath: /etc/kubernetes/dashboard/custom-header.json
name: dashboard-config
subPath: custom-header.json
volumes:
- name: dashboard-config
configMap:
name: dashboard-config
在 containerd 环境下部署 Kubernetes Dashboard 时,我强烈建议在测试环境先验证所有配置,特别是证书和网络策略部分。实际运维中发现,大部分问题都源于网络插件与 containerd 的兼容性配置。建议定期检查 Dashboard 的版本更新,新版本通常会修复已知的安全漏洞。
