IT용어위키


쿠버네티스 스테이트풀셋

StatefulSet은 쿠버네티스에서 상태(stateful)를 지닌 애플리케이션을 배포하고 관리하기 위한 워크로드 API 오브젝트이다.

개요

StatefulSet은 데이터베이스, 메시지 큐, 분산 저장 시스템과 같이 각 인스턴스가 고유한 식별자, 안정된 네트워크 ID, 또는 지속성 있는 스토리지를 필요로 하는 애플리케이션을 위해 설계되었다. StatefulSet을 사용하면, 파드(Pod)가 다시 생성되더라도 이름(hostname), 네트워크 ID, 연결된 스토리지 등이 동일하게 유지되므로 상태 유지가 필요한 워크로드를 안정적으로 운영할 수 있다.

주요 특징

  • 각 파드는 고유하고 안정적인 정체성(identity)을 가진다 — 예: name-0, name-1, …
  • 파드당 고유한 스토리지(PersistentVolume)를 가질 수 있다. 각 파드는 자신의 영속 볼륨(PV/PVC)을 갖도록 설정 가능
  • 파드 생성 및 종료, 스케일링, 업데이트가 순서(order)를 보장하며 이루어진다. 예: 먼저 0이 생성되고, 그 다음 1, … 순서. 스케일 다운 시에도 역순으로 제거
  • 헤드리스 서비스(headless Service)를 함께 사용하면, 각 파드가 고유한 DNS 이름을 가지며 직접 접근 가능 — 파드 간 통신이나 데이터베이스 클러스터 구성에 유리

언제 StatefulSet을 사용해야 하나

StatefulSet은 다음과 같은 요건이 있는 애플리케이션에 적합하다:

  • 각 인스턴스에 고유한 신원(identity) 또는 네트워크 명칭이 필요할 때
  • 인스턴스별로 고유한 영속 스토리지를 사용해야 할 때
  • 시작 순서, 종료 순서, 업데이트 순서에 제약이 있을 때 (예: 데이터베이스 클러스터, 리더/팔로워 구조)

예: StatefulSet 매니페스트

다음은 간단한 StatefulSet 설정 예시이다:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  serviceName: "web-headless"
  replicas: 3
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
      - name: web
        image: nginx
        ports:
        - containerPort: 80
  volumeClaimTemplates:
  - metadata:
      name: web-data
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 1Gi

이 매니페스트에 따라 쿠버네티스는 web-0, web-1, web-2 라는 이름의 파드를 생성하고, 각 파드는 자체 PVC를 갖게 된다.

StatefulSet vs Deployment / ReplicaSet

StatefulSet은 상태가 없는(stateless) 애플리케이션을 위한 Deployment 또는 ReplicaSet 과는 구분된다. 주요 차이는 다음과 같다:

항목 Deployment/ReplicaSet StatefulSet
파드 이름 및 신원 (Identity) 무작위 해시가 포함된 이름, 파드 간 구분 없음 순서가 있는 고유 이름 (예: name-0, name-1 …), 신원 고정
스토리지 공유 또는 일시적 볼륨 / 외부 스토리지 필요 파드당 전용 영속 볼륨(PVC) 사용 가능
생성/종료/스케일링 순서 순서 없음 — 병렬 수행 가능 순차적 생성 및 종료, 순서 보장
네트워크 / DNS ID 파드 간 구분 없음 — 서비스 로드밸런싱 중심 헤드리스 서비스 + DNS를 통해 파드별 고유한 hostname 확보

따라서, 상태를 유지하지 않는(stateless) 웹 서버, API 서버 등은 Deployment가 적합하며, 데이터베이스, 메시지 큐, 분산 저장 시스템처럼 상태 유지(stateful)가 중요한 경우 StatefulSet이 적합하다.

주의 사항 및 한계

  • StatefulSet 사용 시에는 PersistentVolume / PersistentVolumeClaim 설정이 필요하거나, StorageClass를 통해 동적 프로비저닝이 가능해야 한다.
  • 모든 파드가 동시에 업데이트되지는 않기 때문에, 롤링 업데이트 속도가 상대적으로 느릴 수 있다.
  • 애플리케이션이 실제로 상태 유지나 고유 신원이 필요하지 않는데 StatefulSet을 쓰는 것은 과도한 설계일 수 있다.

같이 보기


  출처: IT위키 (IT위키에서 최신 문서 보기)

  * 본 페이지는 IT Wiki에서 미러링된 페이지입니다. 일부 오류나 표현의 누락이 있을 수 있습니다. 원본 문서는 IT Wiki에서 확인하세요!