如何允许 ServiceAccount 列出它在集群内有权访问的命名空间?

如何允许 ServiceAccount 列出它在集群内有权访问的命名空间?

我有一个具有多个命名空间的集群。让我们称它们为:我ns1ns2有多个服务帐户,让我们称它们为sa1sa2,所有这些都在一个命名空间中 - sa-ns

两个用户都可以访问两个命名空间中的所有资源,但是他们无法列出他们所属的命名空间。kubectl get ns --as=sa1返回:

Error from server (Forbidden): namespaces is forbidden: User "sa1" cannot list resource "namespaces" in API group "" at the cluster scope

仅当我手动指定要列出的命名空间时它才有效:

kubectl get ns ns1 --as=sa1

NAME           STATUS   AGE
ns1   Active   6d6h

我需要两个用户sa1,并且sa2能够列出他们有权访问的集群内的所有命名空间。在这种情况下ns1ns2.

这种行为也可能不允许我在 Lens 仪表板中列出命名空间及其资源。从命名空间列表中,我只能列出sa-ns用户sa1&sa2所属的命名空间。然而,仪表板是空的,如下图所示。

在此输入图像描述

我尝试添加用户实际上可以通过ACCESSIBLE NAMESPACESLens 中的功能访问的命名空间,但它也不起作用。

在此输入图像描述

我仍然没有看到任何东西,只有空白的仪表板。

在此输入图像描述

服务帐号:

apiVersion: v1
kind: ServiceAccount
metadata:
  name: sa1
  namespace: sa-ns
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: sa2
  namespace: sa-ns

角色:

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: admin-role
  namespace: ns1
rules:
- apiGroups:
  - "*"
  resources: 
  - "*"
  verbs:
  - "*"
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: admin-role
  namespace: ns2
rules:
- apiGroups:
  - "*"
  resources: 
  - "*"
  verbs:
  - "*"

角色绑定:

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: admin-role-binding
  namespace: ns1
roleRef:
  kind: Role
  name: admin-role
  apiGroup: rbac.authorization.k8s.io
subjects:
- kind: ServiceAccount
  name: sa1
  namespace: sa-ns
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: admin-role-binding
  namespace: ns2
roleRef:
  kind: Role
  name: admin-role
  apiGroup: rbac.authorization.k8s.io
subjects:
- kind: ServiceAccount
  name: sa2
  namespace: sa-ns

我尝试使用ClusterRole代替Role但没有任何改变。

答案1

因此,这里的问题是您无权访问集群范围内的命名空间资源,因此不包含在您拥有的角色/角色绑定组合中。有点不直观的是,将 ClusterRole 与 Rolebinding 组合起来也只能授予单个命名空间的权限,这就是为什么这行不通的原因。

解决此问题的最佳方法可能是创建一个 ClusterRole,为命名空间资源提供 GET 和 LIST 权限,然后为该 ClusterRole 的每个服务帐户创建一个 ClusterRoleBinding。

相关内容