Web基礎配置篇(十七): Kubernetes dashboard安裝配置

Web基礎配置篇(十七): Kubernetes dashboard安裝配置

一、概述

Kubernetes 簡稱爲K8S,是用於自動部署,擴展和管理容器化應用程序的開源系統。Kubernetes的目標是讓部署容器化的應用簡單並且高效(powerful),Kubernetes提供了應用部署,規劃,更新,維護的一種機制。

現在的雲平臺,基本上都是基於k8s實現的。

Kubernetes需要用到docker,應該說是Kubernetes本身就是對docker容器的管理。

Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的鏡像中,然後發佈到任何流行的 Linux或Windows 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何接口。

如果你厭煩了vmware和vbox,就可以使用docker來做容器,特別方便。

Kubernetes 還開發了一個基於 Web 的 Dashboard,用戶可以用 Kubernetes Dashboard 部署容器化的應用、監控應用的狀態、執行故障排查任務以及管理 Kubernetes 各種資源。

首發地址:

  品茗IT: https://www.pomit.cn/p/2412183455255041

如果大家正在尋找一個java的學習環境,或者在開發中遇到困難,可以加入我們的java學習圈,點擊即可加入,共同學習,節約學習時間,減少很多在學習中遇到的難題。

二、準備工作

爲避免浪費時間,先說明下我的安裝版本;

Dashboard: V2.0.0 beta4
K8s:1.16.2

在三臺機器上分別安裝master,node1和node2:

10.247.62.213 k8s.master
10.247.62.221 k8s.node1
10.247.62.181 k8s.node2

上一篇《Web基礎配置篇(十六): Kubernetes集羣的安裝使用》已經說明如何安裝k8s。

過程中會寫出我遇到的一些坑,按照我的方法安裝,肯定能安裝成功,謹慎觀察其他博客的不負責任的搬運工們。

Dashboard的GitHub地址(文檔有誤,謹慎參考):https://github.com/kubernetes/dashboard

官方說明地址:https://kubernetes.io/docs/tasks/access-application-cluster/web-ui-dashboard/

下面先說一下正確的安裝方式,然後再說明下避坑過程。

三、成功安裝Dashboard方法

參考官網:https://kubernetes.io/docs/tasks/access-application-cluster/web-ui-dashboard/ 的安裝方法。

如果已經有失敗的安裝過程,先刪除掉失敗dashboard的安裝:

kubectl delete -f kubernetes-dashboard.yaml

3.1 下載yaml文件並安裝

官網的安裝方法是這樣的:

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta4/aio/deploy/recommended.yaml

但是這個地址卻很難打開,如果能打開,直接執行即可,如果不能,可以這樣做:

  1. 到github地址上一步步找:https://github.com/kubernetes/dashboard/tree/v2.0.0-beta4/aio/deploy下的recommended.yaml文件;
    在這裏插入圖片描述
  2. 下載這個文件,或者複製內容到recommended.yaml文件;
  3. 執行kubectl apply -f recommended.yaml;

安裝後:

成功之後,kubectl get pods --namespace=kubernetes-dashboard -o wide查看pod名稱:

[root@k8s ~]# kubectl get pods --namespace=kubernetes-dashboard -o wide
NAME                                         READY   STATUS    RESTARTS   AGE   IP           NODE        NOMINATED NODE   READINESS GATES
kubernetes-dashboard   dashboard-metrics-scraper-566cddb686-6p8tb   0/1     ContainerCreating   0          4s    <none>          k8s.node1    <none>           <none>
kubernetes-dashboard   kubernetes-dashboard-7b5bf5d559-gn4ls        0/1     ContainerCreating   0          4s    <none>          k8s.node1    <none>           <none>

有問題,dashboard-metrics-scraper-566cddb686-6p8tb這個pod長時間ContainerCreating狀態,估計鏡像又下載不了了。

看下日誌:kubectl describe pod dashboard-metrics-scraper-566cddb686-6p8tb --namespace=kubernetes-dashboard

注意,這個地方的namespacekubernetes-dashboard

日誌告訴我們,需要kubernetesui/metrics-scraper:v1.0.1這個鏡像,能直接下載下來,就是有點慢,那就等會兒了。

等啊等,竟然下載失敗了,換成docker pull kubernetesui/metrics-scraper:v1.0.1。等10分鐘,終於下載下來了。

最後成功;

[root@k8s ~]# kubectl get pods --namespace=kubernetes-dashboard -o wide
NAME                                         READY   STATUS    RESTARTS   AGE   IP           NODE        NOMINATED NODE   READINESS GATES
dashboard-metrics-scraper-566cddb686-6p8tb   1/1     Running   1          13d   10.244.1.8   k8s.node1   <none>           <none>
kubernetes-dashboard-7b5bf5d559-xt6hl        1/1     Running   1          13d   10.244.1.9   k8s.node1   <none>           <none>

3.2 改爲NodePort訪問

將dashboard改爲NodePort方式訪問,不使用API Server 訪問。因爲API Server 訪問特別麻煩,一大串,比如:http://10.247.62.213:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/

如果是NodePort方式訪問,就比較簡單了,比如:https://10.247.62.213:30832/

NodePort方式訪問:

  1. 查看kubernetes-dashboardkubectl --namespace=kubernetes-dashboard get service kubernetes-dashboard
[root@k8s ~]# kubectl --namespace=kubernetes-dashboard get service kubernetes-dashboard
NAME                   TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
kubernetes-dashboard   ClusterIP   10.97.154.42   <none>        443/TCP   28m
  1. 編輯kubernetes-dashboardkubectl --namespace=kubernetes-dashboard edit service kubernetes-dashboard,將裏面的type: ClusterIP改爲type: NodePort即可。

  2. wq保存即可。等一會兒,重新查看,就變爲NodePort了。

[root@k8s ~]# kubectl --namespace=kubernetes-dashboard get service kubernetes-dashboard
NAME                   TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)         AGE
kubernetes-dashboard   NodePort   10.97.154.42   <none>        443:30832/TCP   29m

3.3 生成證書

Dashboard安裝完成,改爲NodePort形式之後,通過https://10.247.62.213:30832/訪問,會提示安全信息如下:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-RfjNv0ix-1573696412485)(https://www.pomit.cn/upload/picture/20191113/241211161960704.png)]

這就無法訪問了,需要生成證書,這個比較簡單,照着來就行:

#新建目錄:
mkdir key && cd key

#生成證書
openssl genrsa -out dashboard.key 2048 

#我這裏寫的自己的node1節點,因爲我是通過nodeport訪問的;如果通過apiserver訪問,可以寫成自己的master節點ip
openssl req -new -out dashboard.csr -key dashboard.key -subj '/CN=10.247.62.213'
openssl x509 -req -in dashboard.csr -signkey dashboard.key -out dashboard.crt 

#刪除原有的證書secret
kubectl delete secret kubernetes-dashboard-certs -n kubernetes-dashboard

#創建新的證書secret
kubectl create secret generic kubernetes-dashboard-certs --from-file=dashboard.key --from-file=dashboard.crt -n kubernetes-dashboard

#查看pod
kubectl get pod -n kubernetes-dashboard

#重啓pod
kubectl delete pod kubernetes-dashboard-7b5bf5d559-gn4ls  -n kubernetes-dashboard

執行完成之後,再次訪問是這樣的:
在這裏插入圖片描述

上圖點開高級之後,有個繼續前往的鏈接,點擊即可。

3.4 新建用戶獲取令牌

Dashboard鏈接打開之後,是這樣的:
在這裏插入圖片描述

要獲取令牌,還要新建用戶,下面這個是從官方網站複製過來的:

3.4.1 新建用戶

新建文件(文件名隨意)admin-user.yaml

複製下面一段:

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

複製到admin-user.yaml文件後,執行:
kubectl create -f admin-user.yaml

3.4.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文件即可。

3.4.3 獲取令牌

按照官網提示的獲取token方法:kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')

在這裏插入圖片描述

3.5 輸入令牌打開頁面

輸入令牌後,點登入,就打開了首頁,如圖所示:

在這裏插入圖片描述

在這裏插入圖片描述

四、Dashboard安裝踩坑歷程(可忽略)

Dashboard的官方git地址:https://github.com/kubernetes/dashboard

這個git地址首頁竟然是v1.10.1版本的Dashboard,而且大多數博客都是這樣寫的,感覺都是抄來抄去的。結果我被坑了!

4.1 安裝

首先,安裝上面寫的,在master上運行:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml

同樣的,如果下載不下來,直接到github上一級一級找,這裏不再贅述。

4.2 鏡像下載

kubectl get pods --all-namespaces -o wide查看pods,發現失敗。

使用命令:kubectl describe pod kubernetes-dashboard-7c54d59f66-rnzq2 --namespace=kube-system

提示:

" network for pod "kubernetes-dashboard-7c54d59f66-rnzq2": networkPlugin cni failed to set up pod "kubernetes-dashboard-7c54d59f66-rnzq2_kube-system" network: open /run/flannel/subnet.env: no such file or directory
  Warning  Failed                  4m9s (x4 over 6m16s)   kubelet, k8s.node1  Error: ErrImagePull

發現它被分配到k8s.node1上了,懷疑是否是鏡像拉不下來。

docker pull gcrxio/kubernetes-dashboard-amd64:v1.10.1
docker tag gcrxio/kubernetes-dashboard-amd64:v1.10.1 k8s.gcr.io/kubernetes-dashboard-amd64:v1.10.1
docker rmi gcrxio/kubernetes-dashboard-amd64:v1.10.1

成功!Running:

kube-system   kubernetes-dashboard-7c54d59f66-rnzq2   1/1     Running   0          28m   10.244.1.2      k8s.node1    <none>           <none>

查看這個service:

[root@k8s ~]# kubectl --namespace=kube-system get service kubernetes-dashboard
NAME                   TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
kubernetes-dashboard   ClusterIP   10.107.97.201   <none>        443/TCP   46m

4.3 API Server 訪問

按照官網提示:

master上設置允許外網訪問:
kubectl proxy --address=‘0.0.0.0’ --accept-hosts=’^*$’

使用API Server 訪問(API Server訪問不需要證書):
http://10.247.62.213:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/

在這裏插入圖片描述

需要用戶,新建用戶:

4.4 新建用戶

新建文件admin-user.yaml,複製下面一段:

apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kube-system

執行:
kubectl create -f admin-user.yaml

綁定用戶關係:
新建文件admin-user-role-binding.yaml,複製下面一段:

apiVersion: rbac.authorization.k8s.io/v1beta1
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

執行kubectl create -f admin-user-role-binding.yaml

如果過程中需要刪除,只需要kubectl delete -f 相應的yaml文件即可。

注意,這裏的namespace是kube-system,沒辦法,v1.10.1版本的namespace就是kube-system,大多數博客都是這麼寫的。我跟着玩了。

4.5 獲取token

官網獲取token方法:
kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')

這個命令整出了一堆token,試試下面的

kubectl -n kube-system describe secret admin-user-token-d2nqt
這裏的admin-user-token-d2nqt是生成的admin-user對應的token,把token複製到令牌那個框裏,竟然沒反應,按f12打開控制檯,沒報錯啊。

看下日誌:kubectl logs kubernetes-dashboard-7c54d59f66-wvxnc -n kube-system
沒什麼有用的,無解,換個思路來。

4.6 換成NodePort試試

將dashboard改爲NodePort方式訪問,不使用API Server 訪問。

NodePort方式訪問:
查看kubernetes-dashboard:kubectl --namespace=kube-system get service kubernetes-dashboard

[root@k8s ~]# kubectl --namespace=kube-system get service kubernetes-dashboard
NAME                   TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
kubernetes-dashboard   ClusterIP   10.107.97.201   <none>        443/TCP   125m

編輯kubernetes-dashboardkubectl --namespace=kube-system edit service kubernetes-dashboard
type: ClusterIP改爲type: NodePort

wq保存即可。等一會兒,重新查看,就變爲NodePort了。

使用master的ip加端口32123訪問,https://10.247.62.213:32123/ 會提示不安全,沒法繼續。

4.7 生成證書

使用master的ip加端口32123訪問,https://10.247.62.213:32123/ 會提示不安全,沒法繼續。

#新建目錄
mkdir key && cd key
#生成證書
openssl genrsa -out dashboard.key 2048 
#我這裏寫的自己的node1節點,因爲我是通過nodeport訪問的;如果通過apiserver訪問,可以寫成自己的master節點ip
openssl req -new -out dashboard.csr -key dashboard.key -subj '/CN=192.168.135.129'
openssl x509 -req -in dashboard.csr -signkey dashboard.key -out dashboard.crt 
#刪除原有的證書secret
kubectl delete secret kubernetes-dashboard-certs -n kube-system
#創建新的證書secret
kubectl create secret generic kubernetes-dashboard-certs --from-file=dashboard.key --from-file=dashboard.crt -n kube-system
#查看pod
kubectl get pod -n kube-system
#重啓pod
kubectl delete pod kubernetes-dashboard-78dc5f9d6b-zgvr6  -n kube-system

重新查看token:kubectl -n kube-system describe secret admin-user-token-d2nqt
訪問https://10.247.62.213:32123/ 輸入token後,有反應了。

這些錯誤變了,the server could not find the requested resource.

在這裏插入圖片描述

這又是什麼鬼?

查啊查,找到一個說法:

當前系統中沒有用於獲取監控信息指標的客戶端(metric client),所以kubernetes-dashboard的處理方式是跳過這一步。同時,對metric client的健康檢查失敗了。這些問題不會導致dashboard無法工作,只是kubernetes-dashboard獲取不到系統以及各個pod的監控數據。這裏的解決方案就是安裝另外一個k8s插件--heapster.

所以要安裝Heapster。

經試驗,這個說法是無效的。

五、結論

  1. 野史不可信,看博客要小心,最好拿博客和官網做對照。
  2. 博客的文章中的版本一般比較老了。
  3. Github的官方說明也會誤導人啊。

品茗IT-博客專題:https://www.pomit.cn/lecture.html彙總了Spring專題Springboot專題SpringCloud專題web基礎配置專題。

快速構建項目

Spring項目快速開發工具:

一鍵快速構建Spring項目工具

一鍵快速構建SpringBoot項目工具

一鍵快速構建SpringCloud項目工具

一站式Springboot項目生成

Mysql一鍵生成Mybatis註解Mapper

Spring組件化構建

SpringBoot組件化構建

SpringCloud服務化構建

喜歡這篇文章麼,喜歡就加入我們一起討論Java Web吧!
品茗IT交流羣

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