kubeasz 部署 Kubernetes Dashboard 1.6.3 实战:NodePort、密码认证与证书认证三种访问控制详解
2026/9/15 15:59:00 网站建设 项目流程

kubeasz 部署 Kubernetes Dashboard 1.6.3 实战:NodePort、密码认证与证书认证三种访问控制详解

【免费下载链接】kubeasz使用Ansible脚本安装K8S集群,介绍组件交互原理,方便直接,不受国内网络环境影响项目地址: https://gitcode.com/GitHub_Trending/ku/kubeasz

本文基于 kubeasz 项目文档 dashboard.1.6.3.md 整理成文。Dashboard 1.6.3 是 Kubernetes 官方 UI 的一个经典版本,适合在 k8s ≤ 1.9.1 的集群上使用。本指南完整讲解如何借助 kubeasz 部署 Dashboard 1.6.3,并逐一演示 NodePort 临时访问、用户密码(basic auth)+ RBAC 授权、客户端证书三种访问控制方式,帮助读者既掌握实际操作,又深入理解 kubeasz 预置集群的安全基线设计。

版本适用性与兼容性说明

在使用本指南之前,请先确认集群版本满足以下约束:

  • 本文档基于dashboard 1.6.3版本编写;
  • 经实际测试,k8s 版本 ≤ 1.9.1 支持 dashboard 1.6.3
  • 1.7.x 版本起,dashboard 默认开启自带的登录验证界面,登录流程与 1.6.3 差异较大,建议 k8s 1.9 之后的集群改用新版本 dashboard,其部署与登录方式详见 新版本文档。

也就是说,1.6.3 的登录/鉴权逻辑完全依赖集群侧(apiserver 的 TLS、RBAC、basic auth),而新版本把登录界面内建到了 dashboard 自身(Token 方式),这是两者最本质的区别。

部署 Dashboard 1.6.3

在 kubeasz 部署好的集群 master 节点上,依次创建以下资源:

# 部署 dashboard 主 yaml 配置文件 $ kubectl create -f /etc/kubeasz/manifests/dashboard/1.6.3/kubernetes-dashboard.yaml # 部署基本密码认证配置 [可选],密码文件位于 /etc/kubernetes/ssl/basic-auth.csv $ kubectl create -f /etc/kubeasz/manifests/dashboard/1.6.3/ui-admin-rbac.yaml $ kubectl create -f /etc/kubeasz/manifests/dashboard/1.6.3/ui-read-rbac.yaml

其中kubernetes-dashboard.yaml是 dashboard 的主部署清单,ui-admin-rbac.yamlui-read-rbac.yaml分别用于定义 admin(管理员)与 readonly(只读)用户的 RBAC 权限,二者是可选配置,仅当你希望使用"用户名+密码"方式登录时才需要创建。

关于 RBAC 授权,有两点需要特别说明:

  • kubeasz 预置的 kube-apiserver 启用了 RBAC 授权(--authorization-mode=Node,RBAC,见下文源码分析),因此 dashboard 使用的 ServiceAccountkubernetes-dashboard必须拥有访问 apiserver 的权限。在新版本(1.8.0 起)中,该访问权限已按最小化方式授权;而在 1.6.3 版本中,官方配置较为粗放——直接将kubernetes-dashboard与集群角色cluster-admin绑定,这样 dashboard 就拥有了访问 apiserver 的全部权限。在测试环境可以接受,但生产环境应谨慎评估。
  • 开发测试环境为了方便,通常在 dashboard 的 Service 上指定NodePort方式暴露服务,这样集群外部可以直接使用http://NodeIP:NodePort访问 dashboard;生产环境建议关闭该访问途径,改用更严格的方式(如证书访问 + 内网访问控制)。

验证部署

部署完成后,可通过以下命令确认运行状态:

# 查看 pod 运行状态 kubectl get pod -n kube-system | grep dashboard kubernetes-dashboard-86bd8778bf-w4974 1/1 Running 0 12h # 查看 dashboard service kubectl get svc -n kube-system | grep dashboard kubernetes-dashboard NodePort 10.68.7.67 <none> 80:5452/TCP 12h # 查看集群服务 kubectl cluster-info | grep dashboard kubernetes-dashboard is running at https://192.168.1.10:6443/api/v1/namespaces/kube-system/services/kubernetes-dashboard/proxy # 查看 pod 运行日志,关注有没有错误 kubectl logs kubernetes-dashboard-86bd8778bf-w4974 -n kube-system
  • Pod 处于Running状态、service 类型为NodePort(本示例宿主机端口为 5452),即说明部署成功;
  • 日志中若出现 apiserver 访问被拒(403/Forbidden)之类的错误,请回头检查 ServiceAccount 与 RBAC 绑定是否生效。

安全设计:kubeasz 预置集群的 apiserver 基线

因为 dashboard 作为 k8s 原生 UI,能够展示各种资源信息,甚至具有修改、增加、删除权限,所以对访问进行认证和控制十分必要。kubeasz 预置部署的集群在 kube-apiserver 层面做了以下安全设置,详见 apiserver 配置模板:

  • 启用TLS 认证RBAC 授权等安全特性(--authorization-mode=Node,RBAC--client-ca-file--tls-cert-file等参数);
  • 关闭 apiserver 非安全端口 8080 的外部访问(--insecure-bind-address限制为回环地址,源码模板中通过--bind-address={{ inventory_hostname }}绑定内网地址,同时仅监听安全端口);
  • 关闭匿名认证--anonymous-auth=false,杜绝未认证请求;
  • 补充启用基本密码认证--token-auth-file=/etc/kubernetes/ssl/basic-auth.csv,密码文件按照每行(密码,用户名,序号)的格式组织,可以定义多个用户。

从当前仓库的 kube-apiserver.service.j2 源码可以看到,这些安全参数被模板化地写入 systemd unit 文件:--anonymous-auth=false--authorization-mode=Node,RBAC--secure-port={{ SECURE_PORT }}等均来自集群配置变量。这意味着凡是通过 kubeasz 安装的集群,默认就具备上述安全基线,dashboard 的三种访问控制都是建立在这一基线之上的。

访问方式一:临时访问(NodePort)

# 使用 http://NodeIP:NodePort 方式直接访问 dashboard http://NodeIP:NodePort

这是最快捷的访问方式,适合开发测试环境快速查看集群状态;由于缺少身份认证,生产环境建议关闭该途径

访问方式二:用户 + 密码访问

这种方式安全性比证书方式稍差,务必保管好密码文件basic-auth.csv

具体操作如下:

  1. 在 master 节点文件/etc/kubernetes/ssl/basic-auth.csv中确认用户名和密码(每行格式为密码,用户名,序号,可定义多个用户)。如果要增加或修改用户,修改保存该文件后,记得逐个重启你的 master 节点,使 apiserver 重新加载该文件;
  2. 为演示用户密码访问,如果你之前已完成证书访问方式,可以在浏览器中删除证书,或在浏览器询问证书时选择不选证书;
  3. 分别创建 admin 与 readonly 两个用户的 RBAC 权限。

2.1 设置用户 admin 的 RBAC 权限

运行kubectl create -f ui-admin-rbac.yaml,内容如下:

kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1 metadata: name: ui-admin rules: - apiGroups: - "" resources: - services - services/proxy verbs: - '*' --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: ui-admin-binding namespace: kube-system roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: ui-admin subjects: - apiGroup: rbac.authorization.k8s.io kind: User name: admin

要点:

  • ClusterRole ui-adminservicesservices/proxy两个资源授予所有动词(*);
  • RoleBinding ui-admin-binding位于kube-system命名空间,将集群角色ui-admin绑定给用户admin(用户名与basic-auth.csv中的第二列一致)。

2.2 设置用户 readonly 的 RBAC 权限

运行kubectl create -f ui-read-rbac.yaml,内容如下:

kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1 metadata: name: ui-read rules: - apiGroups: - "" resources: - services - services/proxy verbs: - get - list - watch --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: ui-read-binding namespace: kube-system roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: ui-read subjects: - apiGroup: rbac.authorization.k8s.io kind: User name: readonly

要点:ui-read角色仅授予getlistwatch三个只读动词,与ui-admin形成最小权限对照。

2.3 使用密码登录验证权限

浏览器访问:

https://x.x.x.x:6443/api/v1/namespaces/kube-system/services/kubernetes-dashboard/proxy
  • 使用admin登录:拥有所有权限,例如可以删除某个 Deployment;
  • 使用readonly登录:只有查看权限,尝试删除某个部署会提示错误:
forbidden: User "readonly" cannot delete services/proxy in the namespace "kube-system"

这一报错信息直观体现了 RBAC 的"按用户授权、按动作放行"机制:readonly 用户虽然在 apiserver 的 basic auth 中通过了身份认证,但在授权环节被ui-read角色的动词集合挡住了写操作。

访问方式三:证书访问

这是最安全的方式,但配置相对复杂:

  1. 使用集群 CA 生成客户端证书。可以根据需要生成权限不同的证书;这里为了演示,直接使用 kubectl 使用的证书和 key(在 kubeasz 的 03.kubectl.yml 阶段生成),该证书拥有所有权限;
  2. 以指定格式导出该证书。进入/etc/kubernetes/ssl目录,执行:
openssl pkcs12 -export -in admin.pem -inkey admin-key.pem -out kube-admin.p12

执行后提示输入证书密码和确认密码:可以用密码再增加一层保护,也可以直接回车跳过。完成后目录下会多出kube-admin.p12文件,将它分发给授权的用户即可;

  1. 用户将kube-admin.p12双击导入证书后,在IEChrome中访问:
https://x.x.x.x:6443/api/v1/namespaces/kube-system/services/kubernetes-dashboard/proxy # 或者 https://x.x.x.x:6443/ui

补充:最新的 firefox 需要在浏览器中单独导入证书,路径为[选项] - [隐私与安全] - [证书/查看证书] - [您的证书],点击[导入]选择该证书即可。

小结

  • dashboard 1.6.3 的访问控制实现较为复杂,本文给出的例子也有助于你理解 RBAC 的灵活控制能力;建议进一步学习官方 RBAC 文档(篇幅不长),掌握ClusterRole/RoleBinding/User的组合方式;
  • 由于当时尚未部署 Heapster 插件,dashboard 1.6.3 不能展示 Pod、Nodes 的 CPU、内存等 metric 图形,后续部署 Heapster 后即可看到监控图形;
  • 本文中的权限设置仅供演示用,生产环境请在此基础上修改成适合你安全需求的方式,例如收缩ui-admin的动词与资源范围、使用独立的客户端证书、关闭 NodePort 暴露等。

参考与版本演进

  • 新版 dashboard(7.x,基于 helm chart 安装、Token 登录)见 dashboard.md,其部署逻辑在 dashboard.yml 中通过helm upgrade kubernetes-dashboard --install完成,并由 dashboard-values.yaml.j2 控制参数;
  • 中间版本见 dashboard.2.x.md;
  • kubeasz 完整的集群安装流程参见 quickStart.md。

【免费下载链接】kubeasz使用Ansible脚本安装K8S集群,介绍组件交互原理,方便直接,不受国内网络环境影响项目地址: https://gitcode.com/GitHub_Trending/ku/kubeasz

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询