【问题标题】:Kubernetes dashboard doesn't accept view-only serviceaccount tokenKubernetes 仪表板不接受仅供查看的服务帐户令牌
【发布时间】:2019-11-26 06:17:55
【问题描述】:

所以我按照官方说明对 kubernetes 仪表板进行了基本设置。它与 cluser-admin 角色 serviceaccount 令牌完美配合。但是当我使用它自己的 ClusterRole 和 CluserRoleBinding 创建另一个服务帐户时,我无法以“身份验证失败。请重试”登录仪表板。消息。

这是我采取的步骤。

1 kubectl create serviceaccount dashboard-reader -n kube-system

2

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: dashboard-reader
rules:
- apiGroups: ["*"]
  resources: ["*"]
  verbs: ["get", "watch", "list"]
EOF

3

kubectl apply -f - <<EOF
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: dashboard-reader
  labels:
    k8s-app: kubernetes-dashboard
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: dashboard-reader
subjects:
- kind: ServiceAccount
  name: dashboard-reader
  namespace: kube-system
EOF

然后我从dashboard-reader-xyz secret 中获取令牌并将其应用到Dashboard 登录页面。 我试图实现的是拥有不同权限的单独令牌,比如管理员可以使用一个令牌登录仪表板并拥有完全权限,开发人员可以使用不同的令牌登录并且只能看到资源等。

仪表板版本为 1.10.1。 Kubernetes 版本是 1.13.5

【问题讨论】:

    标签: docker kubernetes permissions dashboard service-accounts


    【解决方案1】:

    可以在 k8s 中创建 service-account 并将其限制在特定的命名空间中。

    按照以下步骤操作:

    • 我假设 k8s-dashboard 已安装在您的 k8s 集群上。
    • 我还假设您已按照these 步骤创建了 admin-user 来访问 k8s-dashboard。
    • 现在要将开发人员限制在 k8s 上的特定命名空间,请创建一个包含以下内容的服务帐户:
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: mynamespace-user
      namespace: mynamespace
    
    ---
    kind: Role
    apiVersion: rbac.authorization.k8s.io/v1beta1
    metadata:
      name: mynamespace-user-full-access
      namespace: mynamespace
    rules:
    - apiGroups: ["", "extensions", "apps"]
      resources: ["*"]
      verbs: ["*"]
    - apiGroups: ["batch"]
      resources:
      - jobs
      - cronjobs
      verbs: ["*"]
    
    ---
    kind: RoleBinding
    apiVersion: rbac.authorization.k8s.io/v1beta1
    metadata:
      name: mynamespace-user-view
      namespace: mynamespace
    subjects:
     - kind: ServiceAccount
      name: mynamespace-user
      namespace: mynamespace
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: Role
      name: mynamespace-user-full-access
    

    mynamespace 替换为您希望限制开发人员使用的命名空间的名称。

    • 您可以使用访问令牌登录到 k8s-dashboard,该访问令牌可以使用此命令检索。
    kubectl -n mynamespace describe secret $(kubectl -n flow get secret | grep mynamespace-user | awk '{print $1}')
    
    • 您也可以使用 kube config 登录 k8s-dashboard。 kube 配置内容为:
    apiVersion: v1
    kind: Config
    preferences: {}
    
    # Define the cluster
    clusters:
    - cluster:
        certificate-authority-data: PLACE CERTIFICATE HERE
        # You'll need the API endpoint of your Cluster here:
        server: https://YOUR_KUBERNETES_API_ENDPOINT
      name: my-cluster
    
    # Define the user
    users:
    - name: mynamespace-user
      user:
        as-user-extra: {}
        client-key-data: PLACE CERTIFICATE HERE
        token: PLACE USER TOKEN HERE
    
    # Define the context: linking a user to a cluster
    contexts:
    - context:
        cluster: my-cluster
        namespace: mynamespace
        user: mynamespace-user
      name: mynamespace
    
    # Define current context
    current-context: mynamespace
    
    • 可以使用此命令检索证书
    kubectl -n mynamespace get secret $(kubectl -n flow get secret | grep mynamespace-user | awk '{print $1}') -o "jsonpath={.data['ca\.crt']}"
    

    我已经在我的环境中尝试了这些步骤,并且效果很好。

    更多信息请参考this

    希望这会有所帮助。

    【讨论】:

    • 这是一个很好的场景,但在我的情况下,开发人员不应该拥有对任何命名空间的完全访问权限,而管理员应该可以访问所有内容。他们都使用相同的仪表板,他们需要不同的令牌来使用内部 URL(如 https://mykubecluster-domain.com:6443/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/#!/overview?namespace=default)连接到仪表板并使用他们拥有的服务帐户令牌。
    • 您可以修改 rbac 角色并限制对任何命名空间的特定 k8s 资源的访问。也许我没有正确地回答你的问题。请在您的问题中详细说明。
    • 还是不行。完成所有步骤,当我使用新令牌进行身份验证时,我看到“身份验证失败。请重试。”当我尝试使用建议的配置文件登录时,我看到以下内容:“未找到与当前上下文用户匹配的用户。请检查您的配置文件是否有效。”
    • 你能在新安装的 k8s-dashboard 上试试这个吗?
    • 该死!这行得通,这是我的错误。非常感谢您的帮助!
    猜你喜欢
    • 2020-03-02
    • 2018-11-06
    • 1970-01-01
    • 2019-09-01
    • 2018-04-02
    • 2022-07-20
    • 2018-11-21
    • 2019-04-07
    • 2022-06-14
    相关资源
    最近更新 更多