Kubernetes/Kubernetes Best Practices

[Scenario Playbook - 심화편 | Low Level #8] StatefulSet을 활용한 데이터 저장 및 복원 전략

ygtoken 2025. 3. 16. 18:54
728x90

 

쿠버네티스에서 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와 데이터를 유지

 

728x90