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-0 → my-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을 삭제할 때는 데이터를 보존할 수 있도록 주의해야 함
'Kubernetes > Kubernetes Advanced' 카테고리의 다른 글
📌 [StatefulSet 심화편 #3] StatefulSet의 데이터 영속성과 Persistent Volume 관리 (0) | 2025.03.13 |
---|---|
📌 [StatefulSet 심화편 #2] StatefulSet의 Pod 네트워크와 DNS 관리 (0) | 2025.03.13 |
📌 [Deployment 심화편 #10] Deployment와 서비스 메시 (Istio, Linkerd)를 활용한 배포 제어 (0) | 2025.03.13 |
📌 [Deployment 심화편 #9] Deployment와 Feature Flag를 활용한 동적 배포 (0) | 2025.03.13 |
📌 [Deployment 심화편 #8] Deployment와 Multi-Cluster Deployment: 다중 클러스터 배포 전략 (0) | 2025.03.13 |