https://kubernetes.io/docs/concepts/workloads/controllers/replicaset/

레플리카셋은 레플리카 파드 집합을 항상 안정적으로 실행시키기 위해 사용한다.

동작 방식

레플리카 셋은 다음의 필드를 통해 정의된다.

  1. 셀렉터 - 대상이 될 파드를 식별하는데 쓰인다.
  2. 레플리카 개수 - 유지해야 하는 파드의 개수를 명시한다.
  3. 파드 템플릿 - 신규 파드에 대한 데이터를 명시한다.
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: frontend
  labels:
    app: guestbook
    tier: frontend
spec:
# 1. 유지할 파드의 개수를 명시합니다.
  replicas: 3
# 2. 관리할 파드를 식별하는 셀렉터를 명시합니다.
  selector:
    matchLabels:
      tier: frontend
# 3. 신규 파드 생성 시 사용할 템플릿을 명시합니다.
  template:
    metadata:
      labels:
# 셀렉터(spec.selector.matchLabels)와 일치해야 합니다.
        tier: frontend
    spec:
      containers:
      - name: nginx
        image: nginx

위의 세가지를 기반으로 레플리카셋은 설정을 충족하기 위해 필요한 만큼 파드를 만들고 삭제한다. 새 파드를 만든다면 파드 템플릿을 이용한다.

파드는 metadata.ownerReferences 필드를 통해 레플리카셋을 참조한다. 레플리카셋은 파드의 ownerReferences 참조를 통해 자신이 유지하는 파드의 상태를 확인하고 관리한다. 쉽게 말해 파드의 ownerReferences 에 자신을 기록함으로써 레플리카셋은 자신이 소유하고 관리하는 파드임을 명시한다.

만약 레플리카셋의 셀렉터에 매핑된 레이블을 가진 파드가 이미 존재하지만, 소유자가 없다면 레플리카셋은 이 파드를 자신이 소유하고 자신이 관리하는 파드 개수에 포함시킨다. 만약 목표 개수에 모자르다면 필요한 만큼 파드를 생성한다.

ReplicaSet을 사용하는 시기

레플리카셋은 지정된 수의 파드 레플리카가 항상 실행되도록 보장하는 것이 목표이다.

한편 디플로이먼트는 레플리카셋을 관리하고, 다른 유용한 기능과 함께 파드에 대한 업데이트를 제공하는 더 상위의 개념이다.

따라서 별도의 커스텀 오케스트레이션이 필요한 경우 같은 특이한 경우가 아니라면 레플리카셋을 직접 사용하기보다는 디플로이먼트를 통해 레플리카셋을 조작하는 것이 추천된다. (디플로이먼트의 스펙에 정의하면 된다.)

ReplicaSet manifest

다른 쿠버네티스 API 오브젝트와 마찬가지로 apiVersion, kind, metadata필드가 필요함. 그리고 .spec 섹션에 파드 템플릿(.spec.template), 파드 셀렉터(.spec.selector), 레플리카 개수(.spec.replicas)를 지정하면 된다.

ReplicaSet의 대안

  1. deployment는 레플리카셋의 권장되는 대안이다. 디플로이먼트가 레플리카셋을 소유하거나 업데이트 할 수 있고, 파드 업데이트와 서버측 롤링 업데이트까지 할 수 있기 때문. 따라서 오늘날에는 레플리카셋을 단독으로 사용하지 않고 디플로이먼트를 이용한다.
  2. Job은 스스로 종료될 것이 예상되는 파드의 경우에 레플리카 셋 대신 사용한다. (배치 잡 등)