[Kubernetes] 9. 워크로드 (2편) - ReplicaSet

JIWON·2025년 7월 2일

Kubernetes

목록 보기
9/32
post-thumbnail

1. ReplicaSet / ReplicationController

  • ReplicaSet일정한 개수의 동일한 Pod가 항상 실행되도록 관리하는 리소스이다.

  • 이 기능은 서비스의 지속성(High Availability)을 보장하는 데 핵심적인 역할을 한다.

  • 예를 들어, 노드의 하드웨어 장애나 기타 이유로 Pod를 사용할 수 없게 되면, ReplicaSet은 다른 정상 노드에서 Pod를 자동으로 다시 생성하여 사용자에게 중단 없는 서비스를 제공한다.

  • 원래 이 기능은 ReplicationController라는 리소스가 담당했으나, 더 유연한 레이블 셀렉터(Label Selector) 기능을 갖춘 ReplicaSet이 추가되었다.

  • ReplicationController는 현재 거의 사용되지 않으므로, 특별한 이유가 없다면 ReplicaSet을 사용하는 것이 권장된다.

1) 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이름]-[임의의문자열] 형식의 이름을 갖게 된다.

2) 파드 정지와 자동화된 복구

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

3) ReplicaSet과 레이블

ReplicaSet은 레이블(Label)셀렉터(Selector)를 통해 파드를 식별하고 관리한다.

  • ReplicaSet 컨트롤러는 주기적으로 spec.selector 에 정의된 레이블을 가진 파드의 수를 계산한다.

  • 계산된 파드 수가 spec.replicas 보다 적으면, spec.template 을 이용해 새로운 파드를 생성한다.

  • 반대로 파드 수가 더 많으면, 레이블이 일치하는 파드 중 하나를 임의로 삭제한다.

레이블 불일치 오류

  • 만약 spec.selector.matchLabelsspec.template.metadata.labels 의 값이 다르면, ReplicaSet은 자신이 생성한 파드를 관리 대상으로 인식하지 못하게 된다.

  • 이 경우, 파드를 계속해서 생성하려고 시도하지만 관리 대상에는 포함되지 않아 무한 루프에 빠질 수 있다.

  • 따라서 쿠버네티스는 이러한 YAML 파일을 적용할 때 유효성 검사를 통해 에러를 발생시킨다.

외부에서 동일 레이블 파드 생성 시

  • 만약 ReplicaSet이 관리하는 레이블(app=sample-app)과 동일한 레이블을 가진 파드를 사용자가 직접 생성하면 어떻게 될까?

  • ReplicaSet은 이 파드 역시 자신의 관리 대상으로 인식한다. 따라서 전체 파드 수가 replicas를 초과하게 되므로, ReplicaSet은 관리 대상 파드 중 하나(직접 생성한 파드 또는 기존 파드)를 즉시 종료(Terminating)시켜 개수를 맞춘다.

4) ReplicaSet 스케일링

kubectl scale 명령어를 사용하거나 YAML 파일의 replicas 값을 수정한 후 kubectl apply 를 실행하여 파드의 수를 동적으로 조절(스케일링)할 수 있다.

  • kubectl scale 명령어를 이용한 스케일 아웃(Scale-out):
# sample-rs ReplicaSet이 관리하는 파드 수를 5개로 변경
kubectl scale replicaset sample-rs --replicas=5

명령 실행 후 파드 목록을 확인하면, 새로운 파드 2개가 추가로 생성되어 총 5개의 파드가 실행되는 것을 볼 수 있다.

5) 일치성 기준 조건 vs 집합성 기준 조건

ReplicationController와 ReplicaSet의 가장 큰 차이점은 파드를 선택하는 셀렉터의 기능이다.

  • 일치성 기준 (Equality-based) 셀렉터: ReplicationController에서 사용. app=sample-app 처럼 레이블의 키와 값이 정확히 일치하는 경우만 선택할 수 있다. (=, !=)

  • 집합성 기준 (Set-based) 셀렉터: ReplicaSet에서 사용. 일치성 기준 조건을 포함하며, 추가로 집합 연산을 사용할 수 있어 더 유연한 선택이 가능하다. (in, notin, exists)

    • 예시: env in (development, staging) -> env 레이블의 값이 development 또는 staging 인 모든 파드를 선택한다.

이러한 집합성 기준 셀렉터는 ReplicaSet 외에도 스케줄링 등 쿠버네티스의 여러 기능에서 활용된다.

0개의 댓글