본문 바로가기
IT 개발/클라우드

[쿠버네티스] StatefulSet 완벽 가이드

by 이것 저것 모든것 2025. 2. 9.
728x90

1. StatefulSet 개요

StatefulSet은 상태를 가진 애플리케이션을 관리하기 위한 워크로드 API 객체입니다. 다음과 같은 특징을 제공합니다:

  • 안정적이고 고유한 네트워크 식별자
  • 안정적이고 영구적인 스토리지
  • 순차적인 배포와 스케일링
  • 자동 롤링 업데이트

2. 기본 StatefulSet 구성

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  serviceName: "nginx"
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: www
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 1Gi

3. StatefulSet의 주요 기능

3.1 안정적인 네트워크 식별자

apiVersion: v1
kind: Service
metadata:
  name: nginx-headless
spec:
  clusterIP: None
  selector:
    app: nginx
  ports:
  - port: 80

3.2 영구 스토리지

volumeClaimTemplates:
- metadata:
    name: data
  spec:
    accessModes: [ "ReadWriteOnce" ]
    storageClassName: "standard"
    resources:
      requests:
        storage: 1Gi
728x90

4. 실제 사용 사례

4.1 데이터베이스 클러스터

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mongodb
spec:
  serviceName: mongodb-service
  replicas: 3
  selector:
    matchLabels:
      app: mongodb
  template:
    metadata:
      labels:
        app: mongodb
    spec:
      containers:
      - name: mongodb
        image: mongo:4.4
        ports:
        - containerPort: 27017
        volumeMounts:
        - name: data
          mountPath: /data/db
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 10Gi

4.2 메시지 큐

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: kafka
spec:
  serviceName: kafka-service
  replicas: 3
  selector:
    matchLabels:
      app: kafka
  template:
    metadata:
      labels:
        app: kafka
    spec:
      containers:
      - name: kafka
        image: confluentinc/cp-kafka:latest
        ports:
        - containerPort: 9092
        volumeMounts:
        - name: data
          mountPath: /var/lib/kafka/data
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 20Gi

5. 스케일링과 업데이트

5.1 순차적 스케일링

spec:
  podManagementPolicy: OrderedReady
  updateStrategy:
    type: RollingUpdate

5.2 병렬 스케일링

spec:
  podManagementPolicy: Parallel

6. 백업과 복구

6.1 볼륨 스냅샷

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
  name: data-snapshot
spec:
  source:
    persistentVolumeClaimName: data-mongodb-0

7. 모니터링과 관리

7.1 상태 확인

spec:
  template:
    spec:
      containers:
      - name: app
        livenessProbe:
          httpGet:
            path: /health
            port: 8080
          initialDelaySeconds: 30
          periodSeconds: 10
        readinessProbe:
          httpGet:
            path: /ready
            port: 8080
          initialDelaySeconds: 5
          periodSeconds: 5

8. 베스트 프랙티스

  1. 적절한 스토리지 클래스 선택
  2. 백업 전략 수립
  3. 모니터링 설정
  4. 적절한 리소스 제한 설정
  5. 네트워크 정책 구성

9. 문제 해결

9.1 일반적인 문제

  • PVC 생성 실패
  • Pod 스케줄링 문제
  • 네트워크 연결 문제

9.2 디버깅 명령어

# Pod 상태 확인
kubectl get pods -l app=mongodb

# PVC 상태 확인
kubectl get pvc

# 이벤트 확인
kubectl get events

# Pod 로그 확인
kubectl logs mongodb-0
728x90