云原生 | Kubernetes 原生 Dashboard 已升级至 7.10.x 界面更简便、功能更 ...

打印 上一主题 下一主题

主题 1025|帖子 1025|积分 3075


  
[ 知识是人生的灯塔,只有不断学习,才能照亮前行的门路 ]

  Kubernetes Dashboard 7.10.x

  
大家好,我是 Weiyigeek,今天我们来聊聊怎样在 Kubernetes 集群上安装和使用 Kubernetes Dashboard (原生可视化管理工具)。如果你正在使用或计划在 Kubernetes 上部署应用,那么这个工具绝对值得你深入了解。

  
  
Kubernetes Dashboard 是什么?

  
它是 Kubernetes (原生) 提供的一个基于网页的用户界面,它可以让用户更方便地管理和监控 Kubernetes 集群,通过这个工具,运维和开辟人员不需要记复杂的命令,直接通过可视化界面操作,轻松完成应用部署、资源管理以及集群状态监控等任务,低落了 Kubernetes 的操作门槛,现在版本为 7.10.x 系列,界面更加简便清爽,功能也更增强大。

  
功能特点

  

  • 应用管理:支持通过界面创建、更新和删除 Kubernetes 的各种工作负载(如 Pod、Deployment、DaemonSet、StatefulSet 等)。

  • 可视化监控:实时展示集群中资源的运行状态,包括 CPU、内存等使用情况。

  • 错误诊断:快速查看问题资源的日志、变乱和错误,资助用户排查故障。

  • 访问控制:支持设置权限,确保不同用户只能访问或操作本身负责的部分资源。

  • 简化的多容器支持:对多容器的部署和管理提供了更直观的支持。

  • Ingress 集成:方便设置和管理网络规则,资助用户更简单地设置外部访问。

  • 界面语言:支持英文、中文等多种语言界面,满意不同用户的需求。

  
  
实践情况

  
操作系统:Kylin Linux Advanced Server V10 (Lance)
内核版本: 4.19.90-52.33.v2207.ky10.x86_64
集群版本:Kubernetes v1.28.1 helm 版本: v3.12.3

  
温馨提示:现在(2025年2月16日 20:59:30)最新版本为 7.10.4 ,但支持的 kubernetes 集群版本为 v1.29+ 以上,为了最大水平兼容 K8S 集群版本,这里我选择安装 7.10.0 版本安装。

  

  
weiyigeek.top-Kubernetes Dashboard Github Release图

  
安装最新版本

  1. # Add kubernetes-dashboard repository
  2. helm repo add kubernetes-dashboard https://kubernetes.github.io/dashboard/
  3. # Deploy a Helm Release named "kubernetes-dashboard" using the kubernetes-dashboard chart
  4. helm upgrade --install kubernetes-dashboard kubernetes-dashboard/kubernetes-dashboard --create-namespace --namespace kubernetes-dashboard
复制代码

  
安装指定版本

  

  • 1.下载Helm Chart图表模板并解压

  1. VERSION=7.10.0
  2. wget https://github.com/kubernetes/dashboard/releases/download/v${VERSION}/kubernetes-dashboard-${VERSION}.tgz
  3. tar -xvf kubernetes-dashboard-${VERSION}.tgz
复制代码


  • 2.拉取镜像并推送至私有仓库

  1. tee kubernetesui-images.txt <<'EOF'
  2. docker.io/library/kong:3.6
  3. docker.io/kubernetesui/dashboard-api:1.10.1
  4. docker.io/kubernetesui/dashboard-auth:1.2.2
  5. docker.io/kubernetesui/dashboard-metrics-scraper:1.2.1
  6. docker.io/kubernetesui/dashboard-web:1.6.0
  7. EOF
  8. for image in $(cat kubernetesui-images.txt); do
  9.   docker pull $image
  10.   grep -c "kubernetesui"$image
  11. if [ $? -eq 0 ]; then
  12.     docker tag $image harbor.weiyigeek.top/library/${image#*/}
  13.     docker push harbor.weiyigeek.top/library/${image#*/}
  14. else
  15.     docker tag $image harbor.weiyigeek.top/${image#*/}
  16.     docker push harbor.weiyigeek.top/${image#*/}
  17. fi
  18. done
复制代码


  • 3.修改 values.yaml 文件, 包括其中的镜像所在,此处开启了metrics-scraper和kong插件,特殊留意 kong 镜像所在,若可以正常拉取到 docker.io/library/kong:3.6 镜像,则可以不用修改

  1. app:
  2.   mode: 'dashboard'
  3.   image:
  4.     pullPolicy: IfNotPresent
  5.     pullSecrets: []
  6.   scheduling:
  7.     nodeSelector: {}
  8.   security:
  9.     csrfKey: ~
  10.     securityContext:
  11.       runAsNonRoot: true
  12.       seccompProfile:
  13.         type: RuntimeDefault
  14.     containerSecurityContext:
  15.       allowPrivilegeEscalation: false
  16.       readOnlyRootFilesystem: true
  17.       runAsUser: 1001
  18.       runAsGroup: 2001
  19.       capabilities:
  20.         drop: ["ALL"]
  21.     podDisruptionBudget:
  22.       enabled: false
  23.       minAvailable: 0
  24.       maxUnavailable: 0
  25.     networkPolicy:
  26.       enabled: false
  27.       ingressDenyAll: false
  28.       spec: {}
  29.   labels: {}
  30.   annotations: {}
  31.   priorityClassName: null
  32.   settings:
  33.     global:
  34.     pinnedResources: []
  35.   ingress:
  36.     enabled: false
  37.     hosts:
  38.       - localhost
  39.     ingressClassName: internal-nginx
  40.     useDefaultIngressClass: false
  41.     useDefaultAnnotations: true
  42.     pathType: ImplementationSpecific
  43.     path: /
  44.     issuer:
  45.       name: selfsigned
  46.       scope: default
  47.     tls:
  48.       enabled: true
  49.       secretName: ""
  50.     labels: {}
  51.     annotations: {}
  52.   tolerations: []
  53.   affinity: {}
  54. auth:
  55.   role: auth
  56.   image:
  57.     repository: harbor.weiyigeek.top/library/kubernetesui/dashboard-auth
  58.     tag: 1.2.2
  59.   scaling:
  60.     replicas: 1
  61.     revisionHistoryLimit: 10
  62.   containers:
  63.     ports:
  64.       - name: auth
  65.         containerPort: 8000
  66.         protocol: TCP
  67.     args: []
  68.     env: []
  69.     volumeMounts:
  70.       - mountPath: /tmp
  71.         name: tmp-volume
  72.     resources:
  73.       requests:
  74.         cpu: 100m
  75.         memory: 200Mi
  76.       limits:
  77.         cpu: 250m
  78.         memory: 400Mi
  79.   automountServiceAccountToken: true
  80.   volumes:
  81.     - name: tmp-volume
  82.       emptyDir: {}
  83.   nodeSelector: {}
  84.   labels: {}
  85.   annotations: {}
  86.   serviceLabels: {}
  87.   serviceAnnotations: {}
  88. api:
  89.   role: api
  90.   image:
  91.     repository: harbor.weiyigeek.top/library/kubernetesui/dashboard-api
  92.     tag: 1.10.1
  93.   scaling:
  94.     replicas: 1
  95.     revisionHistoryLimit: 10
  96.   containers:
  97.     ports:
  98.       - name: api
  99.         containerPort: 8000
  100.         protocol: TCP
  101.     args: []
  102.     env: []
  103.     volumeMounts:
  104.       - mountPath: /tmp
  105.         name: tmp-volume
  106.     resources:
  107.       requests:
  108.         cpu: 100m
  109.         memory: 200Mi
  110.       limits:
  111.         cpu: 250m
  112.         memory: 400Mi
  113.   automountServiceAccountToken: true
  114.   volumes:
  115.     - name: tmp-volume
  116.       emptyDir: {}
  117.   nodeSelector: {}
  118.   labels: {}
  119.   annotations: {}
  120.   serviceLabels: {}
  121.   serviceAnnotations: {}
  122. web:
  123.   role: web
  124.   image:
  125.     repository: harbor.weiyigeek.top/library/kubernetesui/dashboard-web
  126.     tag: 1.6.0
  127.   scaling:
  128.     replicas: 1
  129.     revisionHistoryLimit: 10
  130.   containers:
  131.     ports:
  132.       - name: web
  133.         containerPort: 8000
  134.         protocol: TCP
  135.     args: []
  136.     env: []
  137.     volumeMounts:
  138.       - mountPath: /tmp
  139.         name: tmp-volume
  140.     resources:
  141.       requests:
  142.         cpu: 100m
  143.         memory: 200Mi
  144.       limits:
  145.         cpu: 250m
  146.         memory: 400Mi
  147.   automountServiceAccountToken: true
  148.   volumes:
  149.     - name: tmp-volume
  150.       emptyDir: {}
  151.   nodeSelector: {}
  152.   labels: {}
  153.   annotations: {}
  154.   serviceLabels: {}
  155.   serviceAnnotations: {}
  156. metricsScraper:
  157.   enabled: true
  158.   role: metrics-scraper
  159.   image:
  160.     repository: harbor.weiyigeek.top/library/kubernetesui/dashboard-metrics-scraper
  161.     tag: 1.2.1
  162.   scaling:
  163.     replicas: 1
  164.     revisionHistoryLimit: 10
  165.   containers:
  166.     ports:
  167.       - containerPort: 8000
  168.         protocol: TCP
  169.     args: []
  170.     env: []
  171.     volumeMounts:
  172.       - mountPath: /tmp
  173.         name: tmp-volume
  174.     resources:
  175.       requests:
  176.         cpu: 100m
  177.         memory: 200Mi
  178.       limits:
  179.         cpu: 250m
  180.         memory: 400Mi
  181.     livenessProbe:
  182.       httpGet:
  183.         scheme: HTTP
  184.         path: /
  185.         port: 8000
  186.       initialDelaySeconds: 30
  187.       timeoutSeconds: 30
  188.   automountServiceAccountToken: true
  189.   volumes:
  190.     - name: tmp-volume
  191.       emptyDir: {}
  192.   nodeSelector: {}
  193.   labels: {}
  194.   annotations: {}
  195.   serviceLabels: {}
  196.   serviceAnnotations: {}
  197. metrics-server:
  198.   enabled: false
  199.   args:
  200.     - --kubelet-preferred-address-types=InternalIP
  201.     - --kubelet-insecure-tls
  202. kong:
  203.   enabled: true
  204.   env:
  205.     dns_order: LAST,A,CNAME,AAAA,SRV
  206.     plugins: 'off'
  207.     nginx_worker_processes: 1
  208.   ingressController:
  209.     enabled: false
  210.   manager:
  211.     enabled: false
  212.   dblessConfig:
  213.     configMap: kong-dbless-config
  214.   proxy:
  215.     type: ClusterIP
  216.     http:
  217.       enabled: true
复制代码


  • 4.部署Kubernetes Dashboard,指定上述更改后的values.yaml文件,这里作者安装到 kube-system 定名空间中,你可根据需要安装到指定名称空间下。

  1. helm upgrade k8s-dashboard --namespace kube-system ./kubernetes-dashboard/ -f values.yaml --debug --create-namespace
复制代码


  • 5.创建Kubernetes Dashboard的访问用户,这里创建一个名为admin-user的用户,作为管理集群的管理用户。

  
访问权限创建参考文档所在:https://github.com/kubernetes/dashboard/blob/master/docs/user/access-control/creating-sample-user.md

  1. # 1.创建ServiceAccount和ClusterRoleBinding,赋予admin权限
  2. cat <<'EOF' | kubectl apply -f -
  3. # Creating a Service Account
  4. apiVersion: v1
  5. kind: ServiceAccount
  6. metadata:
  7.   name: admin-user
  8.   namespace: kube-system
  9. EOF
  10. cat <<'EOF' | kubectl apply -f -
  11. # Creating a ClusterRoleBinding
  12. apiVersion: rbac.authorization.k8s.io/v1
  13. kind: ClusterRoleBinding
  14. metadata:
  15.   name: admin-user
  16. roleRef:
  17.   apiGroup: rbac.authorization.k8s.io
  18.   kind: ClusterRole
  19.   name: cluster-admin
  20. subjects:
  21. - kind: ServiceAccount
  22.   name: admin-user
  23.   namespace: kube-system
  24. EOF
  25. # 2.创建token,用于登录Kubernetes Dashboard (注意有效期 24H)
  26. kubectl -n kube-system create token admin-user
  27.   eyJhbGciOiJSUzI1........*****......qaONP9w
  28. # 3.为ServiceAccount创建不失效的令牌
  29. cat <<'EOF' | kubectl apply -f -
  30. apiVersion: v1
  31. kind: Secret
  32. metadata:
  33.   name: admin-user
  34.   namespace: kube-system
  35.   annotations:
  36.     kubernetes.io/service-account.name: "admin-user"   
  37. type: kubernetes.io/service-account-token  
  38. EOF
  39. kubectl get secret admin-user -n kube-system -o jsonpath="{.data.token}" | base64 -d
复制代码
使用上述天生的token,登录Kubernetes Dashboard,登录界面如下所示:

  

  
     weiyigeek.top-Kubernetes仪表板图   

  • 6.创建只读用户,用于查看集群资源信息,主要针对某些情况下,固然你可以细化分指定名称空间下的资源,此处作者是全局可浏览(只读)。

  1. # 创建ServiceAccount、ClusterRole和ClusterRoleBinding,赋予只读权限
  2. cat <<'EOF' | kubectl apply -f -
  3. # Creating a Service Account
  4. apiVersion: v1
  5. kind: ServiceAccount
  6. metadata:
  7.   name: view-user
  8.   namespace: kube-system
  9. ---
  10. apiVersion: rbac.authorization.k8s.io/v1
  11. kind: ClusterRole
  12. metadata:
  13.   name: global-view
  14. rules:
  15. - apiGroups: ["*"]  # 匹配所有 API 组
  16.   resources: ["*"]  # 匹配所有资源
  17.   verbs: ["get", "list", "watch"]  # 只允许读取操作
  18. ---
  19. apiVersion: rbac.authorization.k8s.io/v1
  20. kind: ClusterRoleBinding
  21. metadata:
  22.   name: view-user-binding
  23. roleRef:
  24.   apiGroup: rbac.authorization.k8s.io
  25.   kind: ClusterRole
  26.   name: global-view
  27. subjects:
  28. - kind: ServiceAccount
  29.   name: view-user
  30.   namespace: kube-system
  31. EOF
  32. # 创建临时访问 token,用于登录Kubernetes Dashboard (注意有效期 24H)
  33. kubectl -n kube-system create token view-user 
  34.   eyJhbGciOiJSUzI1Ni****M8NEGKuKtWUPz9yjiAWKohWaV3M5tgZQJAQFpLfr0G8F-1dz5-0ZRy0-jy_gbLTDwUgsldlw
复制代码


  • 7.查看Kubernetes Dashboard服务,以及使用ingress-nginx暴露访问所在,创建 TLS secret 想必大家都会吧此处不再累述,如下所示:

  1. # 查看服务信息
  2. kubectl get svc -n kube-system
  3.   NAME                                                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                  AGE
  4.   k8s-dashboard-kong-proxy                             ClusterIP   10.96.27.85     <none>        80/TCP,443/TCP           4d7h
  5.   k8s-dashboard-kubernetes-dashboard-api               ClusterIP   10.96.92.63     <none>        8000/TCP                 4d8h
  6.   k8s-dashboard-kubernetes-dashboard-auth              ClusterIP   10.96.112.178   <none>        8000/TCP                 4d8h
  7.   k8s-dashboard-kubernetes-dashboard-metrics-scraper   ClusterIP   10.96.51.74     <none>        8000/TCP                 4d8h
  8.   k8s-dashboard-kubernetes-dashboard-web               ClusterIP   10.96.17.199    <none>        8000/TCP                 4d8h
  9. # 创建ingress规则,暴露访问地址
  10. vim ingress.yaml
  11. apiVersion: networking.k8s.io/v1
  12. kind: Ingress
  13. metadata:
  14.   annotations:
  15.     ingressclass.kubernetes.io/is-default-class: "true"
  16.     nginx.ingress.kubernetes.io/client-body-buffer-size: 50m
  17.     nginx.ingress.kubernetes.io/proxy-body-size: 50m
  18.     nginx.ingress.kubernetes.io/proxy-buffer-size: 50m
  19.     nginx.ingress.kubernetes.io/proxy-buffering: "on"
  20.     nginx.ingress.kubernetes.io/proxy-buffers-number: "4"
  21.     nginx.ingress.kubernetes.io/proxy-connect-timeout: 60s
  22.     nginx.ingress.kubernetes.io/proxy-read-timeout: 120s
  23.     nginx.ingress.kubernetes.io/proxy-send-timeout: 120s
  24.     nginx.ingress.kubernetes.io/rewrite-target: /$2
  25.   labels:
  26.     app: manager
  27.     ref: manager
  28.     url: manager.weiyigeek.top
  29.   name: manager-sec
  30.   namespace: kube-system
  31. spec:
  32.   ingressClassName: nginx
  33.   rules:
  34.   - host: manager.weiyigeek.top
  35.     http:
  36.       paths:
  37.       - backend:
  38.           service:
  39.             name: k8s-dashboard-kong-proxy
  40.             port:
  41.               number: 80
  42.         path: /dashboard(/|$)(.*)
  43.         pathType: ImplementationSpecific
  44.   tls:
  45.   - hosts:
  46.     - manager.weiyigeek.top
  47.     secretName: ssl-weiyigeek-top
复制代码
浏览器访问 https://manager.weiyigeek.top/dashboard ,输入 Token 凭据即可访问 Kubernetes Dashboard 7.10.x 管理界面,如下所示:

  

  


     weiyigeek.top-K8s Dashboard 7.10.x 管理界面图   
管理创建的 Deployment、StatefulSet、DaemonSet 以及 Pods 等资源,如下所示:

  

  


     weiyigeek.top-资源管理图   
至此,实践完毕,盼望此文对大家有所资助。

  
若文章写得不错,不要吝惜手中转发,点赞、在看,如有疑问的小同伴,可在评论区留言你想法哟

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

愛在花開的季節

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表