終於不用敲命令了——Kubernetes之Dashboard部署與使用詳解

終於不用敲命令了——Kubernetes之Dashboard部署

前言

​ 前面的幾篇文章帶着大家體驗和部署了一下基於二進制方式部署Kubernetes高可用集羣的流程,本文將通過部署Kubernetes的web界面來給大家體驗一下使用ui界面管理、監控、使用k8s集羣的魅力。

先把節點ip地址介紹一下,以免待會測試驗證的時候無法敘說清楚

master01:192.168.0.128

master02:192.168.0.131

node01:192.168.0.129

node02:192.168.0.130

兩臺作爲負載均衡的LB服務器就暫時不寫了,因爲本文可以不考慮這個層面。

Kubernetes的Dashboard部署流程

我們在master01節點上部署該web ui界面。

首先在k8s工作目錄中創建一個Dashboard的工作目錄

[root@master01 k8s]# mkdir dashboard
[root@master01 k8s]# cd dashboard/
#下載構建該界面的核心文件,資源地址:(https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/dashboard)
#一共是下載了5個yaml文件,待會會一邊使用一邊介紹各個文件的作用和核心參數配置
#下面會有6個,其中一個(k8s-admin.yaml是自己寫的,是用來做待會在瀏覽器中登錄時的令牌的)
[root@master01 dashboard]# ls
dashboard-configmap.yaml   dashboard-rbac.yaml    dashboard-service.yaml
dashboard-controller.yaml  dashboard-secret.yaml  k8s-admin.yaml

先大體上按照待會執行的順序來講一下每個文件的作用吧

1、dashboard-rbac.yaml :用於訪問控制設置,配置各種角色的訪問控制權限及角色綁定(綁定角色和服務賬戶),內容中包含對應各種角色所配置的規則(rules)

2、dashboard-secret.yaml:提供令牌,訪問API服務器所用(個人理解爲一種安全認證機制)

3、dashboard-configmap.yaml :配置文件,負責設置Dashboard的文件

4、dashboard-controller.yaml:負責控制器及服務賬戶的創建

5、dashboard-service.yaml:負責將容器中的服務提供出去

通過kubectl create 命令創建resources,對照中文件來理解筆者下面的解釋

1、規定kubernetes-dashboard-minimal該角色的權限:例如其中具備獲取更新刪除等不同的權限
[root@master01 dashboard]# kubectl create -f dashboard-rbac.yaml 
role.rbac.authorization.k8s.io/kubernetes-dashboard-minimal created
rolebinding.rbac.authorization.k8s.io/kubernetes-dashboard-minimal created
有幾個kind就會有幾個結果被創建,格式爲kind+apiServer/name
2、證書和密鑰創建
[root@master01 dashboard]# kubectl create -f dashboard-secret.yaml 
secret/kubernetes-dashboard-certs created
secret/kubernetes-dashboard-key-holder created
3、配置文件,對於集羣dashboard設置的創建
[root@master01 dashboard]# kubectl create -f dashboard-configmap.yaml 
configmap/kubernetes-dashboard-settings created
4、創建容器需要的控制器以及服務賬戶
[root@master01 dashboard]# kubectl create -f dashboard-controller.yaml 
serviceaccount/kubernetes-dashboard created
deployment.apps/kubernetes-dashboard created
5、將服務提供出去
[root@master01 dashboard]# kubectl create -f dashboard-service.yaml 
service/kubernetes-dashboard created

2、查看創建dashboard狀態

[root@master01 dashboard]# kubectl get pods -n kube-system
NAME                                    READY   STATUS    RESTARTS   AGE
kubernetes-dashboard-65f974f565-5vgq9   1/1     Running   0          61s

狀態是running,表示創建成功了【-n kube-system表示指定查看命名空間中的pod】

3、查看服務分配的端口等信息

[root@master01 dashboard]# kubectl get svc -n kube-system
NAME                   TYPE       CLUSTER-IP   EXTERNAL-IP   PORT(S)         AGE
kubernetes-dashboard   NodePort   10.0.0.212   <none>        443:30001/TCP   2m31s

這個10.0.0.212是內部訪問的地址,本文所講內容對此可以暫時不需要過多理解。

PS:此處的svc是service的簡寫,可以通過下面的命令查看有哪些命令參數可以簡寫

[root@master01 dashboard]# kubectl api-resources
#內容較多可以自己嘗試驗證一下

4、測試訪問web ui 界面地址(結合映射的端口號)

首先通過下面的命令查看分配的節點服務器(之前的文章中也使用過就不多解釋了)

[root@master01 dashboard]# kubectl get pods,svc -n kube-system -o wide
NAME                                        READY   STATUS    RESTARTS   AGE   IP            NODE            NOMINATED NODE
pod/kubernetes-dashboard-65f974f565-5vgq9   1/1     Running   0          12m   172.17.70.3   192.168.0.130   <none>

NAME                           TYPE       CLUSTER-IP   EXTERNAL-IP   PORT(S)         AGE   SELECTOR
service/kubernetes-dashboard   NodePort   10.0.0.212   <none>        443:30001/TCP   12m   k8s-app=kubernetes-dashboard

從執行的結果來看,是分配給了node02服務器,訪問的入口是30001端口,那麼就打開瀏覽器來進行訪問測試,結果和原因分析如下圖所示(需要點擊“隱藏詳情”位置的“高級”控件才能看到詳情信息)

終於不用敲命令了——Kubernetes之Dashboard部署與使用詳解

5、解決加密通信問題

因此,我們需要爲此次構建來寫對應的認證證書。這裏筆者使用的shell腳本來快速生成證書文件

腳本(腳本名稱爲dashboard-cert.sh)內容如下,關於證書的構建我們在前面單節點部署etcd集羣以及安裝apiserver組件時講述過了,這裏就不贅述了。

cat > dashboard-csr.json <<EOF
{
   "CN": "Dashboard",
   "hosts": [],
   "key": {
       "algo": "rsa",
       "size": 2048
   },
   "names": [
       {
           "C": "CN",
           "L": "BeiJing",
           "ST": "BeiJing"
       }
   ]
}
EOF

#定義一個變量,使用位置變量賦值,作用是指定你證書(依賴證書)的位置
K8S_CA=$1 
#根據指定位置的證書進行創建和自籤操作
cfssl gencert -ca=$K8S_CA/ca.pem -ca-key=$K8S_CA/ca-key.pem -config=$K8S_CA/ca-config.json -profile=kubernetes dashboard-csr.json | cfssljson -bare dashboard
#清空命名空間中的認證
kubectl delete secret kubernetes-dashboard-certs -n kube-system
#重新創建生成到指定的目錄中(當前目錄)
kubectl create secret generic kubernetes-dashboard-certs --from-file=./ -n kube-system

另外,此時需要先對dashboard-controller.yaml文件進行修改

#dashboard-controller.yaml 增加證書兩行,然後apply
#     args:
#        # PLATFORM-SPECIFIC ARGS HERE
#        - --auto-generate-certificates
#   下面是增加的兩行,指定加密(tls)的祕鑰和證書文件(在文件的第47行位置)就是下面執行腳本後生成的兩個證書文件
#        - --tls-key-file=dashboard-key.pem
#        - --tls-cert-file=dashboard.pem

執行腳本,別忘了加上位置變量

#先看一下證書目錄下的文件
[root@master01 dashboard]# ls /root/k8s/k8s-cert/
admin.csr       admin.pem       ca-csr.json  k8s-cert.sh          kube-proxy-key.pem  server-csr.json
admin-csr.json  ca-config.json  ca-key.pem   kube-proxy.csr       kube-proxy.pem      server-key.pem
admin-key.pem   ca.csr          ca.pem       kube-proxy-csr.json  server.csr          server.pem
#執行剛剛寫的腳本
[root@master01 dashboard]# bash dashboard-cert.sh /root/k8s/k8s-cert/
2020/05/07 23:51:08 [INFO] generate received request
2020/05/07 23:51:08 [INFO] received CSR
2020/05/07 23:51:08 [INFO] generating key: rsa-2048
2020/05/07 23:51:08 [INFO] encoded CSR
2020/05/07 23:51:08 [INFO] signed certificate with serial number 404952983625314812290291880178217049372359470061
2020/05/07 23:51:08 [WARNING] This certificate lacks a "hosts" field. This makes it unsuitable for
websites. For more information see the Baseline Requirements for the Issuance and Management
of Publicly-Trusted Certificates, v.1.1.6, from the CA/Browser Forum (https://cabforum.org);
specifically, section 10.2.3 ("Information Requirements").
secret "kubernetes-dashboard-certs" deleted
secret/kubernetes-dashboard-certs created
#在該目錄下將生成兩個證書
[root@master01 dashboard]# find . -name "*.pem"
./dashboard.pem
./dashboard-key.pem

此時需要使用以下命令重新進行部署(可能會更換所分配的節點哦!)

[root@master01 dashboard]# kubectl apply -f dashboard-controller.yaml 
Warning: kubectl apply should be used on resource created by either kubectl create --save-config or kubectl apply
serviceaccount/kubernetes-dashboard configured
Warning: kubectl apply should be used on resource created by either kubectl create --save-config or kubectl apply
deployment.apps/kubernetes-dashboard configured

這裏有個警告: 也就是apply方式更新的資源應該是由kubectl create 加--save-config參數創建的 或 由apply創建的 (apply當資源不存在時會創建),這裏可以忽略。

未免出錯,這裏再次查看一下分配的節點服務器地址和端口號(果然換了)

[root@master01 dashboard]# kubectl get pods,svc -n kube-system -o wide
NAME                                        READY   STATUS    RESTARTS   AGE     IP            NODE            NOMINATED NODE
pod/kubernetes-dashboard-7dffbccd68-z6xcj   1/1     Running   0          4m57s   172.17.54.2   192.168.0.129   <none>

NAME                           TYPE       CLUSTER-IP   EXTERNAL-IP   PORT(S)         AGE   SELECTOR
service/kubernetes-dashboard   NodePort   10.0.0.212   <none>        443:30001/TCP   62m   k8s-app=kubernetes-dashboard

再次進行訪問測試,結果如下

終於不用敲命令了——Kubernetes之Dashboard部署與使用詳解

點擊後出現下面的對話框

終於不用敲命令了——Kubernetes之Dashboard部署與使用詳解

6、解決token令牌問題,最終實現成功訪問dashboard界面

​ 此時我們先來看一下我們編寫的yaml文件吧

vim k8s-admin.yaml

apiVersion: v1
kind: ServiceAccount
metadata:
  name: dashboard-admin
  namespace: kube-system
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: dashboard-admin
subjects:
  - kind: ServiceAccount
    name: dashboard-admin
    namespace: kube-system
roleRef:
  kind: ClusterRole
  name: cluster-admin
  apiGroup: rbac.authorization.k8s.io

生成令牌操作流程

#基於該文件進行創建
[root@master01 dashboard]# kubectl create -f k8s-admin.yaml 
serviceaccount/dashboard-admin created
clusterrolebinding.rbac.authorization.k8s.io/dashboard-admin created
#獲取toke簡要信息,名稱爲dashboard-admin-token-rf7x2 
[root@master01 dashboard]# kubectl get secret -n kube-system
NAME                               TYPE                                  DATA   AGE
dashboard-admin-token-rf7x2        kubernetes.io/service-account-token   3      25s
default-token-4mkb6                kubernetes.io/service-account-token   3      3d4h
kubernetes-dashboard-certs         Opaque                                11     29m
kubernetes-dashboard-key-holder    Opaque                                2      84m
kubernetes-dashboard-token-m8tlw   kubernetes.io/service-account-token   3      84m

#查看令牌序列號(詳細信息)
[root@master01 dashboard]# kubectl describe secret dashboard-admin-token-rf7x2 -n kube-system
Name:         dashboard-admin-token-rf7x2
Namespace:    kube-system
Labels:       <none>
Annotations:  kubernetes.io/service-account.name: dashboard-admin
              kubernetes.io/service-account.uid: a31c4464-907e-11ea-9ec8-000c29069704

Type:  kubernetes.io/service-account-token

Data
====
ca.crt:     1359 bytes
namespace:  11 bytes
#下面token冒號後面的內容就是我們需要的令牌代碼,額有點長
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4tcmY3eDIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiYTMxYzQ0NjQtOTA3ZS0xMWVhLTllYzgtMDAwYzI5MDY5NzA0Iiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOmRhc2hib2FyZC1hZG1pbiJ9.IuGFrBYgeiY2yhOwmKRe3Khqs43Z197vlokr6dt-ZW1z8g8lwD7nYahb4qZQJrnkN7ibqvSoX4goCBaXI94Jk4RqmPbpnfHq-gt40tnzYBuXRKWup4GAt-b1JpnDv9cQaC20Hb30R3QGqxtbejSEYXZD3IHxVGBWepa59Lals9Xo9J4dRasHSpOHpE279JITayev4AsafBuURtOmAd0jf8DD9tmWzQzQ4i48d7YwR_KeOENi7KNi3zNS0fWFYdtUlHVS_6SAq35ioS3Rrwu1hf4ToOueJXRWRsq-JVGqj8AC4moDsz7vQFNh4tevbZqocRPq1ImFSy4bmRbGO_AMtw

我們將該令牌序列號複製填入到瀏覽器頁面中,點擊登錄,可以獲取到如下界面

終於不用敲命令了——Kubernetes之Dashboard部署與使用詳解

我們可以看一下集羣中這個資源是否是在運行中

[root@master01 dashboard]# kubectl get pods
NAME                    READY   STATUS    RESTARTS   AGE
nginx-dbddb74b8-cnhsl   1/1     Running   0          2d4h

看名稱就知道確實沒有問題。

那麼我們就來簡單通過這個nginx服務來體驗一下這個dashboard是多麼方便吧

首先我們點擊側邊欄中的“容器組”,點擊該容器名稱,進入一個頁面,點擊右上方的“運行命令”或”日誌“控件會彈出另一個額外頁面

終於不用敲命令了——Kubernetes之Dashboard部署與使用詳解

終於不用敲命令了——Kubernetes之Dashboard部署與使用詳解

下面是進入這個容器的網頁界面和查看日誌記錄的頁面

終於不用敲命令了——Kubernetes之Dashboard部署與使用詳解

執行命令——node02節點上訪問容器

[root@node02 ~]# curl 172.17.70.2
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
[root@node02 ~]# 

通過dashboar頁面查看日誌更新結果

終於不用敲命令了——Kubernetes之Dashboard部署與使用詳解

那麼此次dashboard部署和體驗使用就到此結束了哈!

總結

​ 此次主要是對Kubernetes集羣中可視化界面dashboard的部署和簡單使用體驗。相信大家會發現使用可視化界面就非常友好,而且簡化了命令的操作。還附帶監控等各種服務。

​ 而此次的部署我們主要是需要學會了解整個部署dashboard的流程,以及分析問題、然後如何解決所出現的問題。

​ 最後,體會一下dashboard頁面的簡單使用,非常感謝您的閱讀!期待您的持續關注!您的關注一定是筆者前行最大的動力!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章