레플리카셋
레플리카셋 (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이 더 선호돼요.