在本指南中,我們將了解如何使用 Kubernetes 的服務(wù)帳戶機(jī)制創(chuàng)建新用戶、授予該用戶管理員權(quán)限并使用與該用戶綁定的承載令牌登錄儀表板。
對(duì)于以下每個(gè)代碼片段ServiceAccount,ClusterRoleBinding您都應(yīng)該將它們復(fù)制到新的清單文件(如)中,dashboard-user.yaml并使用kubectl apply -f dashboard-adminuser.yaml來(lái)創(chuàng)建它們。
創(chuàng)建服務(wù)帳號(hào)
我們首先admin-user在命名空間中創(chuàng)建具有名稱的服務(wù)帳戶。kubernetes-dashboard
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard
創(chuàng)建 ClusterRoleBinding
在大多數(shù)情況下,使用kubeadm或任何其他流行工具配置集群后,ClusterRole cluster-admin在集群中已經(jīng)存在。我們可以使用它ClusterRoleBinding為我們的創(chuàng)建一個(gè)ServiceAccount。如果它不存在,那么您需要先創(chuàng)建此角色并手動(dòng)授予所需的權(quán)限。
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
獲取 ServiceAccount 的 Bearer Token
現(xiàn)在我們需要找到可以用來(lái)登錄的令牌。執(zhí)行以下命令:
kubectl -n kubernetes-dashboard create token admin-user
token:
eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLXY1N253Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiIwMzAzMjQzYy00MDQwLTRhNTgtOGE0Ny04NDllZTliYTc5YzEiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZXJuZXRlcy1kYXNoYm9hcmQ6YWRtaW4tdXNlciJ9.Z2JrQlitASVwWbc-s6deLRFVk5DWD3P_vjUFXsqVSY10pbjFLG4njoZwh8p3tLxnX_VBsr7_6bwxhWSYChp9hwxznemD5x5HLtjb16kI9Z7yFWLtohzkTwuFbqmQaMoget_nYcQBUC5fDmBHRfFvNKePh_vSSb2h_aYXa8GV5AcfPQpY7r461itme1EXHQJqv-SN-zUnguDguCTjD80pFZ_CmnSE1z9QdMHPB8hoB4V68gtswR1VLa6mSYdgPwCHauuOobojALSaMc3RH7MmFUumAgguhqAkX3Omqd3rJbYOMRuMjhANqd08piDC3aIabINX6gP5-Tuuw2svnV6NYQ
查看Kubernetes 文檔有關(guān) ServiceAccount 的 API 令牌的更多信息。
獲取 ServiceAccount 的長(zhǎng)期 Bearer Token
我們還可以創(chuàng)建一個(gè)與服務(wù)賬戶綁定的帶有secret的token,該token會(huì)保存在Secret中:
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創(chuàng)建完成后,我們可以執(zhí)行以下命令來(lái)獲取Secret中保存的Token:
kubectl get secret admin-user -n kubernetes-dashboard -o jsonpath={".data.token"} | base64 -d
查看Kubernetes 文檔有關(guān) ServiceAccount 的長(zhǎng)效 API 令牌的更多信息。
清理步驟
刪除管理員ServiceAccount和ClusterRoleBinding。
kubectl -n kubernetes-dashboard delete serviceaccount admin-user
kubectl -n kubernetes-dashboard delete clusterrolebinding admin-user
為了了解有關(guān)如何在 Kubernetes 中授予/拒絕權(quán)限的更多信息,請(qǐng)閱讀官方驗(yàn)證&授權(quán)文檔。
更多內(nèi)容
正確獲取 Dashboard 訪問(wèn)令牌的方法
對(duì)于 Kubernetes v1.24+ 版本(不再自動(dòng)創(chuàng)建 ServiceAccount token Secret):直接創(chuàng)建 token
kubectl -n kubernetes-dashboard create token admin-user對(duì)于舊版本:
獲取 token secret 名稱
kubectl -n kubernetes-dashboard get secret
然后查看解碼后的 token
kubectl -n kubernetes-dashboard get secret <secret-name> -o jsonpath="{.data.token}" | base64 --decode
- 如果仍然需要手動(dòng)創(chuàng)建 Secret
創(chuàng)建包含 token 的 Secret
kubectl -n kubernetes-dashboard create secret generic admin-user-token
--from-literal=token=$(kubectl -n kubernetes-dashboard create token admin-user)
然后獲取
kubectl -n kubernetes-dashboard get secret admin-user-token -o jsonpath='{.data.token}' | base64 --decode
- 驗(yàn)證 ServiceAccount 配置
確保 ServiceAccount 和 ClusterRoleBinding 配置正確:
kubectl -n kubernetes-dashboard get serviceaccount admin-user -o yaml
kubectl get clusterrolebinding admin-user -o yaml
- 完整工作流程示例
- 創(chuàng)建 ServiceAccount
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard
EOF- 創(chuàng)建 ClusterRoleBinding
cat <<EOF | kubectl apply -f -
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
EOF
- 獲取 Token (Kubernetes v1.24+)
kubectl -n kubernetes-dashboard create token admin-user
常見(jiàn)問(wèn)題排查
如果收到 "no API token found" 錯(cuò)誤:
檢查 secret 是否存在
kubectl -n kubernetes-dashboard get secret | grep admin-user
如果不存在,創(chuàng)建新的 token
kubectl -n kubernetes-dashboard create token admin-user --duration=24h
Token 過(guò)期問(wèn)題:
創(chuàng)建長(zhǎng)期有效的 token (例如 30 天)
kubectl -n kubernetes-dashboard create token admin-user --duration=720h
權(quán)限不足問(wèn)題:
驗(yàn)證權(quán)限
kubectl auth can-i --list --as=system:serviceaccount:kubernetes-dashboard:admin-user
最佳實(shí)踐建議
對(duì)于生產(chǎn)環(huán)境,考慮使用更安全的訪問(wèn)方式:
OIDC 集成
通過(guò) Ingress 配置身份驗(yàn)證代理
使用 kubectl proxy 訪問(wèn)
- 定期輪換 token:
刪除舊 token
kubectl -n kubernetes-dashboard delete secret1}')
創(chuàng)建新 token
kubectl -n kubernetes-dashboard create token admin-user - 監(jiān)控 Dashboard 訪問(wèn):
查看 Dashboard 訪問(wèn)日志
kubectl -n kubernetes-dashboard logs -l k8s-app=kubernetes-dashboard
通過(guò)以上步驟,您應(yīng)該能夠成功獲取有效的 Dashboard 訪問(wèn)令牌。如果問(wèn)題仍然存在,請(qǐng)?zhí)峁┮韵滦畔⒁员氵M(jìn)一步診斷:
kubectl version
kubectl -n kubernetes-dashboard get secret 的輸出