終於不用敲命令了——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端口,那麼就打開瀏覽器來進行訪問測試,結果和原因分析如下圖所示(需要點擊“隱藏詳情”位置的“高級”控件才能看到詳情信息)
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
再次進行訪問測試,結果如下
點擊後出現下面的對話框
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
我們將該令牌序列號複製填入到瀏覽器頁面中,點擊登錄,可以獲取到如下界面
我們可以看一下集羣中這個資源是否是在運行中
[root@master01 dashboard]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-dbddb74b8-cnhsl 1/1 Running 0 2d4h
看名稱就知道確實沒有問題。
那麼我們就來簡單通過這個nginx服務來體驗一下這個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頁面查看日誌更新結果
那麼此次dashboard部署和體驗使用就到此結束了哈!
總結
此次主要是對Kubernetes集羣中可視化界面dashboard的部署和簡單使用體驗。相信大家會發現使用可視化界面就非常友好,而且簡化了命令的操作。還附帶監控等各種服務。
而此次的部署我們主要是需要學會了解整個部署dashboard的流程,以及分析問題、然後如何解決所出現的問題。
最後,體會一下dashboard頁面的簡單使用,非常感謝您的閱讀!期待您的持續關注!您的關注一定是筆者前行最大的動力!