ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

解构 K8s Web 管理界面:Dashboard 与 Kuboard 部署认证

解构 K8s Web 管理界面:Dashboard 与 Kuboard 部署认证 Kubernetes 集群 Dashboardkuboardkuboard 介绍Kuboard 是一款专为 Kubernetes 设计的免费管理界面兼容 Kubernetes 版本 1.13 及以上。Kuboard 每周发布一个 beta 版本最长每月发布一个正式版本经过两年的不断迭代和优化已经具备多集群管理、权限管理、监控套件、日志套件等丰富的功能并且有 1000 的企业将 Kuboard 应用于其生产环境。Kuboard 自 2019年8月发布第一个版本以来得到了众多用户的认可目前已经获得了 10000 GitHub Star。Kuboard 的定位和 Dashboard 是相似的主要的区别在于Kuboard 关注微服务参考架构的视角对界面进行组织参考 Kuboard 简介。Kuboard 中不需要手工编写 YAML 文件进一步降低 K8S 使用难度提高便捷性。Kuboard 可以导出整个微服务架构的部署信息并在新的名称空间/集群导入配置信息。Kuboard 的一个发展方向是提供内建的 监控套件目前的全局监控套件成熟度比较高。kuboard 特点相较于 Kubernetes Dashboard 等其他 Kubernetes 管理界面Kuboard 的主要特点有多种认证方式Kuboard 可以使用内建用户库、gitlab / github 单点登录或者 LDAP 用户库进行认证避免管理员将 ServiceAccount 的 Token 分发给普通用户而造成的麻烦。使用内建用户库时管理员可以配置用户的密码策略、密码过期时间等安全设置。多集群管理管理员可以将多个 Kubernetes 集群导入到 Kuboard 中并且通过权限控制将不同集群/名称空间的权限分配给指定的用户或用户组。微服务分层展示在 Kuboard 的名称空间概要页中以经典的微服务分层方式将工作负载划分到不同的分层更加直观地展示微服务架构的结构并且可以为每一个名称空间自定义名称空间布局。工作负载的直观展示Kuboard 中将 Deployment 的历史版本、所属的 Pod 列表、Pod 的关联事件、容器信息合理地组织在同一个页面中可以帮助用户最快速的诊断问题和执行各种相关操作。工作负载编辑Kuboard 提供了图形化的工作负载编辑界面用户无需陷入繁琐的 YAML 文件细节中即可轻松完成对容器的编排任务。支持的 Kubernetes 对象类型包括Node、Namespace、Deployment、StatefulSet、DaemonSet、Secret、ConfigMap、Service、Ingress、StorageClass、PersistentVolumeClaim、LimitRange、ResourceQuota、ServiceAccount、Role、RoleBinding、ClusterRole、ClusterRoleBinding、CustomResourceDefinition、CustomResource 等各类常用 Kubernetes 对象存储类型支持在 Kuboard 中可以方便地对接 NFS、CephFS 等常用存储类型并且支持对 CephFS 类型的存储卷声明执行扩容和快照操作。丰富的互操作性可以提供许多通常只在kubectl命令行界面中才提供的互操作手段例如Top Nodes / Top Pods容器的日志、终端容器的文件浏览器支持从容器中下载文件、上传文件到容器KuboardProxy在浏览器中就可以提供kubectl proxy的功能套件扩展Kuboard 提供了必要的套件库使得用户可以根据自己的需要扩展集群的管理能力。当前提供的套件有资源层监控套件基于 Prometheus / Grafana 提供 K8S 集群的监控能力可以监控集群、节点、工作负载、容器组等各个级别对象的 CPU、内存、网络、磁盘等资源的使用情况日志聚合套件基于 Grafana / Loki / Promtail 实现日志聚合存储卷浏览器查看和操作存储卷中的内容告警配置可以通过界面直接配置资源层监控套件发送告警消息支持邮件、微信发送告警消息支持告警路由配置支持告警规则配置等操作审计Kuboard 支持操作审计的功能审计用户通过 Kuboard 界面和 Kuboard API 执行的操作自定义审计规则在线演示在线演示环境中您具备 只读 权限只能体验 Kuboard 的一部分功能。地址https://demo.kuboard.cn用 户demo密 码demo123kuboard 版本Kuboard v2.x 版本说明Kuboard v2.x 支持 Kubernetes 单集群管理。版本支持Kuboard v3.x 版本说明Kuboard v3.x 支持 Kubernetes 多集群管理。如果您从 Kuboard v1.0.x 或者 Kuboard v2.0.x 升级到 Kuboard请注意您可以同时使用 Kuboard v3.x 和 Kuboard v2.0.xKuboard v3.x 支持 amd64 (x86) 架构和 arm68 (armv8) 架构的 CPU版本支持kuboard 安装和配置本次实验环境kubernetes版本是1.32.0使用kuboard v3.x版本。安装方式以独立容器方式运行在 Kubernetes 中运行以static pod方式运行基于如下原因建议您以独立容器方式 Kuboard结构更清晰Kuboard 作为多个集群的管理界面应该独立于任何集群之外登录 Kuboard 时使用不同的认证方式问题排查更简单以独立容器方式运行安装计划在正式安装 kuboard v3 之前需做好一个简单的部署计划的设计在本例中各组件之间的连接方式如下图所示假设用户通过 http://外网IP:80 访问 Kuboard v3安装在 Kubernetes 中的 Kuboard Agent 通过内网IP访问 Kuboard 的 Web 服务端口 80 和 Kuboard Agent Server 端口 10081。安装过程# 创建目录rootmaster30:~# mkdir /kuboard-data# 创建容器rootmaster30:~# nerdctl run -d --namekuboard \-p80:80/tcp\-p10081:10081/tcp\-eKUBOARD_ENDPOINThttp://10.1.8.30:80\-eKUBOARD_AGENT_SERVER_TCP_PORT10081\-v/kuboard-data:/data\eipwork/kuboard:v3# 10.1.8.30是物理机的ip卸载rootmaster30:~# nerdctl container rm kuboard --forcerootmaster30:~# rm -fr /kuboard-data以static pod方式运行自学安装# 在master节点上执行rootmaster30:~# curl -fsSL https://addons.kuboard.cn/kuboard/kuboard-static-pod.sh -o kuboard.shrootmaster30:~# sh kuboard.shcurrentipaddress is10.1.8.30 createfile/root/kuboard-sa.yaml kubectl apply-f/root/kuboard-sa.yaml namespace/kuboard created serviceaccount/kuboard-admin created clusterrolebinding.rbac.authorization.k8s.io/kuboard-admin-crb created serviceaccount/kuboard-viewer created clusterrolebinding.rbac.authorization.k8s.io/kuboard-viewer-crb created createfile/etc/kubernetes/manifests/kuboard.yaml restart kubelet 检查状态 待 kuboard-v3-master30.laoma.cloud 的容器组变为 Running 状态后则安装成功可以通过 http://10.1.8.30 访问 kuboard 界面 No resources foundinkuboard namespace.# 验证rootmaster30:~# kubectl get all -n kuboardNAME READY STATUS RESTARTS AGE pod/kuboard-v3-laoma30.redhat.fun1/1 Running045s卸载# 删除静态文件rootmaster30:~# rm -f /etc/kubernetes/manifests/kuboard.yaml# 删除数据目录rootmaster30:~# rm -fr /usr/share/kuboard# 删除命名空间rootmaster30:~# kubectl delete ns kuboard访问过程在浏览器输入http://your-host-ip:80访问 Kuboard v3.x 的界面。登录信息用户名admin密 码Kuboard123添加集群这里选择.kubeconfig导入凭据文件复制~/.kube/config内容到红色方框中导入后效果选择访问集群时所使用的身份使用 ServiceAccount kuboard-admin参考资料安装手册https://kuboard.cn/install/v3/install.htmlKubernetes Dashboard介绍项目地址https://github.com/kubernetes/dashboard/Kubernetes Dashboard 是 Kubernetes 的官方 Web UI。Kubernetes Dashboard 具备的功能向 Kubernetes 集群部署容器化应用诊断容器化应用的问题管理集群的资源查看集群上所运行的应用程序创建、修改Kubernetes 上的资源例如 Deployment、Job、DaemonSet等展示集群上发生的错误例如您可以伸缩一个 Deployment、执行滚动更新、重启一个 Pod 或部署一个新的应用程序。部署# 下载资源yaml文件#也可以使用外网资源下载rootmaster30 ~12:26:06# wget https://laoma.cloud/class/course-materials/softwares/stage03/kubernetes-dashboard-recommended-v2.6.1.yaml -O recommended.yaml# 查看images#一般把hub.laoma.cloud改成docker.iorootmaster30 ~12:26:52# grep image: recommended.yamlimage: hub.laoma.cloud/kubernetesui/dashboard:v2.6.1 image: hub.laoma.cloud/kubernetesui/metrics-scraper:v1.0.8# 执行部署rootmaster30 ~12:27:05# kubectl apply -f recommended.yaml验证rootmaster30 ~12:29:07# kubectl get nsNAME STATUS AGE....kubernetes-dashboard Active 91s... rootmaster30 ~12:29:40# kubectl config set-context --current --namespace kubernetes-dashboardrootmaster30 ~12:43:47# kubectl get deployments.appsNAME READY UP-TO-DATE AVAILABLE AGE dashboard-metrics-scraper1/1119m55s kubernetes-dashboard1/1119m55s rootmaster30 ~12:44:00# kubectl get serviceNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)AGE dashboard-metrics-scraper ClusterIP10.97.212.131none8000/TCP 10m kubernetes-dashboard ClusterIP10.98.217.132none443/TCP 10m rootmaster30 ~12:44:12# kubectl get serviceaccountsNAME SECRETS AGE default016m kubernetes-dashboard016m rootmaster30 ~12:44:30# kubectl describe serviceaccounts kubernetes-dashboardName: kubernetes-dashboard Namespace: kubernetes-dashboard Labels: k8s-appkubernetes-dashboard Annotations:noneImage pull secrets:noneMountable secrets:noneTokens:noneEvents:none# 创建了clusterrolebindings/kubernetes-dashboardrootmaster30 ~12:44:41# kubectl get clusterrolebindings |grep dashboardkubernetes-dashboard ClusterRole/kubernetes-dashboard 17m# sa/kubernetes-dashboard具有ClusterRole/kubernetes-dashboardrootmaster30 ~12:45:11# kubectl describe clusterrolebindings kubernetes-dashboardName: kubernetes-dashboard Labels:noneAnnotations:noneRole: Kind: ClusterRole Name: kubernetes-dashboard Subjects: Kind Name Namespace ---- ---- --------- ServiceAccount kubernetes-dashboard kubernetes-dashboard# ClusterRole/kubernetes-dashboard权限如下rootmaster30 ~12:45:47# kubectl describe clusterroles kubernetes-dashboardName: kubernetes-dashboard Labels: k8s-appkubernetes-dashboard Annotations:nonePolicyRule: Resources Non-Resource URLs Resource Names Verbs --------- ----------------- -------------- ----- nodes.metrics.k8s.io[][][get list watch]pods.metrics.k8s.io[][][get list watch]# deployments.apps/kubernetes-dashboard以sa/kubernetes-dashboard身份运行所以deployments.apps/kubernetes-dashboard部署的pod只可以查看资源nodes.metrics.k8s.io和pods.metrics.k8s.iorootmaster30 ~12:46:08# kubectl get deployments.apps kubernetes-dashboard -o yaml|grep serviceAccountserviceAccount: kubernetes-dashboard serviceAccountName: kubernetes-dashboard修改 service/kubernetes-dashboard 类型为 NodePort从外部访问。rootmaster30 ~12:47:41# kubectl edit svc kubernetes-dashboardspec:......type: LoadBalancer rootmaster30 ~12:48:21# kubectl get svc kubernetes-dashboardNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)AGE kubernetes-dashboard LoadBalancer10.98.217.13210.1.8.41443:31487/TCP 14m使用ingress配置访问参考apiVersion:networking.k8s.io/v1kind:Ingressmetadata:name:ingress-dashboardnamespace:kubernetes-dashboardannotations:# 关键透传 TLSIngress 不解密nginx.ingress.kubernetes.io/ssl-passthrough:truenginx.ingress.kubernetes.io/backend-protocol:HTTPSspec:ingressClassName:nginxrules:-host:dashboard.laoma.cloudhttp:paths:-path:/pathType:Prefixbackend:service:name:kubernetes-dashboardport:number:443客户端配置dashboard.laoma.cloud域名到ingress服务地址实验环境是10.1.8.40后续直接访问https://dashboard.laoma.cloud访问 Dashboard访问 https://10.1.8.41新版本Kubernetes Dashboard 新版本只支持使用 Bearer Token登录。rootmaster30 ~12:48:39# kubectl create token -n kubernetes-dashboard kubernetes-dashboardeyJhbGciOiJSUzI1NiIsImtpZCI6IkR0N3owR1lHaVNtbDdsSDhHRDNiZkN0MWF1aEtOT3ZSZUxKbkFwUUE2UncifQ.eyJhdWQiOlsiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWwiXSwiZXhwIjoxNzg2NzczMDIwLCJpYXQiOjE3ODY3Njk0MjAsImlzcyI6Imh0dHBzOi8va3ViZXJuZXRlcy5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsIiwianRpIjoiODQ1MTA5MDMtZTkwZC00ZWE3LTg0ZDQtODAyOTZlM2NiMDdmIiwia3ViZXJuZXRlcy5pbyI6eyJuYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsInNlcnZpY2VhY2NvdW50Ijp7Im5hbWUiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsInVpZCI6IjZkYjQ1MWRmLTQzMzUtNDE3My1iNzZlLTJkMzYyNDE5MmVlZiJ9fSwibmJmIjoxNzg2NzY5NDIwLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZXJuZXRlcy1kYXNoYm9hcmQ6a3ViZXJuZXRlcy1kYXNoYm9hcmQifQ.UXHtTs0aRcXwpi5JFe22J0I9eq1Bz--TX3RQTTyQoOkQNeJpALSij1tiviQIrtWqUe4Of45RG4ar9RJjmILKiSB_jrAoCX3mn8sM1Y8D6qiAC6mbDjoQFSTzjEok-ORhmkxmtNz2hZUS2Y4JZkHU6HAkZbNt-Huhwlrp3FPBJvOzpNX2GFUp8VkGusTy4zNkCSIAAqgb45xi78cxhXpAt_SiHSo2vBJQK3HmbGkhtyEtP84ilGJrW707lGwkHjpk6ky8fHPfh08nCD8UXG9uFEFm5U3dOZOKLBEUy_YzjPoMtIQ-99SGcF5MYpNBc-g7Shk-qc5bsSiGPPzh9KPAEw#当前直接创建的token登录进去没有权限操作Kubernetes Dashboard 默认部署时只配置了最低权限的 RBAC。因此我们要创建一个名为admin-user的 ServiceAccount再创建一个 ClusterRolebinding将其绑定到 Kubernetes 集群中默认初始化的cluster-admin这个 ClusterRole。rootmaster30:~# cat kubernetes-dashboard-admin.yaml EOFapiVersion: v1 kind: ServiceAccount metadata: name: kubernetes-dashboard-admin namespace: kubernetes-dashboard --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: kubernetes-dashboard-admin roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - kind: ServiceAccount name: kubernetes-dashboard-admin namespace: kubernetes-dashboard EOFrootmaster30 ~12:53:53# kubectl apply -f kubernetes-dashboard-admin.yaml# 创建 Bearer Tokenrootmaster30 ~12:53:58# kubectl -n kubernetes-dashboard create token kubernetes-dashboard-admineyJhbGciOiJSUzI1NiIsImtpZCI6IkR0N3owR1lHaVNtbDdsSDhHRDNiZkN0MWF1aEtOT3ZSZUxKbkFwUUE2UncifQ.eyJhdWQiOlsiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWwiXSwiZXhwIjoxNzg2NzczMjc2LCJpYXQiOjE3ODY3Njk2NzYsImlzcyI6Imh0dHBzOi8va3ViZXJuZXRlcy5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsIiwianRpIjoiYTI2MGYwNDQtOTBmYi00MTE5LTk3ZmMtNTkwYjg0ODU5ZTYzIiwia3ViZXJuZXRlcy5pbyI6eyJuYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsInNlcnZpY2VhY2NvdW50Ijp7Im5hbWUiOiJrdWJlcm5ldGVzLWRhc2hib2FyZC1hZG1pbiIsInVpZCI6IjQ3YzA2MDgyLTk2YzQtNGUwNS1iNTk1LTVlZTI4YjMxMmVkYyJ9fSwibmJmIjoxNzg2NzY5Njc2LCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZXJuZXRlcy1kYXNoYm9hcmQ6a3ViZXJuZXRlcy1kYXNoYm9hcmQtYWRtaW4ifQ.UnD6-GI-uqOadFwFC35UIk2MzjbJV2U7oowYOKWaOC2YN0RIK7wabej4YHMhH0I7pyti1F5ilw8Z4AszQL5JpoJHzAqwJ4CFuANieYE5RqO0aVbj3gO-q1jNh8TcfyxLYshFcB6h9ee2wMQi8C6HbgD8CJ4A1xv_rBGGmyrhIffrrO-J6XKI2G3p7IA5gRatK_LVPzaVkykCMgd1sfm6w9xI1FIc3hlwtE60PxVf8igoO67XMfY-CBMQsaNJXegyXzYZlfNaTs3raj2H8kb0O6b4mk2DT47PRdlcoNeYfR8QbdjF96KbXDji9bl1H9IaPgohKbaD3u1Wi6JtAdcVSQ提示Token默认有效期24小时过期后自动删除。下一次登录需要生成新的Token。分析 SA 使用案例Kubernetes Dashboard 默认部署时只配置了最低权限的 RBAC。接下来分析默认的权限配置。# Kubernetes Dashboard 以deployment形式运行rootmaster30 ~12:54:36# kubectl get deployments.appsNAME READY UP-TO-DATE AVAILABLE AGE dashboard-metrics-scraper1/11128m kubernetes-dashboard1/11128m# 以 serviceAccount: kubernetes-dashboard 身份运行rootmaster30 ~13:02:13# kubectl get deployments.apps kubernetes-dashboard -o yaml|grep serviceAcserviceAccount: kubernetes-dashboard serviceAccountName: kubernetes-dashboard# serviceAccount: kubernetes-dashboard 绑定了Role/kubernetes-dashboardrootmaster30 ~13:02:21# kubectl get rolebindingsNAME ROLE AGE kubernetes-dashboard Role/kubernetes-dashboard 35m# Role/kubernetes-dashboard 具备能力如下rootmaster30 ~13:02:53# kubectl describe role kubernetes-dashboardName: kubernetes-dashboard Labels: k8s-appkubernetes-dashboard Annotations:nonePolicyRule: Resources Non-Resource URLs Resource Names Verbs --------- ----------------- -------------- ----- secrets[][kubernetes-dashboard-certs][get update delete]secrets[][kubernetes-dashboard-csrf][get update delete]secrets[][kubernetes-dashboard-key-holder][get update delete]configmaps[][kubernetes-dashboard-settings][get update]services/proxy[][dashboard-metrics-scraper][get]services/proxy[][heapster][get]services/proxy[][http:dashboard-metrics-scraper][get]services/proxy[][http:heapster:][get]services/proxy[][https:heapster:][get]services[][dashboard-metrics-scraper][proxy]services[][heapster][proxy]# 创建 serviceAccount: kubernetes-dashboard Tokenrootmaster30:~# kubectl -n kubernetes-dashboard create token kubernetes-dashboard#这个token没有啥权限
返回列表