StatefulSet과 Deployment 비교

799 단어·2 분·원문(.md)

항목DeploymentStatefulSet
기본 목적무상태(Stateless) 애플리케이션유상태(Stateful) 애플리케이션
대표 사용처웹 서버, API 서버, 배치 워커DB, Kafka, Redis, ZooKeeper

Pod 정체성 #

Deployment는 모든 파드는 동일한 존재이며 이름은 랜덤이고 서로를 교체해도 의미 차이가 없다.

하지만 StatefulSet은 파드마다 고유하고 고정된 정체성에 이름도 유지(재시작해도 동일) 클러스터 구성에 매우 중요하다.

스토리지 #

Deployment는 PVC를 쓰더라도 Pod와 1:1 보장이 되지 않고 Pod 재생성시에 다른 볼륨이 붙을 수 있다. 데이터 정합성 책임은 애플리케이션에 있고.

StatefulSet은 Pod마다 전용 PVC가 존재하며 파드 삭제후 재생성시 같은 볼륨을 재사용해 데이터 안정성을 확보한다.

스케일링 방식 #

Deployment는 병렬 스케일링에 빠르고 순서 개념이 없다.

StatefulSet은 순차적으로 db-0 1 2 순으로 생성 종료는 2 1 0 처럼 진행한다. 클러스터 안정성을 우선시함

항목DeploymentStatefulSet
Rolling Update기본지원
업데이트 순서무작위 Pod 단위Pod 번호 순서 보장
파괴적 업데이트 위험낮음잘못하면 클러스터 붕괴

네트워크 #

Deployment는 일반 Service를 사용하며 pod ip 변경을 신경쓰지 않는다.

StatefulSet은 Headless Service 필수고 Pod마다 고정 DNS ex. db-0.db.default.svc.cluster.local를 제공한다. 노드간 직접 통신이 필요한 시스템에 필수다

장애 복구 관점 #

Deployment에서 파드 장애가 나면 다른 파드로 대체하고 요청 단위 복원에 최적이지만

StatefulSet은 파드 장애가 나면 같은 파드번호 + 같은 볼륨으로 복구해야한다. 데이터 일관성 유지

Deployment를 써야하는 경우는

  • Stateless API Server
  • Traffic 대응이 중요
  • 파드간 구분 의미 없음
  • 빠른 롤링 배포 등

StatefulSet의 경우에는

  • 데이터가 로컬 디스크에 있어야함
  • pod 순서 / 이름이 중요
  • master-follwer 구조
  • 노드 간 직접 통신이 필요할때

Deployment = 트래픽 처리용
StatefulSet = 데이터 보존용

으로 요약할 수 있겠다.

SRE/question/q_11.md