K8S Dashboard User 详解

在本指南中,我们将了解如何使用 Kubernetes 的服务帐户机制创建新用户、授予该用户管理员权限并使用与该用户绑定的承载令牌登录仪表板。

对于以下每个代码片段ServiceAccountClusterRoleBinding您都应该将它们复制到新的清单文件(如)中,dashboard-user.yaml并使用kubectl apply -f dashboard-adminuser.yaml来创建它们。

创建服务帐号

我们首先admin-user在命名空间中创建具有名称的服务帐户。kubernetes-dashboard

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

创建 ClusterRoleBinding

在大多数情况下,使用kubeadm或任何其他流行工具配置集群后,ClusterRole cluster-admin在集群中已经存在。我们可以使用它ClusterRoleBinding为我们的创建一个ServiceAccount。如果它不存在,那么您需要先创建此角色并手动授予所需的权限。

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

现在我们需要找到可以用来登录的令牌。执行以下命令:

kubectl -n kubernetes-dashboard create token admin-user

token:

eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLXY1N253Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiIwMzAzMjQzYy00MDQwLTRhNTgtOGE0Ny04NDllZTliYTc5YzEiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZXJuZXRlcy1kYXNoYm9hcmQ6YWRtaW4tdXNlciJ9.Z2JrQlitASVwWbc-s6deLRFVk5DWD3P_vjUFXsqVSY10pbjFLG4njoZwh8p3tLxnX_VBsr7_6bwxhWSYChp9hwxznemD5x5HLtjb16kI9Z7yFWLtohzkTwuFbqmQaMoget_nYcQBUC5fDmBHRfFvNKePh_vSSb2h_aYXa8GV5AcfPQpY7r461itme1EXHQJqv-SN-zUnguDguCTjD80pFZ_CmnSE1z9QdMHPB8hoB4V68gtswR1VLa6mSYdgPwCHauuOobojALSaMc3RH7MmFUumAgguhqAkX3Omqd3rJbYOMRuMjhANqd08piDC3aIabINX6gP5-Tuuw2svnV6NYQ

查看Kubernetes 文档有关 ServiceAccount 的 API 令牌的更多信息。

获取 ServiceAccount 的长期 Bearer Token

我们还可以创建一个与服务账户绑定的带有secret的token,该token会保存在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创建完成后,我们可以执行以下命令来获取Secret中保存的Token:

kubectl get secret admin-user -n kubernetes-dashboard -o jsonpath={".data.token"} | base64 -d

查看Kubernetes 文档有关 ServiceAccount 的长效 API 令牌的更多信息。

清理步骤

删除管理员ServiceAccountClusterRoleBinding

kubectl -n kubernetes-dashboard delete serviceaccount admin-user
kubectl -n kubernetes-dashboard delete clusterrolebinding admin-user

为了了解有关如何在 Kubernetes 中授予/拒绝权限的更多信息,请阅读官方验证&授权文档。

更多内容

  • 正确获取 Dashboard 访问令牌的方法
    对于 Kubernetes v1.24+ 版本(不再自动创建 ServiceAccount token Secret):

  • 直接创建 token
    kubectl -n kubernetes-dashboard create token admin-user

  • 对于旧版本:

获取 token secret 名称
kubectl -n kubernetes-dashboard get secret
然后查看解码后的 token
kubectl -n kubernetes-dashboard get secret <secret-name> -o jsonpath="{.data.token}" | base64 --decode

  • 如果仍然需要手动创建 Secret

创建包含 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

  • 验证 ServiceAccount 配置

确保 ServiceAccount 和 ClusterRoleBinding 配置正确:
kubectl -n kubernetes-dashboard get serviceaccount admin-user -o yaml
kubectl get clusterrolebinding admin-user -o yaml

  • 完整工作流程示例
  1. 创建 ServiceAccount
    cat <<EOF | kubectl apply -f -
    apiVersion: v1
    kind: ServiceAccount
    metadata:
    name: admin-user
    namespace: kubernetes-dashboard
    EOF
  2. 创建 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
    常见问题排查
    如果收到 "no API token found" 错误:

检查 secret 是否存在
kubectl -n kubernetes-dashboard get secret | grep admin-user

如果不存在,创建新的 token
kubectl -n kubernetes-dashboard create token admin-user --duration=24h

Token 过期问题:
创建长期有效的 token (例如 30 天)
kubectl -n kubernetes-dashboard create token admin-user --duration=720h

权限不足问题:
验证权限
kubectl auth can-i --list --as=system:serviceaccount:kubernetes-dashboard:admin-user

最佳实践建议
对于生产环境,考虑使用更安全的访问方式:
OIDC 集成
通过 Ingress 配置身份验证代理
使用 kubectl proxy 访问

  • 定期轮换 token:
    删除旧 token
    kubectl -n kubernetes-dashboard delete secret (kubectl -n kubernetes-dashboard get secret | grep admin-user-token | awk '{print1}')
    创建新 token
    kubectl -n kubernetes-dashboard create token admin-user
  • 监控 Dashboard 访问:
    查看 Dashboard 访问日志
    kubectl -n kubernetes-dashboard logs -l k8s-app=kubernetes-dashboard
    通过以上步骤,您应该能够成功获取有效的 Dashboard 访问令牌。如果问题仍然存在,请提供以下信息以便进一步诊断:
    kubectl version
    kubectl -n kubernetes-dashboard get secret 的输出
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容