개요
CKAD 시험에서 출제된 RBAC(Role-Based Access Control) 문제 풀이를 기록합니다. ServiceAccount를 생성하고 ClusterRole과 ClusterRoleBinding으로 권한을 부여한 후 Deployment에 ServiceAccount를 할당하는 절차를 다룹니다.
출제 문제
※ 기억에 의존해 복기하는 문제라 오류가 있을 수 있습니다.
참고만 부탁 드립니다.
- namespace가 cute-panda 이고 deployment가 scraper인 pod에서 error log를 확인할 것
- “system:serviceaccount:cute-panda:scraper” cannot Iist resource “pods” error log 처리를 위해 필요한 처리와 적절한 role를 적용할 것
해결 방법
# scraper deployment가 생성한 pod 명 확인 후 *에 적용 $ k pod -n cute-panda $ k logs -n cute-panda scraper-* # error log 확인 # Service Account 생성 $ k create sa -n cute-panda scraper # 결과값 no 확인 $ k auth can-i list pods –as=system:serviceaccount:cute-panda:scraper -n scraper # clusterrole 생성 및 clusterrolebinding 생성 처리 k create clusterrole cr –verbs=list –resource=pods -n cute-panda k create clusterrolebinding crb –clusterrole=cr –serviceaccount=cute-panda:scraper # scraper deployment에 scraper service account 적용 $ k set serviceaccount deployment -n cute-panda scraper scraper # 결과값 yes 확인 $ k auth can-i list pods –as=system:serviceaccount:cute-panda:scraper -n scraper # pod 재생성 확인 및 생성된 pod 명 확인 후 *에 적용 $ k pod -n cute-panda $ k logs -n cute-panda scraper-* # error log 미발생 확인
RBAC 핵심 개념
Kubernetes RBAC(Role-Based Access Control)는 누가(ServiceAccount/User), 어떤 리소스(pods/services/deployments)에, 어떤 동작(get/list/create/delete)을 할 수 있는지를 세밀하게 제어하는 접근 권한 시스템입니다. 시험과 실무에서 자주 쓰이는 네 가지 핵심 리소스를 이해하면 대부분의 RBAC 문제를 해결할 수 있습니다.
Role은 특정 네임스페이스 내에서만 유효한 권한 집합이고, ClusterRole은 클러스터 전체 또는 모든 네임스페이스에서 유효합니다. RoleBinding은 Role(또는 ClusterRole)을 특정 네임스페이스의 ServiceAccount/User에 바인딩하며, ClusterRoleBinding은 ClusterRole을 클러스터 전체 범위로 바인딩합니다. 이 문제처럼 모든 네임스페이스의 pod를 list할 권한이 필요하면 ClusterRole + ClusterRoleBinding 조합이 적합합니다.
# 현재 ServiceAccount의 권한 확인 (auth can-i)
kubectl auth can-i list pods --as=system:serviceaccount:cute-panda:scraper -n cute-panda
# Deployment에 적용된 ServiceAccount 확인
kubectl get deployment scraper -n cute-panda -o jsonpath='{.spec.template.spec.serviceAccountName}'
# ClusterRole이 부여하는 권한 상세 확인
kubectl describe clusterrole cr
CKAD 시험에서는 명령형(imperative) 방식으로 빠르게 생성하는 것이 시간 단축에 유리합니다. kubectl create clusterrole, kubectl create clusterrolebinding, kubectl set serviceaccount 명령어를 숙지해두면 YAML 파일 없이도 신속하게 구성할 수 있습니다.
kubectl 명령형 방식으로 빠르게 생성하기
CKAD 시험에서는 YAML 파일 작성보다 kubectl의 명령형(imperative) 명령어로 빠르게 리소스를 생성하는 방법이 시간 절약에 유리합니다. ClusterRole, ClusterRoleBinding, ServiceAccount 모두 단일 명령으로 생성이 가능하며, kubectl auth can-i로 권한 부여 결과를 즉시 확인할 수 있습니다.
RBAC에서 자주 혼동하는 점은 ClusterRoleBinding으로 ClusterRole을 특정 네임스페이스의 ServiceAccount에 바인딩하더라도 그 권한은 클러스터 전체에 적용된다는 것입니다. 이 문제에서 k auth can-i list pods -n scraper를 통해 cute-panda 네임스페이스의 ServiceAccount가 다른 네임스페이스인 scraper에서도 pod를 list할 수 있음을 확인할 수 있습니다. 반면 RoleBinding은 해당 네임스페이스 내에서만 권한을 부여하므로 단일 네임스페이스 범위 제어에는 Role + RoleBinding 조합을 사용합니다.
CKAD 시험에서 RBAC 문제는 kubectl create clusterrole, kubectl create clusterrolebinding, kubectl set serviceaccount 세 명령어의 옵션을 정확히 숙지하면 YAML 없이도 빠르게 해결할 수 있습니다.
참고
참고 문서: kubectl create clusterrole · kubectl create clusterrolebinding