[CKA] ClusterRole과 ClusterRoleBinding

ClusterRole과 ClusterRoleBinding의 핵심 개념과 구성 방법, 실습 풀이를 정리합니다.

Cluster Roles and Role Bindings

Role과 RoleBinding은 네임스페이스 안에 생성됩니다. 네임스페이스를 명시하지 않으면 kubectl의 현재 컨텍스트 설정을 사용하고, 그 설정도 없으면 default를 사용합니다.

쿠버네티스의 리소스는 네임스페이스 범위(Namespaced)와 클러스터 범위(Cluster-scoped)로 나뉩니다.

**네임스페이스 범위 리소스(예: Pod, Service, Deployment)**는 네임스페이스 내에 존재하며, **클러스터 범위 리소스(예: Node, PersistentVolume, Namespace)**는 전체 클러스터에 걸쳐 존재합니다.

네임스페이스 리소스 목록

네임스페이스 리소스의 경우, Authorization을 위해 role과 rolebinding을 사용합니다.

비네임스페이스 리소스의 경우, Authrization을 위해 clusterrole과 clusterrolebinding을 사용합니다.

ClusterRole 자체는 클러스터 범위의 객체이지만 네임스페이스 범위와 클러스터 범위의 리소스 권한을 모두 정의할 수 있습니다. rules에 apiGroups, resources, verbs를 지정합니다.

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

clusterrolebinding 개체는 사용자와 cluster role을 연결하며 subjects 영역에 사용자 세부 정보를 지정합니다. roleRef 영역에는 cluster role에 대해 지정한다.

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: read-pods-global
subjects:
- kind: User
  name: example-user
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: pod-reader  # 이전에 정의한 ClusterRole의 이름
  apiGroup: rbac.authorization.k8s.io

ClusterRole과 ClusterRoleBinding의 용도는 다음과 같습니다.

  1. 비네임스페이스 리소스 관리:
    • ClusterRole과 ClusterRoleBinding은 노드, 퍼시스턴트 볼륨, 네임스페이스 자체 등과 같은 비네임스페이스(클러스터 범위) 리소스를 관리하는 데 사용됩니다.
  2. 네임스페이스 리소스에 대한 클러스터 전체 권한:
    • ClusterRole과 ClusterRoleBinding은 또한 모든 네임스페이스에 걸쳐 네임스페이스 리소스(예: 파드, 서비스, 디플로이먼트 등)에 대한 권한을 정의하고 할당하는 데 사용될 수 있습니다.
  3. 재사용성:
    • ClusterRole은 여러 네임스페이스에서 재사용될 수 있습니다. 즉, 하나의 ClusterRole을 정의하고 이를 여러 네임스페이스의 RoleBinding에서 참조할 수 있습니다.
  4. 관리 효율성:
    • 클러스터 전체에 적용되는 권한 세트를 관리하는 데 유용합니다. 예를 들어, 모든 네임스페이스의 파드를 볼 수 있는 권한을 가진 “pod-viewer” ClusterRole을 만들 수 있습니다.
  5. 기본 권한:
    • Kubernetes는 기본적으로 몇 가지 ClusterRole을 제공합니다(예: cluster-admin, view, edit). 이들은 일반적인 사용 사례에 대한 권한 세트를 정의합니다.
      따라서, ClusterRole과 ClusterRoleBinding은 비네임스페이스 리소스를 다루는 데만 국한되지 않습니다. 이들은 클러스터 전체의 권한 관리, 네임스페이스 리소스에 대한 클러스터 전체 권한 부여, 그리고 효율적인 권한 관리를 위해 사용됩니다.
      네임스페이스에 한정된 권한만 필요한 경우에는 Role과 RoleBinding을 사용하는 것이 더 적절할 수 있습니다.

현재 동작중인 cluster role 확인
wc는 “word count” -l 행 (Lines) 수 출력

kubectl get clusterrole --no-headers | wc -l
kubectl get clusterrolebindings --no-headers | wc -l

바인딩 되어있는 role, group

$ k describe clusterrolebindings cluster-admin

Name:         cluster-admin
Labels:       kubernetes.io/bootstrapping=rbac-defaults
Annotations:  rbac.authorization.kubernetes.io/autoupdate: true
Role:
  Kind:  ClusterRole
  Name:  cluster-admin
Subjects:
  Kind   Name            Namespace
  ----   ----            ---------
  Group  system:masters  

cluster role inspect

kubectl describe clusterrole cluster-admin

노드 조회·감시·생성·삭제 권한을 지정합니다.

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

예시 사용자에게 role 바인딩

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

storage로 확장

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

storage bindings

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