1. Kubernetes Dashboard 概述与核心价值

Kubernetes Dashboard 是 Kubernetes 官方提供的 Web 用户界面,用于可视化管理和监控集群资源。作为 K8s 生态中最常用的管理工具之一,它允许用户通过图形化界面而非命令行执行以下核心操作:

  • 查看集群中运行的应用程序概览
  • 创建和修改单个 Kubernetes 资源(如部署、服务等)
  • 获取集群资源使用情况的可视化图表
  • 排查应用程序故障(日志查看、容器终端访问等)

注意:Dashboard 默认不包含身份认证机制,直接暴露在公网会带来严重安全风险。生产环境必须配置适当的访问控制。

实际运维中,Dashboard 特别适合以下场景:

  1. 开发人员快速查看应用状态而无需记忆 kubectl 命令
  2. 演示环境展示集群运行状况
  3. 教学场景直观呈现 K8s 对象关系
  4. 临时故障排查时的辅助工具

2. 部署前的环境准备

2.1 基础环境检查

在开始部署前,请确认您的 Kubernetes 集群满足以下条件:

# 检查集群版本(要求 v1.16+)
kubectl version --short

# 检查节点状态
kubectl get nodes

# 检查网络插件是否正常工作
kubectl get pods -n kube-system | grep -E 'coredns|calico|flannel'

常见问题排查:

  • 如果 coredns 处于 Pending 状态,通常是网络插件未正确安装
  • 节点 NotReady 可能表示 kubelet 服务异常或资源不足
  • 旧版本 K8s 需要调整 Dashboard 的部署配置

2.2 资源配置要求

Dashboard 本身资源消耗较低,但根据集群规模需要预留适当资源:

集群规模 推荐配置 备注
测试环境 1核1GB 可运行在 minikube 或单节点集群
中小规模 2核2GB 50个以下节点/200个以下Pod
大规模 4核4GB 需要启用指标收集器

3. 标准部署流程详解

3.1 使用官方清单部署

推荐使用最新稳定版的官方部署清单:

# 部署 Dashboard 核心组件
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml

这个清单会创建:

  • dashboard 命名空间
  • deployment 和 replicaSet 资源
  • service account 和角色绑定
  • 服务暴露(默认 ClusterIP 类型)

3.2 服务暴露方式选择

根据访问需求选择合适的服务类型:

  1. ClusterIP(默认)

    kubectl -n kubernetes-dashboard get svc
    

    需要通过 kubectl proxy 访问:

    kubectl proxy
    

    然后访问 http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/

  2. NodePort

    kubectl -n kubernetes-dashboard patch svc kubernetes-dashboard -p '{"spec":{"type":"NodePort"}}'
    

    查看分配的端口:

    kubectl -n kubernetes-dashboard get svc
    
  3. LoadBalancer(云环境)

    kubectl -n kubernetes-dashboard patch svc kubernetes-dashboard -p '{"spec":{"type":"LoadBalancer"}}'
    

3.3 认证配置方案

3.3.1 令牌认证(推荐开发环境)

创建服务账号并获取令牌:

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard
EOF

cat <<EOF | kubectl apply -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kubernetes-dashboard
EOF

# 获取访问令牌
kubectl -n kubernetes-dashboard create token admin-user
3.3.2 Kubeconfig 认证(生产环境推荐)
  1. 生成客户端证书
  2. 创建 kubeconfig 文件
  3. 在 Dashboard 登录界面选择 Kubeconfig 方式

4. 高级配置与优化

4.1 自定义证书配置

替换默认自签名证书:

# 生成新证书
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
  -keyout dashboard.key -out dashboard.crt \
  -subj "/CN=dashboard.example.com"

# 创建 secret
kubectl -n kubernetes-dashboard create secret tls dashboard-cert \
  --key dashboard.key --cert dashboard.crt

# 更新部署使用新证书
kubectl -n kubernetes-dashboard edit deploy kubernetes-dashboard

在容器 spec 中添加:

args:
  - --tls-cert-file=/tls.crt
  - --tls-key-file=/tls.key
volumeMounts:
  - mountPath: /tls.crt
    name: cert
    subPath: tls.crt
  - mountPath: /tls.key
    name: cert
    subPath: tls.key
volumes:
  - name: cert
    secret:
      secretName: dashboard-cert

4.2 资源限制与自动伸缩

建议为 Dashboard 设置资源限制:

resources:
  limits:
    cpu: "1"
    memory: 512Mi
  requests:
    cpu: "0.5"
    memory: 256Mi

启用水平自动伸缩(HPA):

kubectl -n kubernetes-dashboard autoscale deployment kubernetes-dashboard \
  --cpu-percent=50 --min=1 --max=3

5. 安全加固实践

5.1 网络策略限制

仅允许特定 IP 或命名空间访问:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-dashboard
  namespace: kubernetes-dashboard
spec:
  podSelector:
    matchLabels:
      k8s-app: kubernetes-dashboard
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          name: allowed-namespace
    - ipBlock:
        cidr: 192.168.1.0/24

5.2 审计日志配置

启用 Dashboard 操作审计:

args:
  - --audit-log-path=/var/log/dashboard-audit.log
  - --audit-log-maxage=30
  - --audit-log-maxbackup=5
  - --audit-log-maxsize=100

6. 常见问题排查指南

6.1 访问被拒绝问题

错误现象:

Unauthorized: gateway token missing (open the dashboard url and paste the token)

解决方案:

  1. 确认使用的令牌未过期
  2. 检查服务账号的 RBAC 权限
  3. 验证 kube-apiserver 的认证配置

6.2 证书相关问题

错误现象:

NET::ERR_CERT_INVALID

解决方案:

  1. 导入自签名证书到浏览器信任库
  2. 或使用合法 CA 签发的证书
  3. 临时方案:在 Chrome 中输入 thisisunsafe 绕过警告(仅测试环境)

6.3 性能优化技巧

  1. 减少默认显示的资源数量:
    args:
      - --items-per-page=50
    
  2. 禁用不需要的 API 资源:
    args:
      - --disable-settings-authorizer=true
    
  3. 调整自动刷新间隔:
    args:
      - --auto-refresh-interval=30s
    

7. 生产环境最佳实践

  1. 访问控制三重保障

    • 网络层:通过 Ingress 或 LB 配置 IP 白名单
    • 传输层:强制 HTTPS 并启用双向 TLS
    • 应用层:集成 OIDC 或企业 SSO
  2. 监控与告警配置

    # Prometheus 监控示例
    - job_name: 'kubernetes-dashboard'
      kubernetes_sd_configs:
      - role: endpoints
        namespaces:
          names: ['kubernetes-dashboard']
      relabel_configs:
      - source_labels: [__meta_kubernetes_service_label_k8s_app]
        action: keep
        regex: kubernetes-dashboard
    
  3. 灾备方案

    • 定期备份 Dashboard 配置
    • 准备命令行等效操作手册
    • 设置维护窗口期

我在多个生产集群中部署 Dashboard 的经验是:永远不要将其作为唯一的管理工具,而应作为 kubectl 的图形化补充。特别是在处理大规模集群时,Dashboard 的资源消耗会显著增加,建议配合 kubectl 和自动化工具使用。

更多推荐