
ReplicaSet은 일정한 개수의 동일한 Pod가 항상 실행되도록 관리하는 리소스이다.
이 기능은 서비스의 지속성(High Availability)을 보장하는 데 핵심적인 역할을 한다.
예를 들어, 노드의 하드웨어 장애나 기타 이유로 Pod를 사용할 수 없게 되면, ReplicaSet은 다른 정상 노드에서 Pod를 자동으로 다시 생성하여 사용자에게 중단 없는 서비스를 제공한다.
원래 이 기능은 ReplicationController라는 리소스가 담당했으나, 더 유연한 레이블 셀렉터(Label Selector) 기능을 갖춘 ReplicaSet이 추가되었다.
ReplicationController는 현재 거의 사용되지 않으므로, 특별한 이유가 없다면 ReplicaSet을 사용하는 것이 권장된다.

ReplicaSet 역시 YAML 매니페스트 파일을 통해 생성한다.
sample-rs.yaml 파일 작성:apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: sample-rs
spec:
replicas: 3 # 1. 유지할 파드의 개수를 3개로 지정
selector: # 2. 관리할 파드를 선택하기 위한 레이블 셀렉터
matchLabels:
app: sample-app
template: # 3. 파드가 이 개수보다 적을 때 생성할 파드의 명세 (템플릿)
metadata:
labels:
app: sample-app # selector의 레이블과 일치해야 함
spec:
containers:
- name: nginx-container
image: nginx
spec.replicas : ReplicaSet이 관리할 파드의 복제본 수를 정의한다.
spec.selector : ReplicaSet이 어떤 파드를 자신의 관리 대상으로 삼을지 결정하는 규칙이다. matchLabels에 정의된 레이블을 가진 파드를 찾아 관리한다.
spec.template : 관리 중인 파드의 수가 replicas 보다 적을 경우, 이 템플릿을 사용하여 새로운 파드를 생성한다. 템플릿에 정의된 파드의 레이블(template.metadata.labels)은 반드시 셀렉터(selector.matchLabels)와 일치해야 한다.
# ReplicaSet 생성
kubectl apply -f sample-rs.yaml
# ReplicaSet 목록 확인
kubectl get replicaset
# ReplicaSet이 생성한 파드 확인 (레이블 셀렉터 -l 사용)
kubectl get pods -l app=sample-app
ReplicaSet에 의해 생성된 파드는 [ReplicaSet이름]-[임의의문자열] 형식의 이름을 갖게 된다.

ReplicaSet의 가장 중요한 기능은 자동화된 복구(Self-healing)이다.
ReplicaSet은 자신이 관리하는 파드에 장애가 발생하거나, 사용자가 직접 파드를 삭제하더라도, 지정된 replicas 수를 유지하기 위해 즉시 새로운 파드를 다른 노드에 기동시킨다.
이것이 쿠버네티스가 장애에 강한(resilient) 시스템을 구축할 수 있는 핵심 원리 중 하나이다.
자동 복구 기능 테스트
# ReplicaSet이 관리하는 파드 중 하나를 직접 삭제
kubectl delete pod [파드이름]
# 잠시 후 파드 목록을 다시 확인
kubectl get pods -l app=sample-app
삭제된 파드 대신 새로운 파드가 생성되어 replicas 수인 3개를 유지하는 것을 볼 수 있다.

ReplicaSet 이벤트 확인
kubectl describe 명령어를 사용하면 ReplicaSet의 상세 정보와 이벤트 로그를 확인할 수 있다. 이를 통해 파드가 삭제되고 새로 생성된 이력을 추적할 수 있다.
kubectl describe replicaset sample-rs

ReplicaSet은 레이블(Label)과 셀렉터(Selector)를 통해 파드를 식별하고 관리한다.
ReplicaSet 컨트롤러는 주기적으로 spec.selector 에 정의된 레이블을 가진 파드의 수를 계산한다.
계산된 파드 수가 spec.replicas 보다 적으면, spec.template 을 이용해 새로운 파드를 생성한다.
반대로 파드 수가 더 많으면, 레이블이 일치하는 파드 중 하나를 임의로 삭제한다.

만약 spec.selector.matchLabels 와 spec.template.metadata.labels 의 값이 다르면, ReplicaSet은 자신이 생성한 파드를 관리 대상으로 인식하지 못하게 된다.
이 경우, 파드를 계속해서 생성하려고 시도하지만 관리 대상에는 포함되지 않아 무한 루프에 빠질 수 있다.
따라서 쿠버네티스는 이러한 YAML 파일을 적용할 때 유효성 검사를 통해 에러를 발생시킨다.
만약 ReplicaSet이 관리하는 레이블(app=sample-app)과 동일한 레이블을 가진 파드를 사용자가 직접 생성하면 어떻게 될까?
ReplicaSet은 이 파드 역시 자신의 관리 대상으로 인식한다. 따라서 전체 파드 수가 replicas를 초과하게 되므로, ReplicaSet은 관리 대상 파드 중 하나(직접 생성한 파드 또는 기존 파드)를 즉시 종료(Terminating)시켜 개수를 맞춘다.
kubectl scale 명령어를 사용하거나 YAML 파일의 replicas 값을 수정한 후 kubectl apply 를 실행하여 파드의 수를 동적으로 조절(스케일링)할 수 있다.
kubectl scale 명령어를 이용한 스케일 아웃(Scale-out):# sample-rs ReplicaSet이 관리하는 파드 수를 5개로 변경
kubectl scale replicaset sample-rs --replicas=5
명령 실행 후 파드 목록을 확인하면, 새로운 파드 2개가 추가로 생성되어 총 5개의 파드가 실행되는 것을 볼 수 있다.
ReplicationController와 ReplicaSet의 가장 큰 차이점은 파드를 선택하는 셀렉터의 기능이다.
일치성 기준 (Equality-based) 셀렉터: ReplicationController에서 사용. app=sample-app 처럼 레이블의 키와 값이 정확히 일치하는 경우만 선택할 수 있다. (=, !=)
집합성 기준 (Set-based) 셀렉터: ReplicaSet에서 사용. 일치성 기준 조건을 포함하며, 추가로 집합 연산을 사용할 수 있어 더 유연한 선택이 가능하다. (in, notin, exists)
env in (development, staging) -> env 레이블의 값이 development 또는 staging 인 모든 파드를 선택한다.이러한 집합성 기준 셀렉터는 ReplicaSet 외에도 스케줄링 등 쿠버네티스의 여러 기능에서 활용된다.