我有一个具有多个命名空间的集群。让我们称它们为:我ns1
也ns2
有多个服务帐户,让我们称它们为sa1
和sa2
,所有这些都在一个命名空间中 - 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
能够列出他们有权访问的集群内的所有命名空间。在这种情况下ns1
和ns2
.
这种行为也可能不允许我在 Lens 仪表板中列出命名空间及其资源。从命名空间列表中,我只能列出sa-ns
用户sa1
&sa2
所属的命名空间。然而,仪表板是空的,如下图所示。
我尝试添加用户实际上可以通过ACCESSIBLE NAMESPACES
Lens 中的功能访问的命名空间,但它也不起作用。
我仍然没有看到任何东西,只有空白的仪表板。
服务帐号:
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。