Kubernetes Dashboard 是一個基於 Web 的用戶界面,允許用戶直接在瀏覽器中管理和監控 Kubernetes Cluster。它提供了一個直觀的方式來查看 Cluster 的狀態、部署應用程式、排查問題以及管理資源。這使得即使是不熟悉命令行操作的用戶,也可以輕鬆地與 Kubernetes 進行互動。
從版本 7.0.0 開始,官方放棄了對 Manifest-based 的安裝支援。目前僅支援基於 Helm 的安裝。由於多容器設定和對 Kong gateway API 代理程式的相依性,輕鬆支援 Manifest-based 的安裝是不可行的。
可以使用以下命令在 Kubernetes Cluster 中部署 Dashboard:
helm repo add kubernetes-dashboard https://kubernetes.github.io/dashboard/
helm repo update
helm upgrade --install kubernetes-dashboard kubernetes-dashboard/kubernetes-dashboard --create-namespace --namespace kubernetes-dashboard
上列的指令會新增 kubernetes-dashboard 儲存庫並使用 kubernetes-dashboard chart 部署名為「kubernetes-dashboard」的 Helm Release,成功執行後的訊息如下:
Release "kubernetes-dashboard" does not exist. Installing it now.
NAME: kubernetes-dashboard
LAST DEPLOYED: Mon Aug 12 16:19:24 2024
NAMESPACE: kubernetes-dashboard
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
*************************************************************************************************
*** PLEASE BE PATIENT: Kubernetes Dashboard may need a few minutes to get up and become ready ***
*************************************************************************************************
Congratulations! You have just installed Kubernetes Dashboard in your cluster.
To access Dashboard run:
kubectl -n kubernetes-dashboard port-forward svc/kubernetes-dashboard-kong-proxy 8443:443
NOTE: In case port-forward command does not work, make sure that kong service name is correct.
Check the services in Kubernetes Dashboard namespace using:
kubectl -n kubernetes-dashboard get svc
Dashboard will be available at:
https://localhost:8443
這將會在 Kubernetes Cluster 中創建相關的資源到 kubernetes-dashboard 這個命名空間中。
預設的情況下,Kubernetes Dashboard 通過 ClusterIP
暴露,只能在 Cluster 內部存取。你需要將其修改為 NodePort
或是LoadBalancer
,以便從外部存取。
本範例中選擇使用NodePort
的方式,首先,找到 Dashboard Service:
kubectl -n kubernetes-dashboard get svc
然後,編輯該 Service 將類型更改為 NodePort
:
kubectl -n kubernetes-dashboard edit svc kubernetes-dashboard-kong-proxy
在編輯器中找到 spec.type
,將其更改為 NodePort
:
spec:
type: NodePort
保存並退出。
當你將 Service 的類型設置為 NodePort
之後,Kubernetes 會自動為其分配一個端口號(範圍在 30000-32767 之間)。你可以使用以下命令確認 Dashboard 所使用的 NodePort:
kubectl -n kubernetes-dashboard get svc kubernetes-dashboard-kong-proxy
輸出的 PORT(S)
列將顯示分配的 NodePort,例如:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes-dashboard-kong-proxy NodePort 10.107.152.50 <none> 443:32433/TCP 10m
在這個例子中,NodePort 是 32433
。
現在,你可以使用Cluster中任意節點的 IP 地址加上 NodePort 來存取 Kubernetes Dashboard。
如果你的節點 IP 是 192.168.1.100
,NodePort 是 32433
,那麼你可以在瀏覽器中存取:
https://192.168.1.100:32433/
請注意,由於 Dashboard 使用 HTTPS,你可能會收到一個瀏覽器的安全警告,因為使用的是自簽的憑證。你可以選擇繼續存取 Dashboard。
當你首次存取 Dashboard 時,系統會要求你提供一個 Token 來進行身份驗證。
你可以通過創建並提取一個具有適當權限的服務帳戶 Token 來登錄,如下所述:
我們首先在命名空間 kubernetes-dashboard 中建立名為 admin-user 的服務帳號。
YAML範例如下:
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard
下一步為 ServiceAccount 建立 ClusterRoleBinding,這個 ClusterRoleBinding 將名為 cluster-admin 的 Cluster 角色授權給 kubernetes-dashboard 命名空間中的 admin-user 服務帳戶。這樣,該服務帳戶將擁有 Cluster 中所有資源的完全控制權(cluster-admin 的權限),使得它可以用於 Kubernetes Dashboard 的管理操作。
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
將以上的YAML檔案套用之後,你就可以透過下列指令來取的登入需要的Bearer Token:
kubectl -n kubernetes-dashboard create token admin-user
輸出結果如下:
eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLXY1N253Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiIwMzAzMjQzYy00MDQwLTRhNTgtOGE0Ny04NDllZTliYTc5YzEiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZXJuZXRlcy1kYXNoYm9hcmQ6YWRtaW4tdXNlciJ9.Z2JrQlitASVwWbc-s6deLRFVk5DWD3P_vjUFXsqVSY10pbjFLG4njoZwh8p3tLxnX_VBsr7_6bwxhWSYChp9hwxznemD5x5HLtjb16kI9Z7yFWLtohzkTwuFbqmQaMoget_nYcQBUC5fDmBHRfFvNKePh_vSSb2h_aYXa8GV5AcfPQpY7r461itme1EXHQJqv-SN-zUnguDguCTjD80pFZ_CmnSE1z9QdMHPB8hoB4V68gtswR1VLa6mSYdgPwCHauuOobojALSaMc3RH7MmFUumAgguhqAkX3Omqd3rJbYOMRuMjhANqd08piDC3aIabINX6gP5-Tuuw2svnV6NYQ
將的 Token 複製並貼到 Dashboard 的登錄頁面中。
成功登入的第一個畫面如下:
上列的token在過期或服務帳戶被刪除之前一直有效。在 Kubernetes v1.30以後的版本,使用此方法獲得的token具有有限的生命週期,並且當它們掛載到的 Pod 被刪除時會自動失效。
我們也可以使用綁定服務帳戶的 Secret 建立一個token,該token將保存在 Secret 中,請套用下列範例的YAML檔:
apiVersion: v1
kind: Secret
metadata:
name: admin-user
namespace: kubernetes-dashboard
annotations:
kubernetes.io/service-account.name: "admin-user"
type: kubernetes.io/service-account-token
創建Secret後,我們可以執行以下命令來取得Secret中保存的token:
kubectl get secret admin-user -n kubernetes-dashboard -o jsonpath={".data.token"} | base64 -d
一旦登錄進入 Dashboard,你可以使用該界面執行各種操作,如:
由於 Dashboard 提供了強大的管理功能,因此需要特別注意安全性:
Kubernetes Dashboard 為管理和監控 Kubernetes Cluster 提供了一個直觀且強大的界面,使得運維和開發人員能夠更高效地管理 Cluster 中的資源。儘管它簡化了很多操作,但使用時必須注意其潛在的安全風險,並採取相應的措施來保護 Cluster 的安全。