← 아티클 목록

Deployment vs StatefulSet 차이 — 언제 무엇을 쓰나

2028-05-08#kubernetes#deployment#statefulset

쿠버네티스로 앱을 띄울 때 거의 모두 Deployment로 시작합니다. 그러다 데이터베이스나 메시지 큐를 올리려 하면 "StatefulSet을 써야 한다"는 말을 듣고 멈칫합니다. 둘 다 Pod를 여러 개 굴리는 컨트롤러인데 뭐가 다른 걸까요. 핵심 차이는 단 하나, "각 Pod에 정체성이 필요한가" 입니다. 정체성이 필요 없으면 Deployment, 필요하면 StatefulSet입니다.

정체성이란 무엇인가

Deployment가 만든 Pod는 서로 구별되지 않는 일회용입니다. 이름이 web-7d9f-x2k1처럼 무작위 해시로 붙고, 죽으면 완전히 새 이름으로 다시 뜹니다. 누가 죽고 누가 살아나든 상관없습니다 — 모두 똑같은 stateless 일꾼이니까요.

StatefulSet은 정반대입니다. Pod에 db-0, db-1, db-2처럼 순번이 박힌 안정적인 이름을 줍니다. db-0이 죽으면 다시 db-0으로 살아나고, 자기 전용 스토리지를 그대로 다시 붙입니다. 정체성과 데이터가 유지되는 것입니다.

한눈에 보는 비교

항목DeploymentStatefulSet
Pod 이름무작위 해시순번 고정 (-0, -1)
스토리지보통 공유/임시Pod별 전용 PVC
기동·종료 순서순서 없음(동시)순서 보장(012)
교체 시새 정체성으로 대체같은 정체성 복구
대표 용도웹·API 서버DB, Kafka, ZooKeeper

언제 Deployment를 쓰나

상태를 Pod 안에 들고 있지 않은 거의 모든 앱입니다. 웹 서버, REST API, 프론트엔드처럼 "아무 Pod나 요청을 받아도 결과가 같은" 워크로드가 여기 해당합니다. 스케일 아웃·롤링 업데이트가 가장 단순합니다.

YAML
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web
spec:
  replicas: 3
  selector:
    matchLabels: { app: web }
  template:
    metadata:
      labels: { app: web }
    spec:
      containers:
        - name: web
          image: nginx:1.27

언제 StatefulSet을 쓰나

각 인스턴스가 고유한 데이터를 갖고, 그 데이터가 재시작 후에도 같은 인스턴스에 붙어야 할 때입니다. PostgreSQL 복제 세트, Kafka 브로커, Elasticsearch 노드가 전형적입니다. db-0은 항상 자기 디스크(data-db-0)를 다시 잡습니다.

YAML
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: db
spec:
  serviceName: db
  replicas: 3
  selector:
    matchLabels: { app: db }
  template:
    metadata:
      labels: { app: db }
    spec:
      containers:
        - name: db
          image: postgres:16
  volumeClaimTemplates:
    - metadata: { name: data }
      spec:
        accessModes: ["ReadWriteOnce"]
        resources:
          requests: { storage: 10Gi }

volumeClaimTemplates가 핵심입니다 — Pod마다 별도 PVC를 자동으로 만들어 정체성에 묶어 줍니다.

판단이 헷갈릴 땐 이렇게 자문하세요. "이 Pod가 죽었다가 다른 Pod로 대체돼도 괜찮은가?" 괜찮으면 Deployment, db-0이 꼭 db-0으로 돌아와야 하면 StatefulSet입니다. 참고로 replica가 < 2개인 단일 인스턴스라도, 안정적 이름과 전용 볼륨이 필요하면 StatefulSet이 맞습니다.

요점 정리

  • Deployment의 Pod는 익명·일회용, StatefulSet의 Pod는 이름·스토리지가 고정된 정체성을 가진다.
  • stateless 웹·API는 Deployment, 상태를 들고 있는 DB·큐는 StatefulSet.
  • StatefulSet은 순서대로 기동·종료하고 volumeClaimTemplates로 Pod별 전용 디스크를 준다.
  • "이 Pod가 다른 Pod로 대체돼도 되는가"가 판단의 기준이다.

Deployment와 StatefulSet을 직접 띄워 Pod 이름·스토리지가 어떻게 다른지 확인하는 실습은 쿠버네티스 트랙에서 할 수 있습니다 — 회원가입 없이 무료로.