Kubernetes

[k8s] RBAC ㅡ 이해하기

최선을 다하자! 2026. 6. 10. 14:35
14:36:36 [root@k8s-worker-jwc:~]$ kubectl get serviceaccount -n dev
NAME       SECRETS   AGE
default    0         23h
readuser   0         4h12m

RBAC

누가 뭘 할 수 있는지 — 역할 기반 접근 제어


RBAC이란?

RBAC(Role-Based Access Control)은 역할 기반 접근 제어다. k8s 클러스터에서 "누가 어떤 리소스에 어떤 동작을 할 수 있는지"를 정의한다. 예를 들어 개발자는 Pod 조회만 가능하고, 운영자는 배포까지 가능하게 설정할 수 있다.

RBAC은 3가지 오브젝트로 구성된다.

오브젝트 역할 예시
Role "뭘 할 수 있는지" 권한 정의 dev 네임스페이스 Pod 조회 가능
ServiceAccount k8s 안에서 쓰는 계정 readuser
RoleBinding Role과 계정을 연결 readuser에게 Pod 조회 Role 부여

흐름은 항상 같다.

Role 생성 → ServiceAccount 생성 → RoleBinding으로 연결 → 권한 확인

Role 생성 — 권한 정의

dev 네임스페이스에서 Pod를 읽기만 할 수 있는 Role을 만든다.

# Role 생성
kubectl create role pod-reader \
  --verb=get,list,watch \
  --resource=pods \
  -n dev

# 옵션 설명
# pod-reader     : Role 이름 (직접 정하는 것)
# --verb         : 허용할 동작 (get=단건조회, list=목록조회, watch=실시간감시)
# --resource     : 대상 리소스 (pods, deployments, services 등)
# -n dev         : dev 네임스페이스에 적용

만들어진 Role을 yaml로 확인하면 rules 구조를 볼 수 있다.

kubectl get role pod-reader -n dev -o yaml
rules:
- apiGroups:
  - ""
  resources:
  - pods           # 대상 리소스
  verbs:
  - get
  - list
  - watch          # 허용 동작 (create, delete 없음)

 

14:36:34 [root@k8s-worker-jwc:~]$ kubectl get role pod-reader -n dev -o yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  creationTimestamp: "2026-06-10T01:21:46Z"
  name: pod-reader
  namespace: dev
  resourceVersion: "7334719"
  uid: b096404f-1130-4646-a377-65e8134f97b4
rules:
- apiGroups:
  - ""
  resources:
  - pods
  verbs:
  - get
  - list
  - watch

ServiceAccount 생성 — 계정 만들기

k8s에서 사용자 계정은 ServiceAccount로 관리한다. dev 네임스페이스에 readuser 계정을 만든다.

# ServiceAccount 생성
kubectl create serviceaccount readuser -n dev

# 확인
kubectl get serviceaccount -n dev



 


RoleBinding — Role과 계정 연결

Role과 ServiceAccount를 연결한다. 이 시점부터 readuser 계정에 pod-reader 권한이 적용된다.

# RoleBinding 생성
kubectl create rolebinding pod-reader-binding \
  --role=pod-reader \
  --serviceaccount=dev:readuser \
  -n dev

# 옵션 설명
# pod-reader-binding        : RoleBinding 이름 (직접 정하는 것)
# --role=pod-reader         : 연결할 Role 이름
# --serviceaccount=dev:readuser : 대상 계정 (네임스페이스:계정명)
# -n dev                    : dev 네임스페이스에 적용

주의: RoleBinding도 반드시 -n dev 를 붙여야 한다. 빠뜨리면 default 네임스페이스에 생성되어 권한이 제대로 적용되지 않는다.

[ 캡처 - RoleBinding 생성 확인 ]


권한 확인 — kubectl auth can-i

kubectl auth can-i 명령어로 특정 계정의 권한을 확인할 수 있다. 실제로 해당 계정으로 로그인하지 않아도 테스트가 가능하다.

# Pod 조회 권한 확인 → yes
kubectl auth can-i get pods -n dev --as=system:serviceaccount:dev:readuser

# Pod 삭제 권한 확인 → no
kubectl auth can-i delete pods -n dev --as=system:serviceaccount:dev:readuser
yes   ← get 허용됨
no    ← delete 차단됨

--as=system:serviceaccount:네임스페이스:계정명 형식으로 특정 계정을 가장해서 권한을 테스트한다.

[ 캡처 - auth can-i 결과 yes/no ]


Role vs ClusterRole

지금까지 만든 Role은 특정 네임스페이스에만 적용된다. 클러스터 전체에 적용하려면 ClusterRole을 쓴다.

  Role + RoleBinding ClusterRole + ClusterRoleBinding
적용 범위 특정 네임스페이스 클러스터 전체
용도 팀별/환경별 권한 분리 클러스터 관리자 권한

다음 파트는 HPA — 트래픽에 따라 Pod 수를 자동으로 조절하는 방법을 다룬다.