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

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

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图

安装最新版本

go 复制代码
# Add kubernetes-dashboard repository
helm repo add kubernetes-dashboard https://kubernetes.github.io/dashboard/

# Deploy a Helm Release named "kubernetes-dashboard" using the kubernetes-dashboard chart
helm upgrade --install kubernetes-dashboard kubernetes-dashboard/kubernetes-dashboard --create-namespace --namespace kubernetes-dashboard

安装指定版本

  • 1.下载Helm Chart图表模板并解压
go 复制代码
VERSION=7.10.0
wget https://github.com/kubernetes/dashboard/releases/download/v${VERSION}/kubernetes-dashboard-${VERSION}.tgz
tar -xvf kubernetes-dashboard-${VERSION}.tgz
  • 2.拉取镜像并推送至私有仓库
go 复制代码
tee kubernetesui-images.txt <<'EOF'
docker.io/library/kong:3.6
docker.io/kubernetesui/dashboard-api:1.10.1
docker.io/kubernetesui/dashboard-auth:1.2.2
docker.io/kubernetesui/dashboard-metrics-scraper:1.2.1
docker.io/kubernetesui/dashboard-web:1.6.0
EOF

for image in $(cat kubernetesui-images.txt); do
  docker pull $image
  grep -c "kubernetesui"$image
if [ $? -eq 0 ]; then
    docker tag $image harbor.weiyigeek.top/library/${image#*/}
    docker push harbor.weiyigeek.top/library/${image#*/}
else
    docker tag $image harbor.weiyigeek.top/${image#*/}
    docker push harbor.weiyigeek.top/${image#*/}
fi
done
  • 3.修改 values.yaml 文件, 包括其中的镜像地址,此处开启了metrics-scraper和kong插件,特别注意 kong 镜像地址,若可以正常拉取到 docker.io/library/kong:3.6 镜像,则可以不用修改
go 复制代码
app:
  mode: 'dashboard'
  image:
    pullPolicy: IfNotPresent
    pullSecrets: []
  scheduling:
    nodeSelector: {}
  security:
    csrfKey: ~
    securityContext:
      runAsNonRoot: true
      seccompProfile:
        type: RuntimeDefault
    containerSecurityContext:
      allowPrivilegeEscalation: false
      readOnlyRootFilesystem: true
      runAsUser: 1001
      runAsGroup: 2001
      capabilities:
        drop: ["ALL"]
    podDisruptionBudget:
      enabled: false
      minAvailable: 0
      maxUnavailable: 0
    networkPolicy:
      enabled: false
      ingressDenyAll: false
      spec: {}

  labels: {}
  annotations: {}
  priorityClassName: null
  settings:
    global:
    pinnedResources: []
  ingress:
    enabled: false
    hosts:
      - localhost
    ingressClassName: internal-nginx
    useDefaultIngressClass: false
    useDefaultAnnotations: true
    pathType: ImplementationSpecific
    path: /
    issuer:
      name: selfsigned
      scope: default
    tls:
      enabled: true
      secretName: ""
    labels: {}
    annotations: {}
  tolerations: []
  affinity: {}

auth:
  role: auth
  image:
    repository: harbor.weiyigeek.top/library/kubernetesui/dashboard-auth
    tag: 1.2.2
  scaling:
    replicas: 1
    revisionHistoryLimit: 10
  containers:
    ports:
      - name: auth
        containerPort: 8000
        protocol: TCP
    args: []
    env: []
    volumeMounts:
      - mountPath: /tmp
        name: tmp-volume
    resources:
      requests:
        cpu: 100m
        memory: 200Mi
      limits:
        cpu: 250m
        memory: 400Mi
  automountServiceAccountToken: true
  volumes:
    - name: tmp-volume
      emptyDir: {}
  nodeSelector: {}
  labels: {}
  annotations: {}
  serviceLabels: {}
  serviceAnnotations: {}

api:
  role: api
  image:
    repository: harbor.weiyigeek.top/library/kubernetesui/dashboard-api
    tag: 1.10.1
  scaling:
    replicas: 1
    revisionHistoryLimit: 10
  containers:
    ports:
      - name: api
        containerPort: 8000
        protocol: TCP
    args: []
    env: []
    volumeMounts:
      - mountPath: /tmp
        name: tmp-volume
    resources:
      requests:
        cpu: 100m
        memory: 200Mi
      limits:
        cpu: 250m
        memory: 400Mi
  automountServiceAccountToken: true
  volumes:
    - name: tmp-volume
      emptyDir: {}
  nodeSelector: {}
  labels: {}
  annotations: {}
  serviceLabels: {}
  serviceAnnotations: {}

web:
  role: web
  image:
    repository: harbor.weiyigeek.top/library/kubernetesui/dashboard-web
    tag: 1.6.0
  scaling:
    replicas: 1
    revisionHistoryLimit: 10
  containers:
    ports:
      - name: web
        containerPort: 8000
        protocol: TCP
    args: []
    env: []
    volumeMounts:
      - mountPath: /tmp
        name: tmp-volume
    resources:
      requests:
        cpu: 100m
        memory: 200Mi
      limits:
        cpu: 250m
        memory: 400Mi
  automountServiceAccountToken: true
  volumes:
    - name: tmp-volume
      emptyDir: {}
  nodeSelector: {}
  labels: {}
  annotations: {}
  serviceLabels: {}
  serviceAnnotations: {}

metricsScraper:
  enabled: true
  role: metrics-scraper
  image:
    repository: harbor.weiyigeek.top/library/kubernetesui/dashboard-metrics-scraper
    tag: 1.2.1
  scaling:
    replicas: 1
    revisionHistoryLimit: 10
  containers:
    ports:
      - containerPort: 8000
        protocol: TCP
    args: []
    env: []
    volumeMounts:
      - mountPath: /tmp
        name: tmp-volume
    resources:
      requests:
        cpu: 100m
        memory: 200Mi
      limits:
        cpu: 250m
        memory: 400Mi
    livenessProbe:
      httpGet:
        scheme: HTTP
        path: /
        port: 8000
      initialDelaySeconds: 30
      timeoutSeconds: 30
  automountServiceAccountToken: true
  volumes:
    - name: tmp-volume
      emptyDir: {}
  nodeSelector: {}
  labels: {}
  annotations: {}
  serviceLabels: {}
  serviceAnnotations: {}

metrics-server:
  enabled: false
  args:
    - --kubelet-preferred-address-types=InternalIP
    - --kubelet-insecure-tls

kong:
  enabled: true
  env:
    dns_order: LAST,A,CNAME,AAAA,SRV
    plugins: 'off'
    nginx_worker_processes: 1
  ingressController:
    enabled: false
  manager:
    enabled: false
  dblessConfig:
    configMap: kong-dbless-config
  proxy:
    type: ClusterIP
    http:
      enabled: true
  • 4.部署Kubernetes Dashboard,指定上述更改后的values.yaml文件,这里作者安装到 kube-system 命名空间中,你可根据需要安装到指定名称空间下。
go 复制代码
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

go 复制代码
# 1.创建ServiceAccount和ClusterRoleBinding,赋予admin权限
cat <<'EOF' | kubectl apply -f -
# Creating a Service Account
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kube-system
EOF

cat <<'EOF' | kubectl apply -f -
# Creating a ClusterRoleBinding
apiVersion: 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: kube-system
EOF

# 2.创建token,用于登录Kubernetes Dashboard (注意有效期 24H)
kubectl -n kube-system create token admin-user
  eyJhbGciOiJSUzI1........*****......qaONP9w

# 3.为ServiceAccount创建不失效的令牌
cat <<'EOF' | kubectl apply -f -
apiVersion: v1
kind: Secret
metadata:
  name: admin-user
  namespace: kube-system
  annotations:
    kubernetes.io/service-account.name: "admin-user"   
type: kubernetes.io/service-account-token  
EOF

kubectl get secret admin-user -n kube-system -o jsonpath="{.data.token}" | base64 -d

使用上述生成的token,登录Kubernetes Dashboard,登录界面如下所示:

weiyigeek.top-Kubernetes仪表板图

  • 6.创建只读用户,用于查看集群资源信息,主要针对某些情况下,当然你可以细化分指定名称空间下的资源,此处作者是全局可浏览(只读)。
go 复制代码
# 创建ServiceAccount、ClusterRole和ClusterRoleBinding,赋予只读权限
cat <<'EOF' | kubectl apply -f -
# Creating a Service Account
apiVersion: v1
kind: ServiceAccount
metadata:
  name: view-user
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: global-view
rules:
- apiGroups: ["*"]  # 匹配所有 API 组
  resources: ["*"]  # 匹配所有资源
  verbs: ["get", "list", "watch"]  # 只允许读取操作
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: view-user-binding
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: global-view
subjects:
- kind: ServiceAccount
  name: view-user
  namespace: kube-system
EOF

# 创建临时访问 token,用于登录Kubernetes Dashboard (注意有效期 24H)
kubectl -n kube-system create token view-user 
  eyJhbGciOiJSUzI1Ni****M8NEGKuKtWUPz9yjiAWKohWaV3M5tgZQJAQFpLfr0G8F-1dz5-0ZRy0-jy_gbLTDwUgsldlw
  • 7.查看Kubernetes Dashboard服务,以及使用ingress-nginx暴露访问地址,创建 TLS secret 想必大家都会吧此处不再累述,如下所示:
go 复制代码
# 查看服务信息
kubectl get svc -n kube-system
  NAME                                                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                  AGE
  k8s-dashboard-kong-proxy                             ClusterIP   10.96.27.85     <none>        80/TCP,443/TCP           4d7h
  k8s-dashboard-kubernetes-dashboard-api               ClusterIP   10.96.92.63     <none>        8000/TCP                 4d8h
  k8s-dashboard-kubernetes-dashboard-auth              ClusterIP   10.96.112.178   <none>        8000/TCP                 4d8h
  k8s-dashboard-kubernetes-dashboard-metrics-scraper   ClusterIP   10.96.51.74     <none>        8000/TCP                 4d8h
  k8s-dashboard-kubernetes-dashboard-web               ClusterIP   10.96.17.199    <none>        8000/TCP                 4d8h

# 创建ingress规则,暴露访问地址
vim ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    ingressclass.kubernetes.io/is-default-class: "true"
    nginx.ingress.kubernetes.io/client-body-buffer-size: 50m
    nginx.ingress.kubernetes.io/proxy-body-size: 50m
    nginx.ingress.kubernetes.io/proxy-buffer-size: 50m
    nginx.ingress.kubernetes.io/proxy-buffering: "on"
    nginx.ingress.kubernetes.io/proxy-buffers-number: "4"
    nginx.ingress.kubernetes.io/proxy-connect-timeout: 60s
    nginx.ingress.kubernetes.io/proxy-read-timeout: 120s
    nginx.ingress.kubernetes.io/proxy-send-timeout: 120s
    nginx.ingress.kubernetes.io/rewrite-target: /$2
  labels:
    app: manager
    ref: manager
    url: manager.weiyigeek.top
  name: manager-sec
  namespace: kube-system
spec:
  ingressClassName: nginx
  rules:
  - host: manager.weiyigeek.top
    http:
      paths:
      - backend:
          service:
            name: k8s-dashboard-kong-proxy
            port:
              number: 80
        path: /dashboard(/|$)(.*)
        pathType: ImplementationSpecific
  tls:
  - hosts:
    - manager.weiyigeek.top
    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-资源管理图

至此,实践完毕,希望此文对大家有所帮助。

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

温馨提示:作者最近10年的工作学习笔记(涉及网络、安全、运维、开发),需要学习实践笔记的看友,可添加作者账号[WeiyiGeeker],当前价格¥199,除了获得从业笔记的同时还可进行问题答疑以及每月远程技术支持,希望大家多多支持,收获定大于付出!


如果此篇文章对你有帮助,请你将它转发给更多的人!

学习推荐 往期文章

相关推荐
鸡鸭扣32 分钟前
Docker:3、在VSCode上安装并运行python程序或JavaScript程序
运维·vscode·python·docker·容器·js
A ?Charis1 小时前
k8s-对接NFS存储
linux·服务器·kubernetes
KTKong3 小时前
kubeadm拉起的k8s集群证书过期的做法集群已奔溃也可以解决
云原生·容器·kubernetes
人工干智能4 小时前
科普:“Docker Desktop”和“Docker”以及“WSL”
运维·docker·容器
落笔画忧愁e4 小时前
FastGPT及大模型API(Docker)私有化部署指南
运维·docker·容器
一天八小时4 小时前
Docker学习进阶
学习·docker·容器
呱牛do it5 小时前
【系列专栏】银行IT的云原生架构-混合云弹性架构 13
微服务·云原生·金融·架构
阿里云云原生9 小时前
IDEA + 通义灵码AI程序员:快速构建DDD后端工程模板
云原生
运维开发王义杰11 小时前
Kubernetes:EKS 中 Istio Ingress Gateway 负载均衡器配置及常见问题解析
kubernetes·gateway·istio
成长的小牛23311 小时前
阿里云k8s服务部署操作一指禅
阿里云·kubernetes·云计算