[쿠버네티스 패턴] 12장 스테이트풀 서비스

bocopile·2025년 10월 10일

쿠버네티스 패턴

목록 보기
9/28

1. 스테이트풀 서비스란?

  • 스테이트리스 앱: 모든 요청을 어디서 처리해도 결과가 동일 (예: 웹 서버, API 서버)
  • 스테이트풀 앱: 각 인스턴스가 고유한 상태(state)와 데이터를 유지해야 함 (예: MySQL, Redis, Kafka)

쿠버네티스에서 스테이트풀 서비스를 다룰 때 가장 큰 문제는 다음과 같습니다:

  1. 네트워크 아이덴티티

    파드가 재시작되더라도 동일한 이름/주소를 가져야 클러스터 내에서 안정적으로 통신 가능.

  2. 스토리지 지속성

    파드가 죽더라도 데이터가 유지되어야 하므로, 파드와 분리된 퍼시스턴트 볼륨(Persistent Volume, PV) 필요.

2. StatefulSet: 스테이트풀 서비스 핵심

쿠버네티스에서 스테이트풀 워크로드를 다룰 때 사용하는 기본 컨트롤러가 StatefulSet입니다.

StatefulSet의 특징

  • 고정된 파드 네임: mysql-0, mysql-1, mysql-2처럼 순번이 부여됨.
  • 순차적 배포/종료: Pod는 순서대로 생성되고 삭제됨.
  • 고정된 네트워크 ID: Headless Service와 함께 사용하여 각 Pod가 고유 DNS 이름을 가짐.
  • 퍼시스턴트 스토리지: VolumeClaimTemplate을 통해 각 Pod에 독립적인 PVC가 생성됨.

3. 주요 컴포넌트

(1) Headless Service

  • 클러스터 IP를 부여하지 않고, 각 파드의 DNS를 직접 반환.
  • 예: mysql-0.mysql.default.svc.cluster.local
    apiVersion: v1
    kind: Service
    metadata:
      name: mysql
    spec:
      clusterIP: None   # Headless Service
      selector:
        app: mysql
      ports:
      - port: 3306
        name: mysql

(2) StatefulSet

  • 스테이트풀 서비스의 본체
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: mysql
    spec:
      serviceName: mysql
      replicas: 3
      selector:
        matchLabels:
          app: mysql
      template:
        metadata:
          labels:
            app: mysql
        spec:
          containers:
          - name: mysql
            image: mysql:8.0
            ports:
            - containerPort: 3306
            volumeMounts:
            - name: data
              mountPath: /var/lib/mysql
      volumeClaimTemplates:
      - metadata:
          name: data
        spec:
          accessModes: ["ReadWriteOnce"]
          resources:
            requests:
              storage: 10Gi

여기서 volumeClaimTemplates는 각 파드별로 PVC를 자동 생성하여 데이터를 보존합니다.

4. 스테이트풀 서비스 예시: MySQL 클러스터

  1. Headless Service 생성 → mysql-0, mysql-1, mysql-2 DNS 자동 할당.
  2. StatefulSet 배포 → 각 파드가 고유한 PVC를 가져서 데이터 보존.
  3. Pod 순서 보장 → mysql-0이 먼저 실행된 뒤, 그다음 mysql-1 실행.

이를 통해 단순한 DB뿐 아니라 ZooKeeper, Kafka, Redis Sentinel 같은 분산 시스템도 쿠버네티스에서 안정적으로 운영할 수 있습니다.

5. 운영 시 고려사항

  • 스토리지 클래스: 퍼시스턴트 볼륨 프로비저닝 정책(예: SSD, HDD)을 잘 선택해야 함.
  • 백업/복구 전략: PV에 의존하기 때문에 스토리지 레벨의 백업 필요.
  • 스케일링: StatefulSet은 수평 확장이 가능하지만, 데이터 일관성/샤딩 고려가 필요.
  • 롤링 업데이트: 순차적으로 파드를 교체하므로, DB 마이그레이션 같은 과정과 잘 맞물려야 함.

6. 내용 보강

쿠버네티스 v1.34 기준으로 StatefulSet 및 스테이트풀 서비스 운영 시 고려해야 할 추가적인 보강점과 한계는 다음과 같습니다.

한계점

  1. PVC 누수 문제

    StatefulSet을 삭제해도 PVC는 기본적으로 남아 있습니다. 이는 데이터 보호 차원에서는 안전하지만, 관리자가 직접 삭제하지 않으면 스토리지 리소스 누수가 발생할 수 있습니다.

  2. 스토리지 확장/재할당의 어려움

    StatefulSet이 관리하는 PVC는 자동 확장 및 재할당이 까다롭습니다. 대규모 데이터베이스 환경에서는 스토리지 확장이 수동 개입을 필요로 하며, 운영 복잡도가 올라갑니다.

  3. 라이브 마이그레이션 부재

    파드를 상태 유지한 채 다른 노드로 옮기는 live migration 기능은 여전히 제공되지 않습니다. 따라서 노드 장애나 리밸런싱 시 다운타임이 발생할 수 있습니다.

  4. Pod 순서 보장 한계

    StatefulSet은 파드의 순차 실행/종료를 보장하지만, 데이터 마이그레이션 로직이나 복잡한 동기화 작업이 필요한 경우에는 유연성이 부족합니다.

보강 방향

  1. Operator 도입

    MySQL, Kafka, Redis와 같은 스테이트풀 서비스는 전용 Operator를 사용하면 스케일링, 백업, 장애 복구 자동화가 가능해 운영 효율성이 크게 향상됩니다.

  2. 스토리지 전략 강화

    • 스토리지 클래스(StorageClass) 정책을 서비스 특성에 맞게 선택
    • 볼륨 스냅샷/복제/멀티 존 복제 활용
    • 데이터 복제 전략(DB 레플리카, 로그 복제 등) 병행
  3. 백업 및 복구 체계 확립

    PV 수준 백업과 애플리케이션 레벨 백업을 동시에 운영해야 안정성이 확보됩니다. 특히 장애 복구 시 PVC와 Pod 순서를 보장하는 전략이 필요합니다.

  4. 롤링 업데이트/마이그레이션 전략 개선

    단순히 순차적 교체만으로는 부족하므로, 데이터 변환 로직이나 복제 전략을 업데이트 과정에 통합해야 합니다.

  5. 모니터링 및 알림 체계 강화

    스테이트풀 서비스는 CPU/메모리뿐 아니라 I/O 패턴, 지연 시간, 스토리지 사용량을 세밀히 모니터링해야 합니다. OpenTelemetry, Prometheus, Grafana 등을 연동하는 것이 권장됩니다.

  6. 커뮤니티 기능 추적 및 실험적 기능 활용

    StatefulSet 개선을 위한 KEP(쿠버네티스 개선 제안)과 SIG 활동을 꾸준히 추적하여, 차세대 기능(live migration, 더 정교한 볼륨 재배치 등)에 대비하는 것이 필요합니다.

profile
DevOps Engineer

5개의 댓글

comment-user-thumbnail
2025년 10월 12일

안녕하세요 작성해주신 글 잘 읽었습니다. 보강 방향에서 작성해 주신 내용 중에서 4번 롤링 업데이트/마이그레이션 전략 개선 같은 경우 Kubernetes의 기능을 활용한 방식이 아닌 어플리케이션 설계 시 고려하거나 외부 툴 등을 활용한 방식으로 이해하고 있는데 맞을까요? 아니면 혹시 다른 방식을 의미하는 것인지 여쭤보고자 합니다.

1개의 답글
comment-user-thumbnail
2025년 10월 12일

안녕하세요~작성해주신 글 잘 읽었습니다. 위 내용과 실무적으로 몇 가지 질문이 있습니다.

Q1. StatefulSet에서 특정 Pod(예: mysql-1)만 장애가 발생했을 때, 순서 보장 때문에 복구가 지연되는 문제는 어떻게 해결하나요?
Q2. StatefulSet의 롤링 업데이트 중 데이터 마이그레이션이 필요한 경우(예: 스키마 변경) 어떤 전략을 사용 하시나요?
Q3. 백업/복구 체계에서 "Application-Consistent Backup"과 "Crash-Consistent Backup"의 차이를 실무에서 어떻게 구현하시나요? RPO 0를 달성하려면 어떻게 하시나요??

1개의 답글
comment-user-thumbnail
2025년 10월 12일

안녕하세요~ 작성해신 글 잘 읽었습니다.

StatefulSet 정의에서 spec.PodManagementPolicy: Parallel 설정을 통해 pod 생성시의 순서제약을 해제하고 병렬 업데이트가 가능한 것으로 이해했습니다. 그런데 spec.updateStrategy.type: RollingUpdate가 함께 설정되어 있다면 애플리케이션 업데이트 시에 어떻게 동작하는지 궁금합니다.

그리고 두 필드 모두, 배포 시 pod 관리전략과 관련한 필드인 것으로 보이는데 어떤 차이가 있는지 궁금합니다.

답글 달기