Security - ClusterRole / ClusterRoleBinding

2026. 1. 2. 15:38·CKA

이전 글에서 Role / RoleBinding으로 “네임스페이스 내부 리소스”에 권한을 부여하는 방법을 정리했습니다.
이번에는 클러스터 전체 범위 리소스(예: Node, PV 등)에 권한을 주기 위해 사용하는 ClusterRole / ClusterRoleBinding을 정리합니다.


1) 리소스는 “네임스페이스 범위”와 “클러스터 범위”로 나뉜다

RBAC를 이해할 때 가장 먼저 잡아야 하는 기준은 리소스의 범위(scope)입니다.

네임스페이스 범위(Namespaced resources)

네임스페이스 안에 “소속”되는 리소스들입니다.

  • Pod, ReplicaSet, Deployment, Job, Service
  • Secret, ConfigMap
  • (대부분의 워크로드/서비스 관련 리소스)

특징:

  • 생성 시 네임스페이스가 필요(명시하지 않으면 default)
  • 조회/수정/삭제 시에도 보통 -n <namespace>가 필요
  • 권한은 Role / RoleBinding으로 부여

클러스터 범위(Cluster-scoped resources)

특정 네임스페이스에 소속될 수 없는 리소스들입니다.

  • Node
  • PersistentVolume(PV)
  • CertificateSigningRequest(CSR)
  • Namespace 오브젝트 자체
  • ClusterRole / ClusterRoleBinding 자체(이것들도 클러스터 범위 리소스)

특징:

  • 생성 시 네임스페이스를 지정하지 않음
  • 권한은 보통 ClusterRole / ClusterRoleBinding으로 부여

요약:

  • Namespaced 리소스 → Role/RoleBinding
  • Cluster-scoped 리소스 → ClusterRole/ClusterRoleBinding

2) “노드도 네임스페이스에 속하나?” → 아니다

강의에서 던진 질문의 핵심은 이것입니다.

  • “Node는 네임스페이스로 그룹화/격리할 수 있을까?”
  • “Node-01이 특정 네임스페이스의 일부라고 말할 수 있을까?”

답은 불가능입니다. Node는 클러스터 전체 리소스이며 네임스페이스 개념에 매이지 않습니다.
따라서 Node 관련 권한은 Role이 아니라 ClusterRole로 다루는 것이 자연스럽습니다.


3) 전체 목록은 kubectl api-resources로 확인한다

강의에서 소개한 방법 그대로, 리소스가 namespaced인지 아닌지 확인하려면:

kubectl api-resources --namespaced=true
kubectl api-resources --namespaced=false

또는 특정 리소스를 검색:

kubectl api-resources | grep -E 'nodes|persistentvolumes|certificatesigningrequests|namespaces'

4) ClusterRole: 클러스터 범위 리소스에 대한 “권한 규칙”

ClusterRole은 Role과 구조가 거의 같습니다.

  • apiVersion: rbac.authorization.k8s.io/v1
  • kind: ClusterRole
  • rules: apiGroups / resources / verbs

차이점:

  • Role은 metadata.namespace가 있지만
  • ClusterRole은 네임스페이스가 없다(클러스터 범위 오브젝트)

예시 1) 클러스터 관리용(Node 관리) ClusterRole

“노드를 보고/만들고/삭제할 수 있는” 권한:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: cluster-node-admin
rules:
  - apiGroups: [""]
    resources: ["nodes"]
    verbs: ["get", "list", "watch", "create", "delete", "patch", "update"]

적용:

kubectl apply -f clusterrole-node-admin.yaml

예시 2) 스토리지 관리자(PV/PVC) ClusterRole

강의에서는 “PV 및 클레임”을 언급합니다. PV는 클러스터 범위, PVC는 네임스페이스 범위입니다.

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: storage-admin
rules:
  - apiGroups: [""]
    resources: ["persistentvolumes"]
    verbs: ["get", "list", "watch", "create", "delete", "patch", "update"]
  - apiGroups: [""]
    resources: ["persistentvolumeclaims"]
    verbs: ["get", "list", "watch", "create", "delete", "patch", "update"]

PVC는 namespaced지만, ClusterRole에 넣어두면 “모든 네임스페이스의 PVC”까지 포괄하는 권한이 될 수 있습니다(아래 6번 참고).


5) ClusterRoleBinding: 사용자/그룹/SA를 ClusterRole에 연결

RoleBinding이 Role과 주체를 연결하듯,
ClusterRoleBinding은 ClusterRole과 주체(사용자/그룹/SA)를 연결합니다.

  • kind: ClusterRoleBinding
  • subjects: 누구에게
  • roleRef: 어떤 ClusterRole에

예시) cluster-admin-user → cluster-node-admin 권한 부여

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: cluster-admin-user-to-node-admin
subjects:
  - kind: User
    name: cluster-admin-user
    apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: cluster-node-admin
  apiGroup: rbac.authorization.k8s.io

적용:

kubectl apply -f clusterrolebinding-node-admin.yaml

6) 중요한 주의: “ClusterRole은 클러스터 리소스만”이 엄격 규칙은 아니다

강의에서 강조한 포인트입니다.

  • ClusterRole/ClusterRoleBinding은 주로 클러스터 범위 리소스를 위해 쓰지만,
  • 네임스페이스 리소스에 대해서도 ClusterRole을 만들 수 있습니다.

이게 의미하는 바:

  • Role로 Pod 권한을 주면 → 특정 네임스페이스에서만 Pod 접근 가능
  • ClusterRole로 Pod 권한을 주면 → 클러스터의 모든 네임스페이스 Pod에 접근 가능(바인딩 방식에 따라 달라질 수 있지만 기본적으로 범위가 커짐)

즉, “Pod 접근 권한” 같은 것도 ClusterRole로 주면 영향 범위가 커지므로 운영에서는 신중해야 합니다.

예시) 모든 네임스페이스의 Pod 조회 권한(읽기)

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: pod-reader-all-ns
rules:
  - apiGroups: [""]
    resources: ["pods"]
    verbs: ["get", "list", "watch"]

이걸 ClusterRoleBinding으로 사용자에게 붙이면, 그 사용자는 전 네임스페이스 Pod를 볼 수 있습니다.


7) 조회/디버깅 명령

목록/상세 확인

kubectl get clusterroles
kubectl get clusterrolebindings

kubectl describe clusterrole cluster-node-admin
kubectl describe clusterrolebinding cluster-admin-user-to-node-admin

권한 확인: kubectl auth can-i

특히 --as로 사용자 가장 테스트가 유용합니다.

kubectl auth can-i list nodes --as=cluster-admin-user
kubectl auth can-i delete nodes --as=cluster-admin-user

kubectl auth can-i list pods --as=cluster-admin-user -n default
kubectl auth can-i list pods --as=cluster-admin-user -n kube-system

8) 기본 제공 ClusterRole이 이미 많다

Kubernetes는 클러스터 설치 시 기본적으로 여러 ClusterRole을 생성합니다(강의 언급).
예를 들어 운영에서 자주 보게 되는 것들(환경마다 다를 수 있음):

  • cluster-admin (최고 권한)
  • admin, edit, view (네임스페이스 단위 운영에서 자주 사용)

확인은:

kubectl get clusterroles | head
kubectl get clusterroles | grep -E 'cluster-admin|admin|edit|view'

핵심 정리

  • 리소스는 namespaced와 cluster-scoped로 구분된다.
  • Node/PV/CSR/Namespace 같은 클러스터 리소스 권한은 ClusterRole/ClusterRoleBinding이 기본 선택이다.
  • ClusterRole은 Role과 문법이 유사하지만 네임스페이스가 없다.
  • ClusterRole을 네임스페이스 리소스에 적용할 수도 있으며, 이 경우 보통 모든 네임스페이스에 영향을 주므로 주의해야 한다.
  • 검증은 kubectl auth can-i + --as가 표준이다.

 

Practice Test: https://uklabs.kodekloud.com/topic/practice-test-cluster-roles-2/

'CKA' 카테고리의 다른 글

Security - Secret of Docker Registry  (0) 2026.01.02
Security - Service Account  (0) 2026.01.02
Security - Authorization(RBAC)  (0) 2026.01.01
Security - API Groups  (0) 2026.01.01
Security - 정리(1)  (2) 2026.01.01
'CKA' 카테고리의 다른 글
  • Security - Secret of Docker Registry
  • Security - Service Account
  • Security - Authorization(RBAC)
  • Security - API Groups
5jyan5
5jyan5
  • 5jyan5
    jyan
    5jyan5
  • 전체
    오늘
    어제
    • 분류 전체보기 (243)
      • 김영한의 스프링 핵심 원리(기본편) (8)
      • 김영한의 스프링 핵심 원리 - 고급편 (11)
      • 김영한의 스프링 MVC 1편 (1)
      • 김영한의 스프링 DB 1편 (3)
      • 김영한의 스프링 MVC 2편 (3)
      • 김영한의 ORM 표준 JPA 프로그래밍(기본편) (9)
      • 김영한의 스프링 부트와 JPA 활용2 (2)
      • 김영한의 실전 자바 - 중급 1편 (1)
      • 김영한의 실전 자바 - 고급 1편 (9)
      • 김영한의 실전 자바 - 고급 2편 (9)
      • Readable Code: 읽기 좋은 코드를 작성.. (2)
      • 김영한의 실전 자바 - 고급 3편 (9)
      • CKA (119)
      • 개발 (37)
      • 경제 (4)
      • 리뷰 (1)
      • 정보 (2)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

      jdk 동적 프록시
      자바
      @args
      고급
      락
      log trace
      typequery
      requset scope
      Thread
      스레드
      jpq
      gesingleresult
      @within
      양방향 맵핑
      hibernate5module
      reentarantlock
      페치 조인
      프록시
      @discriminatorcolumn
      @discriminatorvalue
      버퍼
      빈 후처리기
      cglib
      단방향 맵핑
      Target
      JPQL
      김영한
      조회 성능 최적화
      프록시 팩토리
      WAS
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.2
    5jyan5
    Security - ClusterRole / ClusterRoleBinding
    상단으로

    티스토리툴바