[개발자 관점] 주요 Kubernetes 컨트롤러 종류 – 3. StatefulSet

33 sec read

🤔 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 서비스 운영의 첫걸음입니다.

쿠버네티스 시크릿 관리, 어떤 방법이 최선일까? 4가지 방식 장단점…

쿠버네티스에서 애플리케이션을 운영할 때, DB 접속 정보나 API 키 같은 민감한 정보, 즉 ‘시크릿(Secret)’을 어떻게 관리해야 할지는 모두의 공통된 고민입니다. 관리 방식은 보안, 운영...
eve
13 sec read

[MSA] Spring Cloud Gateway VS Apache APISIX : 단계별…

마이크로서비스 아키텍처(MSA)에서 API 게이트웨이는 시스템의 관문 역할을 하는 핵심 컴포넌트입니다. 수많은 Java 개발팀이 Spring 생태계와의 완벽한 통합성을 자랑하는 Spring Cloud Gateway를 선택해왔습니다. 그러나 시스템이...
eve
1 min read

[Kafka] 카프카의 심장: 토픽, 파티션, 프로듀서, 컨슈머 완벽 해부

Apache Kafka가 어떻게 대용량 데이터를 실시간으로, 그리고 안정적으로 처리할 수 있는지 궁금하신가요? 그 비밀은 Kafka를 구성하는 핵심 요소들의 유기적인 협력에 있습니다. Kafka는 마치 잘...
eve
1 min read