ServiceAccount가 클러스터 내에서 액세스할 수 있는 네임스페이스를 나열하도록 허용하려면 어떻게 해야 합니까?

ServiceAccount가 클러스터 내에서 액세스할 수 있는 네임스페이스를 나열하도록 허용하려면 어떻게 해야 합니까?

여러 네임스페이스가 있는 클러스터가 있습니다. 호출해 보겠습니다. ns1또한 서비스 계정이 여러 개 있습니다. 모두 하나의 네임스페이스에서 및 이라고 ns2호출해 보겠습니다 .sa1sa2sa-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네임스페이스 만 나열할 수 있습니다. 그런데 아래 이미지처럼 대시보드가 ​​비어있습니다.

여기에 이미지 설명을 입력하세요.

사용자가 Lens의 기능을 통해 실제로 액세스할 수 있는 네임스페이스를 추가하려고 시도했지만 ACCESSIBLE NAMESPACES역시 작동하지 않았습니다.

여기에 이미지 설명을 입력하세요.

아직 아무것도 보이지 않고 빈 대시보드만 보입니다.

여기에 이미지 설명을 입력하세요.

서비스 계정:

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을 역할 바인딩과 결합하면 단일 네임스페이스에만 권한이 부여되므로 이것이 작동하지 않습니다.

이 문제를 해결하는 가장 좋은 방법은 아마도 ClusterRole을 생성하고 네임스페이스 리소스에 대한 GET 및 LIST 권한을 제공한 다음 ClusterRole의 각 서비스 계정에 대해 ClusterRoleBinding을 생성하는 것입니다.

관련 정보