Ray Lee | 李宗叡
Learn or Die
Published in
7 min readApr 4, 2021

--

Photo by Luke Chesser on Unsplash

# 前言

本篇主要紀錄如何在 Kubernetes 中安裝 Dashboard, 並建立 Server Account, 然後使用該 Service Account 的 token 登入 Dashboard

# 安裝 Dashboard

首先, Dashboard 是一個套件, 作用是可以讓使用者透過 Web UI 介面取代指令的管理 Kubernetes

安裝 Dashboard, 可參考 官方 Github

依照官方 Github 的步驟, 需要使用 kube proxy 來存取 Dashboard, 也可另外建立一個 nodePort service

kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
ports:
- port: 443
targetPort: 8443
selector:
k8s-app: kubernetes-dashboard
type: NodePort

我們先來看看 Dashboard 的一些詳細資料, 本篇查看 Pod, 查看 Deployment 也可

  • 取得 Dashboard pod 名稱
kubectl get pods -n kubernetes-dashboard
  • 查看 Dashboard 的詳細資料
kubectl describe pod yourDashboardPodName -n kubernetes-dashboard

從 description 中可看到 Dashboard Pod 是 Listen 8443 port, 因此我們 yaml 中才會 listen 8443 port

  • 建立 service
kubectl apply -f nodePortServiceName
  • 查看 nodePort
kubectl get services -n kubernetes-dashboard

這時應該看到我們剛剛建立的 service, 後面會有一個 port binding, 像是 443:31831/TCP, 這就表示該 service 已經跟 Node 的 31831 port 對應了, 這時只要用瀏覽器開啟 http://myNodeIp:31831, 就可以進入 dashboard 登入頁面了

# 使用自定義的 service account 登入

本文中會使用 token 的方式登入 Kubernetes 中, 每個 service account 都會綁定一個 secret 資源, 而 secret 中會有一組 base64 加密的 token, 所以我們接下來要做的事情如下:

  1. 建立擁有 cluster-admin 權限的 cluster role
  2. 建立一個 service account
  3. 將擁有 cluster admin 權限的 cluster role, 與該 service account 綁定
  4. 取得該 service account 的 token
  5. 登入

那就一步一步來吧!

# 建立 role

因為 Kubernetes 預設就幫我們建立了 cluster-admin 這個 role, 所以我們就不用再自己另外建立, 直接使用即可

# 建立 service account

那我們就建立一個 service account, 名為 cluster-admin-ray

kubectl create sa cluster-admin-ray -n kube-system

# 建立 role binding

接下來我們要綁定上面提到的系統預設的 cluster role, 與上面建立 service account cluster-admin-ray 綁定, 這樣 cluster-admin-ray 就可以擁有該 cluster role 的權限

  • 建立 yaml 檔
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: cluster-admin-binding
annotations:
rbac.authorization.kubernetes.io/autoupdate: "true"
roleRef:
# 這邊我們並沒有特別建立這個 cluster role, 因為這是 Kubernetes 預設建立的
kind: ClusterRole
name: cluster-admin
apiGroup: rbac.authorization.k8s.io
subjects:
- kind: ServiceAccount
name: cluster-admin-ray
namespace: kube-system
  • 建立 clusterRoleBinding
kubectl create -f yourYamlName

# 取得 Server Account 的 token

上面已經完成綁定, 接下來我們便要取得 service account 的 token

  • 首先, 我們先來看看 service account
kubectl get sa cluster-admin-ray -n kube-system -o=yaml

輸出如下:

從上面的圖片可以看到, service account 中有一個 secrets

  • 接下來, 我們來看看這個 secret
kubectl get secret cluster-admin-ray-token-rtnnh -n kube-system -o=yaml

可以看到 secret 的詳細資料, 由於太多資料我就不貼圖了 裡頭有個 token 就是我們要的

  • 所以, 我們來取得 token
kubectl get secret cluster-admin-ray-token-rtnnh -o jsonpath={.data.token} -n kube-system
  • 然而, 之前提過, Kubernetes secret 的內容會使用 base64 encode, 因此, 我們需要對 token 做 base64 decode
kubectl get secret cluster-admin-ray-token-rtnnh -o jsonpath={.data.token} -n kube-system | base64 -d
  • 若是你是使用 MacOS, 也可以使用下面一行搞定, 不過請記得將 service account 改成你自己的
SECRET=`kubectl get serviceAccount yourServiceAccountName -n kube-system -o jsonpath={.secrets\[0\].name}` && kubectl get secret $SECRET -n kube-system -o jsonpath={.data.token}|base64 -d|pbcopy

# 登入

這一步很簡單, 使用上面拿到的 token, 使用 token 方式登入就行了

# 結語

至於 Dashboard 有什麼功能就讓大家自行玩耍啦! 本文到此告一段落, 下台一鞠躬!

# 參考資源

官方文件

JSONPath Syntax

--

--

Ray Lee | 李宗叡
Learn or Die

It's Ray. I do both backend and frontend, but more focus on backend. I like coding, and would like to see the whole picture of a product.