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
但是這個地址卻很難打開,如果能打開,直接執行即可,如果不能,可以這樣做:
- 到github地址上一步步找:
https://github.com/kubernetes/dashboard/tree/v2.0.0-beta4/aio/deploy
下的recommended.yaml
文件;
- 下載這個文件,或者複製內容到
recommended.yaml
文件; - 執行
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
注意,這個地方的namespace
是kubernetes-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方式訪問:
- 查看
kubernetes-dashboard
:kubectl --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
-
編輯
kubernetes-dashboard
:kubectl --namespace=kubernetes-dashboard edit service kubernetes-dashboard
,將裏面的type: ClusterIP
改爲type: NodePort
即可。 -
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-dashboard
:kubectl --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。
經試驗,這個說法是無效的。
五、結論
- 野史不可信,看博客要小心,最好拿博客和官網做對照。
- 博客的文章中的版本一般比較老了。
- Github的官方說明也會誤導人啊。
品茗IT-博客專題:https://www.pomit.cn/lecture.html彙總了Spring專題、Springboot專題、SpringCloud專題、web基礎配置專題。
快速構建項目
Spring項目快速開發工具:
喜歡這篇文章麼,喜歡就加入我們一起討論Java Web吧!