搭建 Kubernetes 集群 Dashboard 2.0+ 可视化插件

一、概述

Kubernetes 还开发了一个基于 Web 的 Dashboard,用户可以用 Kubernetes Dashboard 部署容器化的应用、监控应用的状态、执行故障排查任务以及管理 Kubernetes 各种资源。

Dashboard 的 GitHub 地址:https://github.com/kubernetes/dashboard

二、系统环境

  • Kubernetes 版本:1.18.5
  • kubernetes-dashboard 版本:v2.0.3

三、兼容性

Kubernetes版本 1.13 1.14 1.15 1.16 1.17 1.18
兼容性 ?
  • ✕ 不支持的版本范围。
  • ✓ 完全支持的版本范围。
  • ? 由于Kubernetes API版本之间的重大更改,某些功能可能无法在仪表板中正常运行。

四、下载安装

执行安装:

$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.2/aio/deploy/recommended.yaml
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.2/aio/deploy/recommended.yaml
namespace/kubernetes-dashboard created
serviceaccount/kubernetes-dashboard created
service/kubernetes-dashboard created
secret/kubernetes-dashboard-certs created
secret/kubernetes-dashboard-csrf created
secret/kubernetes-dashboard-key-holder created
configmap/kubernetes-dashboard-settings created
role.rbac.authorization.k8s.io/kubernetes-dashboard created
clusterrole.rbac.authorization.k8s.io/kubernetes-dashboard created
rolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created
clusterrolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created
deployment.apps/kubernetes-dashboard created
service/dashboard-metrics-scraper created
deployment.apps/dashboard-metrics-scraper created

可以看到新版本 Dashboard 集成了一个 metrics-scraper 的组件,可以通过 Kubernetes 的 Metrics API 收集一些基础资源的监控信息,并在 web 页面上展示,所以要想在页面上展示监控信息就需要提供 Metrics API,前提需要安装 Metrics Server。

新版本的 Dashboard 会被默认安装在 kubernetes-dashboard 这个命名空间下面,查看 pod 名称:

$ kubectl get pods --namespace=kubernetes-dashboard -o wide
NAME                                         READY   STATUS    RESTARTS   AGE     IP           NODE        NOMINATED NODE   READINESS GATES
dashboard-metrics-scraper-6b4884c9d5-jdw22   1/1     Running   0          7h42m   10.244.3.3   k8s-node2   <none>           <none>
kubernetes-dashboard-7bfbb48676-l28c9        1/1     Running   0          7h38m   10.244.2.6   k8s-node3   <none>           <none>

五、修改为 NodePort 访问

将 dashboard 改为 NodePort 方式访问,不使用 API Server 访问。因为 API Server 访问特别麻烦,一大串,比如:http://172.16.106.226:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/

如果是 NodePort 方式访问,就比较简单了,比如:https://172.16.106.209:32027/

查看 kubernetes-dashboard:

kubectl --namespace=kubernetes-dashboard get service kubernetes-dashboard
$ kubectl --namespace=kubernetes-dashboard get service kubernetes-dashboard
NAME                   TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)         AGE
kubernetes-dashboard   ClusterIP  10.98.194.221   <none>        443/TCP   7h45m

编辑 kubernetes-dashboard

kubectl --namespace=kubernetes-dashboard edit service kubernetes-dashboard

将里面的type: ClusterIP改为type: NodePort即可。
保存等一会儿,重新查看,就变为 NodePort 了。

$ kubectl --namespace=kubernetes-dashboard get service kubernetes-dashboard
NAME                   TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)         AGE
kubernetes-dashboard   NodePort   10.98.194.221   <none>        443:32027/TCP   7h45m

六、证书管理

Dashboard 安装完成,改为 NodePort 形式之后,通过 https://172.16.106.209:32027/ 访问,会提示安全信息如下:

搭建 Kubernetes 集群 Dashboard 2.0+ 可视化插件

这就无法访问了,需要生成证书,这个比较简单,照着下面来就行:

#Step 1: 新建目录:
mkdir key && cd key

#Step 2: 生成 SSL 证书
openssl genrsa -out dashboard.key 2048

#Step 3: 我这里写的自己的 node1 节点,因为我是通过 nodeport 访问的;如果通过 apiserver 访问,可以写成自己的 master 节点 ip
openssl req -new -out dashboard.csr -key dashboard.key -subj '/CN=172.16.106.209'
openssl x509 -req -in dashboard.csr -signkey dashboard.key -out dashboard.crt

#Step 4: 删除原有的证书 secret
kubectl delete secret kubernetes-dashboard-certs -n kubernetes-dashboard

#Step 5: 创建新的证书 secret
kubectl create secret generic kubernetes-dashboard-certs --from-file=dashboard.key --from-file=dashboard.crt -n kubernetes-dashboard

#Step 6: 查看 pod
kubectl get pod -n kubernetes-dashboard

#Step 7: 重启 pod
kubectl delete pod kubernetes-dashboard-7b5bf5d559-gn4ls  -n kubernetes-dashboard

执行完成之后,再次访问点开高级之后,有个继续前往的链接,点击即可:

搭建 Kubernetes 集群 Dashboard 2.0+ 可视化插件

七、创建访问的 ServiceAccount

最后需要创建一个绑定 admin 权限的 ServiceAccount,获取其 Token 用于访问看板。

1、创建用户

新建文件名admin-user.yaml,复制下面一段:

apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard

复制到admin-user.yaml文件后,执行:kubectl create -f admin-user.yaml

2、绑定用户关系

新建文件admin-user-role-binding.yaml

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: kubernetes-dashboard

复制到 admin-user-role-binding.yaml 文件后,执行:kubectl create -f admin-user-role-binding.yaml

如果过程中提示存在或者需要删除,只需要 kubectl delete -f 相应的 yaml 文件即可。

八、获取令牌

按照官网提示的获取 token 方法:

kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')
$ kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')
Name:         admin-user-token-s5k78
Namespace:    kubernetes-dashboard
Labels:       <none>
Annotations:  kubernetes.io/service-account.name: admin-user
kubernetes.io/service-account.uid: f5d700df-bbba-4425-905e-dc3ff597d535
Type:  kubernetes.io/service-account-token
Data
====
ca.crt:     1025 bytes
namespace:  20 bytes
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6InJpUEFuZEVpTnZCb1d3cmRIZHdSNDZvUXVVNFZjSWM3ZlpBMEhRWkxMSTAifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLXM1azc4Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiJmNWQ3MDBkZi1iYmJhLTQ0MjUtOTA1ZS1kYzNmZjU5N2Q1MzUiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZXJuZXRlcy1kYXNoYm9hcmQ6YWRtaW4tdXNlciJ9.OM_HAmENxAjjH-uzsFLgVpYiH5e7KmU9Y76CL1k1rFZJBctyAyqeOJGJiRcTbaDp10dBS6Qm4bNKfmP2Tq3in5G6odxbibhx6F13XcHMcCMD_UMPjndD0s9Vw4rih0jShJC7uyhE0fV6jBBsPK2iGzx6Z3wyw6RaeZmDUJ6E_gKc3uvjAjBiCZj5DvwVtj-_BQbCNTGGlADm9MLwceuzIXnYCeJMrFFVCOxj0fEdzB59E_x-BCzwyedZfhWC0CSmKkRSw9dqm11rFPWp3mIa_f6APFe69WfMNovpFeme9qhtF7s49WZdOf08fUwznJVK4QFdk0TtKUEigs7SI_aoRw

九、登录新版本 Dashboard 查看

本人的 Kubernetes 集群地址为”172.16.106.209”并且在 Service 中设置了 NodePort 端口为 32027和类型为 NodePort 方式访问 Dashboard ,所以访问地址:https://172.16.106.209:32027 进入 Kubernetes Dashboard 页面,然后输入上一步中创建的 ServiceAccount 的 Token 进入 Dashboard,可以看到新的 Dashboard。
搭建 Kubernetes 集群 Dashboard 2.0+ 可视化插件

搭建 Kubernetes 集群 Dashboard 2.0+ 可视化插件
跟上一个版本比较,整体风格更加简洁,并且,可以感受到的是这个页面比以前访问速度更加快速(估计是加了缓存),除了之外还增加了:

  • 新增黑色主题
  • 新增对 CRD 的管理
  • 新增对集群角色的编辑
  • 新增对 kubernetes 对象以 yaml 格式进行编辑
  • 修改集群资源指标的监控监控信息以及看板样式

搭建 Kubernetes 集群 Dashboard 2.0+ 可视化插件
搭建 Kubernetes 集群 Dashboard 2.0+ 可视化插件
搭建 Kubernetes 集群 Dashboard 2.0+ 可视化插件
搭建 Kubernetes 集群 Dashboard 2.0+ 可视化插件

搭建 Kubernetes 集群 Dashboard 2.0+ 可视化插件

示例源码:

上一篇:Kubernetes 高可用集群落地二三事


下一篇:Kubernetes 集群包管理器 Helm3 部署