🤔 StatefulSet이란?
StatefulSet은 이름 그대로 상태를 가진(stateful) 애플리케이션을 위한 전문 컨트롤러입니다. Deployment와 달리, StatefulSet이 관리하는 각 Pod는 자신만의 고유한 정체성을 가집니다.
이를 위해 각 Pod에 고유한 이름, 고정된 네트워크 ID, 그리고 안정적인 스토리지 볼륨을 부여하여 순서 있는 배포, 종료, 재시작을 보장합니다.
✅ 핵심 키워드: 고유성, 순서 보장, 영속 저장소
🔄 Deployment와의 결정적인 차이
StatefulSet을 이해하는 가장 좋은 방법은 Deployment와 비교하는 것입니다. 두 컨트롤러는 목적 자체가 완전히 다릅니다.
항목 | Deployment (Stateless) | StatefulSet (Stateful) |
---|---|---|
Pod 이름 | 무작위 (e.g., pod-abc123 ) | 고정 및 순서 보장 (e.g., my-db-0 , my-db-1 ) |
네트워크 ID | 동적으로 변경됨 | 각 Pod에 고정된 DNS 이름 부여 |
스토리지 (PVC) | 공유 가능, Pod 삭제 시 제거 가능 | Pod마다 고유 PVC, Pod 재생성 시에도 유지 |
배포/종료 순서 | 동시에, 무작위로 가능 | 순차적 (생성: 0 → 1 → 2, 삭제: 2 → 1 → 0) |
Deployment의 Pod들은 모두 똑같은 ‘익명의 일꾼’이지만, StatefulSet의 Pod들은 각자 이름과 집(스토리지)을 가진 ‘지정된 전문가’라고 생각할 수 있습니다.
🧪 StatefulSet 예시 YAML
고유한 스토리지를 가진 PostgreSQL 인스턴스 3개를 배포하는 StatefulSet YAML을 살펴봅시다.
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: my-db
spec:
serviceName: "my-db" # Headless Service 이름
replicas: 3
selector:
matchLabels:
app: my-db
template:
# Pod 템플릿은 Deployment와 유사
metadata:
labels:
app: my-db
spec:
containers:
- name: postgres
image: postgres:15
volumeMounts:
- name: data
mountPath: /var/lib/postgresql/data
# 이 부분이 StatefulSet의 핵심!
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 10Gi
📌 위 YAML 스펙의 의미:
replicas: 3
: 총 3개의 PostgreSQL 인스턴스를 배포합니다.- 배포 순서:
my-db-0
Pod가 먼저 생성되고, 정상 실행되면my-db-1
이, 그다음my-db-2
가 순차적으로 배포됩니다. - 고유한 이름: Pod들은
my-db-0
,my-db-1
,my-db-2
라는 예측 가능한 고정 이름을 갖습니다. - 고유한 스토리지:
volumeClaimTemplates
에 따라 각 Pod는data-my-db-0
,data-my-db-1
,data-my-db-2
와 같은 고유한 PersistentVolumeClaim(PVC)을 자동으로 할당받습니다.my-db-0
Pod가 재시작되어도data-my-db-0
PVC에 다시 연결되어 데이터를 그대로 유지합니다.
🧩 주요 특징 요약
- 고유한 정체성: 각 Pod는 고유한 이름과 안정적인 스토리지를 가집니다.
- 데이터 영속성: Pod가 재시작되거나 다른 노드로 옮겨가도, 자신의 데이터를 담은 PVC를 그대로 다시 사용합니다.
- 순서 보장: Kafka, Zookeeper, MongoDB, etcd 등 클러스터링 구성 시 순서 보장이 필수적인 시스템에 적합합니다.
- 고정 네트워크 ID: Headless Service와 함께 사용되어
my-db-0.my-db.default.svc.cluster.local
과 같은 고정된 DNS 주소를 각 Pod에 제공하여, Pod 간의 안정적인 통신을 가능하게 합니다.
✅ 개발자 관점 요약
• StatefulSet은 상태가 있는 애플리케이션을 쿠버네티스에서 운영하기 위한 필수 컨트롤러입니다.
• 각 Pod는 독립적인 정체성(이름, 네트워크, 스토리지)을 가지며, Pod가 사라져도 데이터는 PVC에 안전하게 보존됩니다.
• 리더 선출(Leader Election), 쿼럼(Quorum) 형성 등 동시에 실행되면 안 되는 서비스나 순서가 중요한 분산 시스템에 반드시 사용해야 합니다.
• 무작위로 스케일되는 Deployment와는 목적과 동작 방식이 완전히 다릅니다.
만약 여러분이 데이터베이스, 메시지 큐, 분산 스토리지 시스템을 쿠버네티스에 올릴 계획이라면, Deployment가 아닌 StatefulSet을 가장 먼저 고려해야 합니다. 이것이 안정적인 Stateful 서비스 운영의 첫걸음입니다.