본문 바로가기

Container/Kubernetes

[K8S] ClusterRole/ClusterRoleBinding

ClusterRole이란, 쿠버네티스 리소스에 대한 권한을 정의하는 역할이다.

네임스페이스와 관계없이 클러스터 전역에서 작동하거나, 특정 네임스페이스의 리소스에 대해 권한을 정의할 수 있다.

  • 리소스, API 그룹, 허용된 작업(verbs) 지정
  • 필요한 최소한의 권한만을 부여해야하며, 클러스터 전역 권한이 필요하지 않으면 Role과 RoleBinding을 사용한다.
  • 정의
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: pod-reader
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "watch", "list"]

ClusterRoleBinding이란, 정의된 ClusterRole을 사용자, 그룹 또는 서비스 계정에 연결(Binding)한다.

클러스터 전체에서 작동하며, 네임스페이스 제한이 없다.

  • 권한이 부여될 주체(Subjects)를 명시
  • ClusterRole 조회
controlplane ~ ➜  kubectl get clusterroles
NAME                                                                   CREATED AT
admin                                                                  2025-02-03T05:18:13Z
cluster-admin                                                          2025-02-03T05:18:13Z
clustercidrs-node                                                      2025-02-03T05:18:19Z
edit                                                                   2025-02-03T05:18:13Z
k3s-cloud-controller-manager                                           2025-02-03T05:18:17Z
local-path-provisioner-role                                            2025-02-03T05:18:17Z
system:aggregate-to-admin                                              2025-02-03T05:18:13Z
system:aggregate-to-edit                                               2025-02-03T05:18:13Z
system:aggregate-to-view                                               2025-02-03T05:18:13Z
system:aggregated-metrics-reader                                       2025-02-03T05:18:17Z
system:auth-delegator                                                  2025-02-03T05:18:13Z
system:basic-user

controlplane ~ ➜  kubectl 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 
  
  
controlplane ~ ➜  kubectl describe clusterrole cluster-admin
Name:         cluster-admin
Labels:       kubernetes.io/bootstrapping=rbac-defaults
Annotations:  rbac.authorization.kubernetes.io/autoupdate: true
PolicyRule:
  Resources  Non-Resource URLs  Resource Names  Verbs
  ---------  -----------------  --------------  -----
  *.*        []                 []              [*]
             [*]                []              [*] 
 # 어떠한 Action, Role 모두 수행 가능

 

  • clusterrole 만들기
$ kubectl create clusterrole --help
Create a cluster role.

Examples:
  # Create a cluster role named "pod-reader" that allows user to perform "get", "watch" and "list"
on pods
  kubectl create clusterrole pod-reader --verb=get,list,watch --resource=pods
  
  # Create a cluster role named "pod-reader" with ResourceName specified
  kubectl create clusterrole pod-reader --verb=get --resource=pods --resource-name=readablepod
--resource-name=anotherpod
  • clusterrolebinding 만들기
$ kubectl create clusterrolebinding --help
Create a cluster role binding for a particular cluster role.

Examples:
  # Create a cluster role binding for user1, user2, and group1 using the cluster-admin cluster role
  kubectl create clusterrolebinding cluster-admin --clusterrole=cluster-admin --user=user1
--user=user2 --group=group1

실습]

controlplane ~ ➜  kubectl get nodes --as michelle
Error from server (Forbidden): nodes is forbidden: User "michelle" cannot list resource "nodes" in API group "" at the cluster scope
# ClusterRoles and ClusterRoleBindings을 생성해 주어야 한다.

controlplane ~ ➜   kubectl create clusterrole michelle-role --verb=get,list,watch --resource=nodes
clusterrole.rbac.authorization.k8s.io/michelle-role created

controlplane ~ ➜  kubectl create clusterrolebinding michelle-role-binding --clusterrole=michelle-role --user=michell
e
clusterrolebinding.rbac.authorization.k8s.io/michelle-role-binding created

# Role 확인하기
controlplane ~ ➜  kubectl describe clusterrole michelle-role
Name:         michelle-role
Labels:       <none>
Annotations:  <none>
PolicyRule:
  Resources  Non-Resource URLs  Resource Names  Verbs
  ---------  -----------------  --------------  -----
  nodes      []                 []              [get list watch]
  
controlplane ~ ➜  kubectl describe clusterrolebinding michelle-role-binding
Name:         michelle-role-binding
Labels:       <none>
Annotations:  <none>
Role:
  Kind:  ClusterRole
  Name:  michelle-role
Subjects:
  Kind  Name      Namespace
  ----  ----      ---------
  User  michelle
  
# michell로 작동 확인  
controlplane ~ ➜  kubectl get nodes --as michell
NAME           STATUS   ROLES                  AGE   VERSION
controlplane   Ready    control-plane,master   40m   v1.31.0+k3s1

 

실습2] storage-admin 만들기

controlplane ~ ➜  kubectl create clusterrole storage-admin --resource=persistentvolumes,storageclasses --verb=list,create,get,watch
clusterrole.rbac.authorization.k8s.io/storage-admin created

controlplane ~ ➜  kubectl describe clusterrole storage-admin 
Name:         storage-admin
Labels:       <none>
Annotations:  <none>
PolicyRule:
  Resources                      Non-Resource URLs  Resource Names  Verbs
  ---------                      -----------------  --------------  -----
  persistentvolumes              []                 []              [list create get watch]
  storageclasses.storage.k8s.io  []                 []              [list create get watch]
  
controlplane ~ ➜  kubectl get clusterrole storage-admin -o yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  creationTimestamp: "2025-02-03T06:13:11Z"
  name: storage-admin
  resourceVersion: "1662"
  uid: 50885146-39ed-451c-a75c-b18b665ef738
rules:
- apiGroups:
  - ""
  resources:
  - persistentvolumes # 리소스 확인
  verbs:
  - list
  - create
  - get
  - watch
- apiGroups:
  - storage.k8s.io
  resources:
  - storageclasses  # 리소스 확인
  verbs:
  - list
  - create
  - get
  - watch
controlplane ~ ➜  kubectl create clusterrolebinding michelle-storage-admin --user=michelle --clusterrole=storage-admin
clusterrolebinding.rbac.authorization.k8s.io/michelle-storage-admin created

controlplane ~ ➜  kubectl get clusterrolebinding michelle-role-binding -o yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  creationTimestamp: "2025-02-03T05:57:58Z"
  name: michelle-role-binding
  resourceVersion: "1389"
  uid: be616dfa-5495-471d-83dd-e2125ef3643e
roleRef: # Binding할 ClusterRole
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: michelle-role
subjects:  # 권한 부여할 주체
- apiGroup: rbac.authorization.k8s.io
  kind: User
  name: michell # 사용자 이름

controlplane ~ ➜  kubectl describe clusterrolebinding michelle-storage-admin 
Name:         michelle-storage-admin
Labels:       <none>
Annotations:  <none>
Role:
  Kind:  ClusterRole
  Name:  storage-admin
Subjects:
  Kind  Name      Namespace
  ----  ----      ---------
  User  michelle  

controlplane ~ ➜  kubectl get storageclasses --as michelle
NAME                   PROVISIONER             RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
local-path (default)   rancher.io/local-path   Delete          WaitForFirstConsumer   false                  63m

 

  ClusterRole Role
적용 범위 클러스터 전역 or 네임스페이스 리소스 특정 네임스페이스 내의 리소스
적용 대상 리소스 클러스터 전역 리소스 네임스페이스 리소스
Binding ClusterRoleBinding 또는 RoleBinding RoleBinding만 가능

 

반응형

'Container > Kubernetes' 카테고리의 다른 글

[K8S] Image Security  (0) 2025.02.03
[K8S] Service Account(SA)  (0) 2025.02.03
[K8S] api-resources  (0) 2025.01.23
[K8S] Authorization  (1) 2025.01.20
[K8S] Certificates API  (0) 2025.01.13