Kubernetes/Kubernetes Advanced

📌 [StatefulSet 심화편 #1] StatefulSet의 개념과 Deployment와의 차이점

ygtoken 2025. 3. 13. 10:53
728x90

 

1️⃣ 개요

 

쿠버네티스에서 데이터를 저장하는 애플리케이션(예: 데이터베이스, 메시지 브로커, 캐시 시스템 등)Pod가 삭제되거나 재시작되더라도 동일한 데이터와 네트워크 ID를 유지해야 합니다.

이러한 경우 StatefulSet을 사용해야 합니다.

 

이번 글에서는 StatefulSet의 개념과 Deployment와의 차이점, 그리고 StatefulSet이 필요한 상황을 정리하겠습니다. 🚀

 


2️⃣ StatefulSet이란?

 

✅ 1. StatefulSet의 개념

StatefulSet은 상태를 유지해야 하는 애플리케이션을 관리하는 컨트롤러

Pod가 재시작되더라도 고유한 네트워크 ID와 볼륨을 유지

Persistent Volume (PV)과 연계하여 데이터가 보존되도록 설정 가능

 

📌 StatefulSet이 필요한 경우

데이터베이스(MySQL, PostgreSQL, MongoDB 등)

메시지 브로커(RabbitMQ, Kafka 등)

캐시 시스템(Redis, Memcached 등)

고유한 네트워크 ID를 유지해야 하는 애플리케이션

 

StatefulSet은 Pod의 개별 ID를 유지하며, Pod 간 순서를 보장합니다.

 


✅ 2. StatefulSet vs Deployment 비교

 

📌 StatefulSet vs Deployment 주요 차이점

 

특징 Deployment StatefulSet
Pod 이름 무작위 (my-app-xyz12) 순차적 (my-app-0, my-app-1)
Pod 종료 및 시작 순서 순서 보장 안 됨 순서 보장됨 (my-app-0my-app-1)
Persistent Volume 새 Pod가 생성되면 새로운 볼륨 연결 각 Pod에 고유한 볼륨 연결
네트워크 ID Pod 간 고유한 도메인 없음 Pod별로 고유한 도메인 유지 (my-app-0.my-service)

StatefulSet은 네트워크 ID와 볼륨을 유지하는 것이 필요할 때 사용됩니다.

 


3️⃣ StatefulSet 기본 설정과 생성 방법

 

✅ 1. StatefulSet 기본 구성 요소

 

StatefulSet을 생성하려면 다음과 같은 리소스가 필요합니다.

StatefulSet 리소스: 상태를 유지해야 하는 Pod 관리

Headless Service: 각 Pod에 개별적인 DNS 주소 제공

Persistent Volume: 데이터 저장소 제공

 


✅ 2. StatefulSet 생성 예제

 

📌 StatefulSet YAML 예제 (3개의 Redis Pod 실행)

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: redis
spec:
  serviceName: redis
  replicas: 3
  selector:
    matchLabels:
      app: redis
  template:
    metadata:
      labels:
        app: redis
    spec:
      containers:
        - name: redis
          image: redis:latest
          volumeMounts:
            - name: redis-data
              mountPath: /data
  volumeClaimTemplates:
    - metadata:
        name: redis-data
      spec:
        accessModes: ["ReadWriteOnce"]
        resources:
          requests:
            storage: 1Gi

 

📌 StatefulSet 배포

kubectl apply -f statefulset.yaml

 

📌 StatefulSet 확인

kubectl get statefulset

 

📌 각 Pod의 네트워크 주소 확인

kubectl get pods -o wide

StatefulSet의 Pod는 redis-0, redis-1, redis-2와 같이 순차적으로 생성됩니다.

 


4️⃣ StatefulSet 운영 시 고려해야 할 점

 

✅ 1. Headless Service를 반드시 사용해야 함

StatefulSet의 Pod는 개별적인 DNS 주소가 필요하므로, 일반적인 Service가 아니라 Headless Service를 사용해야 합니다.

 

📌 Headless Service 예제

apiVersion: v1
kind: Service
metadata:
  name: redis
spec:
  clusterIP: None  # Headless Service 설정
  selector:
    app: redis
  ports:
    - port: 6379

이 설정을 사용하면 각 Pod는 redis-0.redis, redis-1.redis 같은 고유한 DNS를 갖게 됩니다.

 


✅ 2. Persistent Volume이 삭제되지 않도록 주의해야 함

 

StatefulSet을 삭제하면 Pod는 사라지지만 Persistent Volume은 남아 있습니다.

이때 PV를 삭제하지 않고 보존해야 데이터가 유지됩니다.

 

📌 StatefulSet 삭제 (PV 유지)

kubectl delete statefulset redis --cascade=orphan

이렇게 하면 StatefulSet만 삭제되고, 데이터는 유지됩니다.

 


🔥 5️⃣ 결론

 

StatefulSet은 네트워크 ID와 볼륨을 유지해야 하는 애플리케이션에 사용됨

Deployment와 다르게 Pod의 이름과 순서를 보장하며, 개별적인 DNS를 유지함

Persistent Volume과 Headless Service를 반드시 함께 사용해야 함

StatefulSet을 삭제할 때는 데이터를 보존할 수 있도록 주의해야 함

728x90