部署与安全访问实战)
1. Kubernetes Dashboard 是什么Kubernetes Dashboard 是 Kubernetes 官方提供的基于 Web 的用户界面。它允许你通过可视化的方式管理和监控 Kubernetes 集群中的资源。想象一下你有一个装满各种工具的箱子Dashboard 就像是这个箱子的透明盖子让你一眼就能看到里面有什么还能直接操作这些工具。作为一个运维工程师我经常使用 Dashboard 来完成以下工作查看集群中运行的应用程序状态部署容器化应用到集群排查故障和问题管理集群资源如节点、命名空间等创建或修改 Kubernetes 资源如 Deployment、Job 等Dashboard 特别适合那些不习惯使用命令行工具 kubectl 的用户或者需要快速了解集群整体状况的场景。它把复杂的 Kubernetes 概念和操作转化为直观的图形界面大大降低了学习曲线。2. 部署 Dashboard 的三种方式2.1 使用官方 YAML 文件快速部署这是最简单的部署方式适合快速测试环境。执行以下命令即可kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml这个命令会创建一个名为 kubernetes-dashboard 的命名空间Dashboard 所需的各种资源ServiceAccount、Role、Deployment 等一个 ClusterIP 类型的 Service部署完成后你可以检查 Pod 是否正常运行kubectl get pods -n kubernetes-dashboard如果看到两个 Pod 的状态都是 Running说明部署成功。我在实际部署时遇到过镜像拉取失败的问题通常是因为网络原因可以通过设置国内镜像源解决。2.2 使用 Helm 部署生产推荐对于生产环境我强烈推荐使用 Helm 部署因为它提供了更灵活的配置选项。首先添加 Dashboard 的 Helm 仓库helm repo add kubernetes-dashboard https://kubernetes.github.io/dashboard helm repo update然后创建一个 values.yaml 文件来自定义配置# values.yaml metricsScraper: enabled: true ingress: enabled: true hosts: - dashboard.yourdomain.com tls: - secretName: dashboard-tls hosts: - dashboard.yourdomain.com最后使用 Helm 安装helm install kubernetes-dashboard kubernetes-dashboard/kubernetes-dashboard \ -n kubernetes-dashboard \ --create-namespace \ -f values.yamlHelm 部署的优势在于可以轻松配置 Ingress、资源限制、副本数等生产级参数。我在一个中型集群中使用这种部署方式稳定性非常好。2.3 使用 Ansible 自动化部署如果你管理多个集群可以考虑使用 Ansible 自动化部署 Dashboard。下面是一个简单的 playbook 示例# dashboard.yml - hosts: kube_master tasks: - name: Create dashboard namespace k8s: api_version: v1 kind: Namespace name: kubernetes-dashboard state: present - name: Deploy Dashboard k8s: state: present src: https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml运行 playbookansible-playbook -i inventory dashboard.ymlAnsible 部署的优势是可以与其他集群配置管理集成实现基础设施即代码。我在管理 10 集群的环境中广泛使用这种方式。3. 安全访问 Dashboard 的三种方案3.1 使用 kubectl proxy开发环境最简单但不安全的方式是使用 kubectl proxykubectl proxy然后访问http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/这种方式只适合本地开发测试因为它没有任何身份验证且只能从本地访问。我在排查问题时偶尔会用这种方式快速查看 Dashboard。3.2 使用 NodePort 暴露服务测试环境修改 Dashboard 的 Service 类型为 NodePortkubectl patch svc kubernetes-dashboard \ -n kubernetes-dashboard \ -p {spec: {type: NodePort}}然后获取 NodePort 端口kubectl get svc -n kubernetes-dashboard访问地址为https://节点IP:NodePort注意这仍然不够安全因为使用自签名证书会有浏览器警告需要额外配置防火墙规则限制访问源IP3.3 使用 Ingress TLS生产环境推荐这是生产环境的最佳实践。首先创建 Ingress 资源# dashboard-ingress.yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: dashboard namespace: kubernetes-dashboard annotations: nginx.ingress.kubernetes.io/backend-protocol: HTTPS nginx.ingress.kubernetes.io/ssl-passthrough: true nginx.ingress.kubernetes.io/force-ssl-redirect: true spec: ingressClassName: nginx tls: - hosts: - dashboard.yourdomain.com secretName: dashboard-tls rules: - host: dashboard.yourdomain.com http: paths: - path: / pathType: Prefix backend: service: name: kubernetes-dashboard port: number: 443应用配置kubectl apply -f dashboard-ingress.yaml这种方案的优势包括使用 Lets Encrypt 自动管理 TLS 证书可以通过域名访问可以集成企业级身份认证支持访问控制在我的生产环境中配合 OAuth2 Proxy 实现了基于公司 SSO 的统一认证安全性大大提升。4. RBAC 权限配置与 Token 管理4.1 创建管理员 ServiceAccount首先创建 admin-user 的 ServiceAccount# admin-user.yaml apiVersion: v1 kind: ServiceAccount metadata: name: admin-user namespace: kubernetes-dashboard然后创建 ClusterRoleBindingapiVersion: 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应用配置kubectl apply -f admin-user.yaml注意在生产环境中应该遵循最小权限原则而不是直接使用 cluster-admin。4.2 获取访问 Token获取 admin-user 的 Tokenkubectl -n kubernetes-dashboard create token admin-user --duration24h这个命令会生成一个有效期为 24 小时的 Token。相比早期版本中从 Secret 获取 Token 的方式这是 Kubernetes 1.24 推荐的做法。4.3 自定义 Token 有效期默认情况下Token 有效期为 1 小时。可以通过以下方式调整kubectl -n kubernetes-dashboard create token admin-user --duration8760h这个命令创建了一个有效期为 1 年的 Token。在实际项目中我通常设置为 30 天平衡安全性和便利性。4.4 创建受限权限用户生产环境中更安全的做法是创建受限权限用户。例如只允许查看 default 命名空间的用户# read-only-user.yaml apiVersion: v1 kind: ServiceAccount metadata: name: read-only-user namespace: kubernetes-dashboard --- apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: read-only namespace: default rules: - apiGroups: [*] resources: [*] verbs: [get, list, watch] --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: read-only-binding namespace: default roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: read-only subjects: - kind: ServiceAccount name: read-only-user namespace: kubernetes-dashboard这种精细化的权限控制可以大大降低安全风险。我在金融行业客户的项目中通常会设计多达 10 种不同的角色权限组合。5. 常见问题排查与优化5.1 无法访问 Dashboard如果无法访问 Dashboard可以按照以下步骤排查检查 Pod 状态kubectl get pods -n kubernetes-dashboard查看 Pod 日志kubectl logs -n kubernetes-dashboard pod-name检查 Servicekubectl get svc -n kubernetes-dashboard检查 Ingresskubectl get ingress -n kubernetes-dashboard我遇到过最常见的问题是证书配置错误可以通过检查 Ingress Controller 的日志来定位kubectl logs -n ingress-nginx nginx-pod-name5.2 性能优化建议对于大型集群Dashboard 可能会变慢。以下是我总结的优化经验增加 Dashboard 的内存限制至少 512Mi启用 metrics-scraper 的持久化存储调整 API 服务器的 --max-requests-inflight 参数对集群资源进行分片处理5.3 安全加固建议生产环境中必须考虑的安全措施启用审计日志监控 Dashboard 访问集成企业级身份认证如 OIDC定期轮换 ServiceAccount Token限制 Dashboard 的网络访问使用 NetworkPolicy启用 Dashboard 的自动注销功能6. 替代方案比较虽然 Kubernetes Dashboard 是官方方案但也有其他可选方案工具优点缺点适用场景Kubernetes Dashboard官方维护功能全面权限管理复杂通用管理Kuboard中文友好操作简单社区版功能有限中小团队Lens功能强大多集群支持需要安装客户端开发者Octant轻量级可视化优秀功能相对简单本地开发在我的使用经验中Kubernetes Dashboard 仍然是功能最全面的方案特别是在与其他 Kubernetes 生态工具集成方面。