StatefulSet 프로젝트

발행: (2026년 1월 19일 오전 06:05 GMT+9)
3 min read
원문: Dev.to

Source: Dev.to

Prerequisites

StatefulSet을 사용하려면 다음 구성 요소가 필요합니다:

  • Headless Service – 각 pod에 안정적인 DNS를 제공합니다.
  • StatefulSet manifest – pod와 그 정체성을 정의합니다.
  • PersistentVolume / StorageClass – 일반적으로 클러스터에 이미 존재합니다.

이 요소가 없으면 StatefulSet이 올바르게 동작하지 않습니다.

Headless Service

apiVersion: v1
kind: Service
metadata:
  name: mysql-headless
spec:
  clusterIP: None        # <- makes the service headless
  selector:
    app: mysql
  ports:
    - port: 3306

서비스를 적용합니다:

kubectl apply -f service.yaml

왜 중요한가

  • 로드 밸런싱이 없으며, 각 pod마다 고유한 DNS 엔트리가 생성됩니다.
  • 데이터베이스 및 클러스터링 시나리오에 필수적입니다.

StatefulSet Manifest

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql
spec:
  serviceName: mysql-headless   # MUST match the headless service name
  replicas: 3
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
        - name: mysql
          image: mysql:8.0
          ports:
            - containerPort: 3306
          env:
            - name: MYSQL_ROOT_PASSWORD
              value: root
          volumeMounts:
            - name: data
              mountPath: /var/lib/mysql
  volumeClaimTemplates:
    - metadata:
        name: data
      spec:
        accessModes: ["ReadWriteOnce"]
        resources:
          requests:
            storage: 5Gi

StatefulSet을 적용합니다:

kubectl apply -f statefulset.yaml

Verifying the Deployment

Pod 목록을 확인합니다:

kubectl get pods

다음과 같은 결과가 나타납니다:

mysql-0
mysql-1
mysql-2

PersistentVolumeClaim 목록을 확인합니다:

kubectl get pvc

다음과 같은 결과가 나타납니다:

data-mysql-0
data-mysql-1
data-mysql-2

Pod에 접속하기

kubectl exec -it mysql-0 -- bash

Pod 내부에서 DNS 해석을 테스트할 수 있습니다:

ping mysql-1.mysql-headless
ping mysql-2.mysql-headless

각 pod은 자체적인 안정적인 호스트명을 가집니다.

Scaling the StatefulSet

kubectl scale statefulset mysql --replicas=4

무슨 일이 일어나는가

  • mysql-2 뒤에 새로운 pod mysql-3이 생성됩니다.
  • 새로운 PVC data-mysql-3이 프로비저닝됩니다.
  • 데이터 손실이 없으며, pod는 안정적인 이름, DNS 및 스토리지를 유지합니다.
  • pod는 순차적으로 시작·중지되며, 이는 많은 상태 저장 애플리케이션에 필수적입니다.

Use Cases

StatefulSet은 안정적인 정체성과 영구 스토리지가 필요한 워크로드에 이상적이며, 예시로는 다음과 같습니다:

  • MySQL / PostgreSQL
  • MongoDB
  • Kafka
  • ZooKeeper
  • Elasticsearch

StatefulSet은 안정적인 정체성, DNS 및 영구 스토리지를 갖는 pod를 생성합니다. 이는 데이터베이스와 같은 상태 저장 워크로드에 필수적입니다.

Back to Blog

관련 글

더 보기 »