레플리카셋

레플리카셋 (ReplicaSet)

출처: Kubernetes 공식 문서 — ReplicaSet

ReplicaSet의 목적은 언제든지 안정적인 수의 레플리카 파드를 유지하는 거예요. 보통은 직접 ReplicaSet을 정의하기보다 Deployment를 정의해서 Deployment가 ReplicaSet을 자동으로 관리하게 만듭니다.

ReplicaSet이 동작하는 방식 (How a ReplicaSet works)

ReplicaSet은 크게 세 가지로 정의돼요:

  • selector — 획득할 파드를 식별하는 방법
  • replicas — 유지해야 할 파드의 수
  • pod template — 원하는 파드 수를 채우기 위해 새로 만들 파드의 데이터

ReplicaSet을 언제 사용할까요? (When to use a ReplicaSet)

ReplicaSet은 지정된 수의 파드 레플리카가 항상 실행 중이도록 보장해요. 하지만 Deployment는 ReplicaSet을 관리하면서 선언적인 업데이트와 많은 유용한 기능을 제공하는 더 높은 수준의 개념입니다. 그래서 커스텀 업데이트 오케스트레이션이 필요하거나 업데이트 자체가 필요 없는 경우가 아니라면, ReplicaSet을 직접 쓰기보다 Deployment를 쓰길 권장해요.

예제 (Example)

프런트엔드 웹 서버를 3개 실행하는 ReplicaSet 예시입니다:

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: frontend
  labels:
    app: guestbook
    tier: frontend
spec:
  replicas: 3
  selector:
    matchLabels:
      tier: frontend
  template:
    metadata:
      labels:
        tier: frontend
    spec:
      containers:
      - name: php-redis
        image: us-docker.pkg.dev/google-samples/containers/gke/gb-frontend:v5

컨트롤 플레인이 ReplicaSet을 위한 새 파드를 만들 때, 파드 이름은 ReplicaSet의 .metadata.name을 기반으로 지어져요.

템플릿에 없는 파드 획득 (Non-Template Pod acquisitions)

ReplicaSet은 자기가 만든 파드뿐 아니라 selector에 맞는 기존의 파드도 관리 대상으로 획득할 수 있어요. 예를 들어 tier: frontend 라벨을 가진 파드가 이미 있다면 그 파드도 ReplicaSet의 레플리카로 편입됩니다.

ReplicaSet 매니페스트 작성 (Writing a ReplicaSet manifest)

다른 쿠버네티스 객체처럼 ReplicaSet도 apiVersion, kind, metadata 필드가 필요하고, kind는 항상 ReplicaSet이에요. 파드의 hostname에 예상치 못한 결과가 생길 수 있으니 ReplicaSet 이름은 유효한 DNS 서브도메인 값이어야 합니다.

ReplicaSet 활용 (Working with ReplicaSets)

HPA(Horizontal Pod Autoscaler) 대상으로서의 ReplicaSet

ReplicaSet은 HPA의 스케일링 대상이 될 수 있어요:

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: frontend-scaler
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: ReplicaSet
    name: frontend
  minReplicas: 3
  maxReplicas: 10
  targetCPUUtilizationPercentage: 50

ReplicaSet의 대안 (Alternatives to ReplicaSet)

Deployment (권장)

Deployment는 ReplicaSet을 소유하고 선언적이고 서버 사이드인 롤링 업데이트로 ReplicaSet과 파드를 업데이트하는 객체예요. ReplicaSet을 직접 관리할 걱정 없이 Deployment를 쓰는 게 권장됩니다.

Bare Pods

ReplicaSet은 여러 노드에 걸쳐 여러 파드를 감독하는 일종의 프로세스 슈퍼바이저로 생각할 수 있어요. 로컬 컨테이너 재시작은 Kubelet 같은 노드의 에이전트에게 위임합니다.

ReplicationController

ReplicaSet은 ReplicationController의 후속 개념이에요. 둘은 같은 목적과 비슷한 동작을 하지만, ReplicationController는 셋 기반의 라벨 셀렉터를 지원하지 않는다는 차이가 있습니다. 그래서 ReplicationController보다 ReplicaSet이 더 선호돼요.

더 알아보기 (Learn more)