
kubeasz 部署 Kubernetes Dashboard 2.xNodePort 访问与 Token / Kubeconfig 登录鉴权实战【免费下载链接】kubeasz使用Ansible脚本安装K8S集群介绍组件交互原理方便直接不受国内网络环境影响项目地址: https://gitcode.com/GitHub_Trending/ku/kubeasz本文以 kubeasz 项目为背景完整讲解 Kubernetes Dashboard 2.x 在 kubeasz 集群中的部署、验证与登录鉴权从ezctl setup一键部署、NodePort方式暴露 HTTPS 服务到通过 ServiceAccount Token 与 Kubeconfig 两种方式实现管理员 / 只读两种权限的登录。读者读完本文后可以在自己的 kubeasz 集群上独立完成 Dashboard 2.x 的安装、访问与细粒度权限控制。一、Dashboard 版本与登录机制的演进本文基于 Dashboard 2.2 版本、k8s 1.22 版本编写。Dashboard 自 1.7 版本起默认开启了自带的登录验证机制因此不同版本的登录方式差异很大旧版 1.6建议通过 apiserver 访问直接利用 apiserver 的认证授权机制去控制 Dashboard 权限详见旧版文档。新版 1.7可以使用自带的登录界面通过使用不同的 ServiceAccount Token 去控制访问 Dashboard 的权限。理解这一点很重要Dashboard 作为 Kubernetes 原生 UI能够展示各种资源信息甚至具备修改、增加、删除权限所以对访问进行认证和权限控制是必要且严肃的安全工作。新版登录机制的核心思路就是一个账号ServiceAccount 一组权限RBAC 绑定 一种访问身份管理员与只读用户分别持有各自的 Token。二、在 kubeasz 集群中部署 Dashboard2.1 部署原理与源码依据在 kubeasz 中Dashboard 属于07.cluster-addon集群附加组件阶段由 roles/cluster-addon/tasks/dashboard.yml 这个 Ansible 任务文件负责。从源码可以看到它的完整执行流程创建集群部署文件目录{{ cluster_dir }}/yml/dashboard通过 Jinja2 模板渲染三份部署文件到该目录dashboard-values.yamladmin-user-sa-rbac.yamlread-user-sa-rbac.yaml使用helm upgrade kubernetes-dashboard --install --create-namespace安装官方 chartchart 包为仓库内的kubernetes-dashboard-{{ dashboardVer }}.tgz具体版本由dashboardVer变量控制通过kubectl apply创建 admin、read 两个用户的 ServiceAccount 与 RBAC 绑定。整个任务用when: dashboard_install yes控制开关。此外roles/cluster-addon/tasks/main.yml 中还有一层幂等保护只有当集群中不存在kubernetes-dashboardPod或需要更新 CA 证书时才执行部署避免重复安装。2.2 执行部署假设你的集群部署名为xxxx在 kubeasz 主目录执行# ezctl 集成部署组件xxxx 代表集群部署名 # dashboard 部署文件位于 /etc/kubeasz/clusters/xxxx/yml/dashboard/ 目录 ./ezctl setup xxxx 07与旧版1.6.3相比kubeasz 对 Dashboard 2.x 做了两个关键增强增加了通过api-server方式访问 Dashboard 的途径增加了NodePort方式暴露服务这样集群外部可以直接使用https://NodeIP:NodePort注意是https 而不是 http这与 1.6.3 版本有区别访问 Dashboard。2.3 镜像与配置说明kubeasz 通过 roles/cluster-addon/templates/dashboard/dashboard-values.yaml.j2 渲染 helm values核心配置如下# General configuration shared across resources app: mode: dashboard auth: image: repository: easzlab.io.local:5000/kubernetesui/dashboard-auth api: image: repository: easzlab.io.local:5000/kubernetesui/dashboard-api web: image: repository: easzlab.io.local:5000/kubernetesui/dashboard-web metricsScraper: image: repository: easzlab.io.local:5000/kubernetesui/dashboard-metrics-scraper ## Required Kong sub-chart with DBless configuration to act as a gateway kong: enabled: true image: repository: easzlab.io.local:5000/kubernetesui/kong proxy: type: NodePort http: enabled: false从中可以确认几个实现事实Dashboard 2.x 采用了auth / api / web 分离的微服务架构认证、后端 API 与前端 Web 分别由独立镜像提供同时包含 metrics-scraper 用于聚合指标数据所有镜像统一从easzlab.io.local:5000私有镜像仓库拉取这正是 kubeasz 离线部署能力的一部分保证不受国内网络环境影响通过 Kong 网关DBless 模式作为流量入口proxy.type: NodePort即前文所说 NodePort 暴露方式的落地实现并显式关闭了 HTTPhttp.enabled: false只开放 HTTPS。三、验证部署部署完成后按以下命令逐项检查# 查看pod 运行状态 kubectl get pod -n kube-system | grep dashboard dashboard-metrics-scraper-856586f554-l6bf4 1/1 Running 0 35m kubernetes-dashboard-698d4c759b-67gzg 1/1 Running 0 35m # 查看dashboard service kubectl get svc -n kube-system|grep dashboard kubernetes-dashboard NodePort 10.68.219.38 none 443:24108/TCP 53s # 查看pod 运行日志 kubectl logs -n kube-system kubernetes-dashboard-698d4c759b-67gzg从输出可以确认kubernetes-dashboard与dashboard-metrics-scraper两个 Pod 均处于Running状态Service 类型为NodePort集群内地址10.68.219.38外部端口映射为443:24108/TCP即集群外通过https://NodeIP:24108访问务必使用 https 协议Pod 名称后的随机后缀如698d4c759b-67gzg是 Deployment 生成的副本标识实际输出以你的集群为准。四、登录鉴权Token 与 Kubeconfig 两种方式为演示方便这里使用https://NodeIP:NodePort方式访问 Dashboard。Dashboard 2.x 的登录界面支持两种登录方式Kubeconfig与令牌Token。注意使用 Chrome 浏览器访问https://NodeIP:NodePort可能提示安全风险无法访问可以换 Firefox 浏览器设置安全例外后继续访问这是因为 Dashboard 使用自签名证书浏览器默认不信任。4.1 Token 方式登录管理员 admin在登录页选择Token方式执行以下命令获取 admin 用户的 Bearer Token# 获取 Bearer Token找到输出中 ‘token:’ 开头的后面部分 $ kubectl describe -n kube-system secrets admin-user复制输出中的token:字段内容粘贴到输入框点击登录。这个 admin 用户的权限来源可以追溯到仓库中的 roles/cluster-addon/templates/dashboard/admin-user-sa-rbac.yaml.j2 模板它一次性创建了三个资源ServiceAccountadmin-usernamespace: kube-system登录身份的载体ClusterRoleBindingadmin-user将admin-user绑定到内置cluster-adminClusterRole从而获得集群全部权限roleRef引用的正是rbac.authorization.k8s.io组的cluster-adminSecretadmin-usertype:kubernetes.io/service-account-token通过 annotationkubernetes.io/service-account.name: admin-user关联 SA自动生成对应的登录 Token——这正是kubectl describe secrets admin-user能拿到token:字段的原因。4.2 Token 方式登录只读 read在登录页同样选择Token方式执行以下命令获取只读用户的 Bearer Token# 获取 Bearer Token找到输出中 ‘token:’ 开头的后面部分 $ kubectl describe -n kube-system secrets dashboard-read-user复制token:字段粘贴登录。只读用户的权限定义在 roles/cluster-addon/templates/dashboard/read-user-sa-rbac.yaml.j2 模板中其核心是一个自定义ClusterRoledashboard-read-clusterrole只对各类核心资源授予get、list、watch三种只读动词覆盖的资源组包括核心组configmaps、endpoints、nodes、persistentvolumes、persistentvolumeclaims含 /status、pods、replicationcontrollers含 /scale、serviceaccounts、services含 /status以及 bindings、events、limitranges、namespaces/status、pods/log、pods/status、resourcequotas含 /status、namespacesapps 组controllerrevisions、daemonsets、deployments、replicasets、statefulsets含各自 /scale、/status 子资源autoscaling 组horizontalpodautoscalersbatch 组cronjobs、jobs含 /statusextensions 组daemonsets、deployments、ingresses、replicasets 等policy 组poddisruptionbudgetsnetworking.k8s.io 组ingresses、networkpoliciesstorage.k8s.io 组storageclasses、volumeattachmentsrbac.authorization.k8s.io 组clusterrolebindings、clusterroles、roles、rolebindings只读查看。最后同样通过一个kubernetes.io/service-account-token类型的 Secretannotation 关联dashboard-read-user提供登录 Token。这样一个查看型角色可以满足日常巡检、只读排障等场景避免把 cluster-admin 权限泄露给普通使用者。4.3 Kubeconfig 方式登录管理员 adminAdmin 的 kubeconfig 文件默认位置为/root/.kube/config该文件中默认没有 token 字段。使用 Kubeconfig 方式登录时需要先将 admin 用户的 token 追加到该文件中完整的文件格式如下apiVersion: v1 clusters: - cluster: certificate-authority-data: LS0tLS1CRUdxxxxxxxxxxxxxx server: https://192.168.1.2:6443 name: kubernetes contexts: - context: cluster: kubernetes user: admin name: kubernetes current-context: kubernetes kind: Config preferences: {} users: - name: admin user: client-certificate-data: LS0tLS1CRUdJTiBDRxxxxxxxxxxx client-key-data: LS0tLS1CRUdJTxxxxxxxxxxxxxx token: eyJhbGcixxxxxxxxxxxxxxxx关键点说明server字段指向 apiserver 地址示例为https://192.168.1.2:6443按你的集群实际地址修改certificate-authority-data、client-certificate-data、client-key-data为 base64 编码的证书数据默认已存在于/root/.kube/config中只需在users[0].user下追加token字段值为 admin 用户的 Token即可让 Kubeconfig 携带登录凭据。4.4 Kubeconfig 方式登录只读 read只读用户使用 Kubeconfig 登录需要两步首先创建只读权限的 kubeconfig 文件然后参照 4.3 的方式将只读用户的 token 追加到该文件的user段中过程与 admin 类似此处从略。关于第一步kubeasz 提供了封装好的ezctl kcfg-adm工具其核心能力详见 docs/op/kcfg-adm.md包括限定权限通过-t参数指定用户类型admin为管理员权限view为只读权限限定期限通过-e参数设置证书有效期单位小时如24h、240h用户管理-A新增用户、-D删除用户、-L列出已有用户、-u指定用户名前缀。典型用法示例# 查看帮助 ezctl help kcfg-adm # 查看集群 k8s-01 当前自定义 kubeconfig ezctl kcfg-adm k8s-01 -L # 新增只读用户 user01有效期 24 小时 ezctl kcfg-adm k8s-01 -A -u user01 -e 24h -t view # 新增管理员用户 user02有效期 240 小时 ezctl kcfg-adm k8s-01 -A -u user02 -e 240h -t admin # 删除用户 user01-202101162141 ezctl kcfg-adm k8s-01 -D -u user01-202101162141生成的 kubeconfig 文件位于/etc/kubeasz/clusters/集群名/ssl/users/用户名.kubeconfig-L列表会同时展示每个用户的类型cluster-admin/view与证书到期时间方便统一管理。拿到只读 kubeconfig 后再按 4.3 的格式追加只读 Token 即可用于 Dashboard 登录。五、权限控制设计小结Dashboard 2.x 的登录鉴权本质上完全复用 Kubernetes 自身的ServiceAccount RBAC机制kubeasz 在其上做了开箱即用的封装登录身份承载资源权限绑定适用场景adminServiceAccountadmin-user token SecretClusterRoleBinding 绑定内置cluster-admin集群管理、资源增删改readServiceAccountdashboard-read-user token SecretClusterRoleBinding 绑定自定义只读 ClusterRole巡检、排障、只读查看两种身份、两种登录方式Token / Kubeconfig可以自由组合实践中建议管理员 Token / Kubeconfig只保存在受控的运维机器上切勿外泄给普通使用者、审计人员发放只读Token 或限定期限的只读 kubeconfig配合ezctl kcfg-adm -e控制有效期定期用kubectl describe -n kube-system secrets user检查 Token 状态用ezctl kcfg-adm cluster -L审计已发放的自定义 kubeconfig。参考Dashboard 官方文档https://github.com/kubernetes/dashboard仓库roles/cluster-addon/files/kubernetes-dashboard-版本.tgz即官方 chart 的离线副本只读 Dashboard 权限参考文章a-read-only-kubernetes-dashboard旧版1.6.3Dashboard 的 apiserver 认证访问方式见旧版文档创建只读权限 kubeconfig 的详细命令见 kcfg-adm 使用说明部署任务的完整实现见 roles/cluster-addon/tasks/dashboard.yml【免费下载链接】kubeasz使用Ansible脚本安装K8S集群介绍组件交互原理方便直接不受国内网络环境影响项目地址: https://gitcode.com/GitHub_Trending/ku/kubeasz创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考