쿠버네티스에서 StatefulSet은 상태를 유지해야 하는 애플리케이션을 배포할 때 필수적인 리소스입니다.
Pod이 삭제되더라도 고유한 네트워크 ID와 데이터를 유지해야 하는 경우 StatefulSet을 활용해야 합니다.
이 글에서는 StatefulSet을 활용하여 데이터 저장 및 복원 전략을 적용하는 방법을 다룹니다.
📌 글에서 다루는 상황들
1. StatefulSet을 활용한 상태 저장 애플리케이션 배포
2. PersistentVolumeClaim(PVC)을 활용한 데이터 저장 및 유지
3. StatefulSet의 Pod 복구 및 데이터 보존 전략
각 문제를 실무에서 바로 활용할 수 있도록 Manifest 템플릿과 예상 결과 값을 제공합니다.
1️⃣ StatefulSet을 활용한 상태 저장 애플리케이션 배포
❓ 문제 상황
운영팀에서 각 Pod이 고유한 네트워크 ID(호스트 이름)를 가지면서도 상태를 유지해야 하는 애플리케이션을 배포해야 합니다.
StatefulSet을 활용하여 각 Pod에 고유한 이름을 부여하고, 재시작 시에도 동일한 이름을 유지해야 합니다.
• StatefulSet 이름: web-statefulset
• Pod 개수: 3개
• 네트워크 ID 유지 필요 (web-0, web-1, web-2)
✅ 어떻게 해결할 수 있을까요?
🛠️ 해결 방법
1. StatefulSet을 생성하고, Pod이 고유한 이름을 가지도록 설정합니다.
2. kubectl을 사용하여 StatefulSet의 동작을 확인합니다.
✅ 정답 Manifest (StatefulSet 생성)
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web-statefulset
spec:
serviceName: "web" # 헤드리스 서비스 (고유한 네트워크 ID 유지)
replicas: 3 # 3개의 Pod 생성
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: web-container
image: nginx
ports:
- containerPort: 80
📌 적용 후 예상 결과 값
1. StatefulSet이 정상적으로 생성되었는지 확인
kubectl get statefulset
💡 예상 출력 값
NAME READY AGE
web-statefulset 3/3 5s
2. Pod 목록 확인 (고유한 네트워크 ID 유지)
kubectl get pods -l app=web
💡 예상 출력 값
NAME READY STATUS RESTARTS AGE
web-0 1/1 Running 0 5s
web-1 1/1 Running 0 5s
web-2 1/1 Running 0 5s
2️⃣ PersistentVolumeClaim(PVC)을 활용한 데이터 저장 및 유지
❓ 문제 상황
운영팀에서 각 StatefulSet Pod이 독립적인 스토리지를 유지하도록 설정해야 합니다.
Pod이 삭제되거나 재시작되더라도 저장된 데이터가 유지되어야 합니다.
• PersistentVolumeClaim(PVC)을 생성하여 각 Pod이 고유한 스토리지를 사용하도록 설정
• 데이터 저장 디렉터리: /usr/share/nginx/html
✅ 어떻게 해결할 수 있을까요?
🛠️ 해결 방법
1. PersistentVolumeClaim(PVC)를 설정하여 각 Pod이 독립적인 스토리지를 가질 수 있도록 합니다.
2. StatefulSet과 PVC를 연결하여 데이터를 유지합니다.
✅ 정답 Manifest (StatefulSet + PVC 설정)
🔹 PersistentVolumeClaim 정의
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: web-pvc
spec:
accessModes:
- ReadWriteOnce # 단일 노드에서 읽기/쓰기 가능
resources:
requests:
storage: 1Gi # 1GB 크기의 볼륨 요청
🔹 StatefulSet에서 PVC 적용
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web-statefulset
spec:
serviceName: "web"
replicas: 3
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: web-container
image: nginx
volumeMounts:
- name: web-storage
mountPath: /usr/share/nginx/html # 데이터를 저장할 경로
volumeClaimTemplates:
- metadata:
name: web-storage
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 1Gi
📌 적용 후 예상 결과 값
1. PVC가 생성되었는지 확인
kubectl get pvc
💡 예상 출력 값
NAME STATUS VOLUME CAPACITY ACCESS MODES AGE
web-storage-web-0 Bound pvc-xyz 1Gi RWO 5s
web-storage-web-1 Bound pvc-abc 1Gi RWO 5s
web-storage-web-2 Bound pvc-def 1Gi RWO 5s
3️⃣ StatefulSet의 Pod 복구 및 데이터 보존 전략
❓ 문제 상황
운영팀에서 StatefulSet Pod이 삭제되거나 재시작될 경우, 기존 데이터를 유지할 수 있도록 복구 전략을 설정해야 합니다.
• Pod이 삭제되더라도 같은 PVC를 사용해야 함
• Pod이 다시 생성되면 동일한 네트워크 ID 및 데이터를 유지해야 함
✅ 어떻게 해결할 수 있을까요?
🛠️ 해결 방법
1. StatefulSet의 Pod을 삭제한 후, 기존 PVC가 유지되는지 확인합니다.
2. kubectl get pvc 명령어로 기존 볼륨이 유지되는지 확인합니다.
✅ StatefulSet Pod 삭제 및 복구 확인
🔹 특정 Pod 삭제
kubectl delete pod web-1
💡 예상 출력 값
pod "web-1" deleted
🔹 Pod 재생성 후 데이터 유지 확인
kubectl get pods -l app=web
💡 예상 출력 값
NAME READY STATUS RESTARTS AGE
web-0 1/1 Running 0 10m
web-1 1/1 Running 0 5s # 새로 생성됨
web-2 1/1 Running 0 10m
🔹 PVC 유지 여부 확인
kubectl get pvc
💡 예상 출력 값
NAME STATUS VOLUME CAPACITY ACCESS MODES AGE
web-storage-web-0 Bound pvc-xyz 1Gi RWO 10m
web-storage-web-1 Bound pvc-abc 1Gi RWO 10m
web-storage-web-2 Bound pvc-def 1Gi RWO 10m
✅ Pod이 삭제되더라도 기존 PVC가 유지되며, 동일한 네트워크 ID와 데이터를 유지