Cloud/클라우드 프로그래밍

[클라우드 프로그래밍] 14주차

승주우에요 2026. 6. 22. 19:57

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 특정 권한 보유 여부 확인 명령