RBAC이란?
RBAC(Role-Based Access Control)는 쿠버네티스에서 권한을 역할 단위로 정의하고 주체에게 부여하는 보안 메커니즘이다.
대상: kubectl을 사용하는 사용자, 서비스 계정(ServiceAccount), 그룹
⚠️ 자주 나오는 함정: "RBAC은 동작이 복잡하다" → 틀림. 동작 자체는 단순하지만 설정할 것이 많아 관리가 까다로운 것이다.
RBAC 핵심 구성 요소
리소스 범위 설명
| Role | 특정 네임스페이스 | 해당 네임스페이스 내 리소스에 대한 권한 정의 |
| ClusterRole | 클러스터 전체 | 클러스터 전체 리소스(Node, PV 등)에 대한 권한 정의 |
| RoleBinding | 특정 네임스페이스 | Role/ClusterRole을 주체에게 연결 |
| ClusterRoleBinding | 클러스터 전체 | ClusterRole을 클러스터 전체 범위로 주체에게 연결 |
💡 시험 포인트:
- 네임스페이스 한정 권한 → Role + RoleBinding
- 클러스터 전체 권한 → ClusterRole + ClusterRoleBinding
- ClusterRole을 특정 네임스페이스에만 부여 → ClusterRole + RoleBinding (혼합 가능)
# RoleBinding 예시
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: reader-view
namespace: default # 적용 범위: default 네임스페이스
subjects:
- kind: User
name: reader@kiamol.net
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: view # 기본 제공 ClusterRole 사용
apiGroup: rbac.authorization.k8s.io
# ClusterRole 예시 (특정 리소스/동사 정의)
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: create-approve-csr
rules:
- apiGroups: ["certificates.k8s.io"]
resources: ["certificatesigningrequests"]
verbs: ["create", "get", "list", "watch"]
- apiGroups: [""] # 코어 API 그룹은 빈 문자열
resources: ["pods", "pods/log"]
verbs: ["get"]
서비스 계정 (ServiceAccount)
모든 네임스페이스에는 기본 서비스 계정이 자동 생성된다. 서비스 계정이 따로 지정되지 않은 파드는 기본 서비스 계정을 사용하며, 권한 추가 전까지는 아무 권한도 없다.
# 권한 확인
kubectl auth can-i "*" "*"
kubectl auth can-i get pods -n kiamol-ch17 --as system:serviceaccount:kiamol-ch17:default
그룹 (Group)
서비스 계정은 항상 두 개의 그룹에 속한다:
- 클러스터 내 모든 서비스 계정의 그룹
- 자신이 속한 네임스페이스 내 모든 서비스 계정의 그룹
2차시: 워크로드의 배치 조정과 자동 스케일링
테인트와 톨러레이션
테인트(Taint): 노드 측에 설정하여 허용되지 않은 파드의 배치를 거부하는 기능.
톨러레이션(Toleration): 파드 측에 설정하여 특정 테인트를 용인함으로써 해당 노드에 배치될 수 있게 하는 기능.
# 모든 노드에 테인트 추가
kubectl taint nodes --all kiamol-disk=hdd:NoSchedule
# 테인트 제거 (- 접미사)
kubectl taint nodes --all kiamol-disk=hdd:NoSchedule-
spec:
tolerations:
- key: "kiamol-disk"
operator: "Equal"
value: "hdd"
effect: "NoSchedule" # 테인트의 이펙트와 일치해야 함
💡 시험 포인트: 테인트는 노드에, 톨러레이션은 파드에 설정한다. 톨러레이션이 있어도 해당 노드에 반드시 배치되는 것은 아니다(배치 자격만 부여).
노드 어피니티 (Node Affinity)
스케줄러에게 파드가 배치될 노드에 대한 **필요 조건(required) 또는 우선 조건(preferred)**을 지정하는 기능.
affinity:
nodeAffinity:
# 필수 조건 (만족 못하면 배치 안됨)
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/arch
operator: In
values:
- amd64
# 선호 조건 (가능하면 선호, 불가하면 다른 노드 허용)
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: kubernetes.io/os
operator: In
values:
- linux
파드 어피니티 & 안티어피니티
파드 어피니티: 특정 파드가 이미 실행 중인 노드에 함께 배치되도록 유도.
파드 안티어피니티: 특정 파드가 있는 노드를 피해서 배치하도록 유도.
affinity:
podAffinity: # 같은 노드에 배치
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- numbers
topologyKey: "kubernetes.io/hostname"
💡 시험 포인트 (퀴즈 4 연계): 파드를 특정 조건 노드로 끌어당기거나(Affinity), 특정 파드 있는 노드를 피하는(Anti-Affinity) 기능 → 노드 어피니티 & 파드 안티어피니티
HPA (Horizontal Pod Autoscaler)
수평 파드 자동 스케일러: 애플리케이션 부하(CPU, 메모리 등)에 따라 파드 수를 자동으로 조절한다.
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name: pi-cpu
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: pi-web
minReplicas: 1
maxReplicas: 5
targetCPUUtilizationPercentage: 75
# HPA v2: 스케일 다운 동작 세부 설정
behavior:
scaleDown:
stabilizationWindowSeconds: 30 # 기준 아래 유지 후 30초 대기
policies:
- type: Percent
value: 50 # 현재 파드의 50%씩 감소
periodSeconds: 15
⚠️ 자주 나오는 함정: "부하 감소 시 즉시(0초) 스케일 인된다" → 틀림. 안정화 기간(Cooldown)이 있어 시스템 안정성을 위해 지연이 존재.
HPA 동작을 위해서는 metrics-server 컴포넌트가 필요하다.
kubectl get hpa pi-cpu
kubectl top pods -l app=pi-web
3차시: 사용자 정의 리소스(CRD)와 오퍼레이터
CRD (CustomResourceDefinition)
쿠버네티스가 기본 제공하는 파드, 서비스 등 외에 사용자가 직접 새로운 리소스 유형을 정의하여 클러스터 API를 확장하는 메커니즘.
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
name: todos.ch20.kiamol.net
spec:
group: ch20.kiamol.net
scope: Namespaced # Namespaced 또는 Cluster
names:
plural: todos
singular: todo
kind: ToDo
versions:
- name: v1
served: true
storage: true
schema:
openAPIV3Schema:
type: object
properties:
spec:
type: object
properties:
item:
type: string
CRD 배포 후 사용자 정의 리소스 생성:
apiVersion: "ch20.kiamol.net/v1"
kind: ToDo
metadata:
name: ch20
spec:
item: "Finish KIAMOL Ch20"
kubectl apply -f todo-custom/
kubectl get todos
kubectl delete crd todos.ch20.kiamol.net # CRD 삭제 시 모든 객체 함께 삭제
💡 시험 포인트: CRD = CustomResourceDefinition (UDR, AC 같은 건 없음에 주의)
사용자 정의 컨트롤러
사용자 정의 컨트롤러는 쿠버네티스 API를 사용하여 사용자 정의 리소스의 변화를 주시하다가 필요한 리소스를 자동으로 준비해주는 애플리케이션이다.
예시: 사용자(User) CRD가 생성되면 컨트롤러가 자동으로 네임스페이스, 서비스 계정, 토큰을 생성하는 워크플로.
오퍼레이터 패턴 (Operator Pattern)
오퍼레이터는 사용자 정의 리소스 + 사용자 정의 컨트롤러를 결합하여 복잡한 애플리케이션의 완전한 생애 주기 관리(설치, 업그레이드, 백업, 복구 등)를 자동화하는 디자인 패턴이다.
특히 데이터베이스처럼 업그레이드 시 백업, 읽기 전용 전환, 복구 등 여러 단계가 필요한 애플리케이션에 유용하다.
💡 시험 포인트: 오퍼레이터 패턴 = CRD + 사용자 정의 컨트롤러로 애플리케이션 운영을 코드로 자동화하는 패턴.
# NatsCluster: NATS 메시지 큐를 2줄로 배포하는 오퍼레이터 사용 예시
apiVersion: nats.io/v1alpha2
kind: NatsCluster
metadata:
name: todo-list-queue
spec:
size: 3
version: "1.3.0"
📝 학습정리
- RBAC: 동작은 단순, 설정이 많아 관리 까다로움
- Role = 네임스페이스 한정, ClusterRole = 클러스터 전체
- RoleBinding = 주체에게 역할 연결 (핵심 연결고리)
- 서비스 계정: 기본 생성되지만 권한은 없음, 전용 서비스 계정 권장
- 테인트(노드) + 톨러레이션(파드) = 노드 배치 거부/허용
- 어피니티 = 특정 노드/파드 근처 배치 유도, 안티어피니티 = 분산
- HPA = CPU/메모리 기반 파드 수 자동 조절, 즉시 스케일 인 X
- CRD = 사용자 정의 리소스 유형, 삭제 시 모든 객체 함께 삭제
- 오퍼레이터 패턴 = CRD + 컨트롤러로 애플리케이션 운영 자동화
🔑 핵심 키워드 정리
키워드 설명
| RBAC | 역할 기반 접근 제어 |
| Role / ClusterRole | 권한 정의 (네임스페이스 한정 / 전체) |
| RoleBinding | 역할을 주체에게 연결하는 리소스 |
| ServiceAccount | 파드용 계정, 기본 생성, 권한은 없음 |
| 테인트(Taint) | 노드에 설정, 파드 배치 거부 |
| 톨러레이션(Toleration) | 파드에 설정, 테인트 용인 |
| 노드 어피니티 | 파드를 특정 노드에 배치 유도 |
| 파드 안티어피니티 | 특정 파드 있는 노드 회피 |
| HPA | 수평 파드 자동 스케일러 |
| stabilizationWindowSeconds | HPA 스케일 다운 안정화 대기 시간 |
| CRD | CustomResourceDefinition, 사용자 정의 리소스 유형 |
| 오퍼레이터 패턴 | CRD + 컨트롤러로 앱 운영 자동화 |
| kubectl auth can-i | 특정 권한 보유 여부 확인 명령 |
'Cloud > 클라우드 프로그래밍' 카테고리의 다른 글
| [클라우드 프로그래밍] 13주차 (0) | 2026.06.22 |
|---|---|
| [클라우드 프로그래밍] 12주차 (0) | 2026.06.22 |
| [클라우드 프로그래밍] 11주차 (0) | 2026.06.22 |
| [클라우드 프로그래밍] 10주차 (0) | 2026.06.16 |
| [클라우드 프로그래밍] 9주차 (0) | 2026.06.16 |