티스토리 뷰

k8s

쿠버네티스) StatefulSet에 대해

산도리 2025. 1. 22. 15:07

What is StatefulSet?

💡“상태”가 있는 애플리케이션을 관리하기 위해 사용되는 리소스

  • 각 Pod는 고유한 네트워크 ID와 스토리지 볼륨을 가지며, 삭제 후에도 이를 보존

What is Deployment?

💡“상태”가 없는 애플리케이션을 관리하기 위해 사용되는 리소스

  • Pod는 서로 동일하며, 상태 정보는 Pod 간에 공유되지 않는다

StatefulSet vs Deployment?

특성 StatefulSet Deployment

목적 상태가 있는 애플리케이션 관리 상태가 없는 애플리케이션 관리
Pod 이름 고유하며 순서 보장 랜덤 생성
스토리지 고유한 영구 스토리지 보존(예. pvc) 영구 스토리지 없음
업데이트 방식 롤링 업데이트 병렬 업데이트 가능
네트워크 고유한 이름 제공 로드밸런서를 통한 접근
주요 사용 사례 데이터베이스, 분산 시스템 웹 서버, api 서버

StatefulSet이 필요한 상황?

  • 분산 시스템 (Kafka, Zookeeper)
    • Apache Kafka
      • 분산 메시지 시스템으로, 데이터의 일관성과 순서를 보장하기 위해 상태 정보가 중요
      • 파티션 및 리더-팔로워 관계
        • 토픽은 여러 파티션으로 나뉘고, 각 파티션엔 리더 - 팔로워 (1:N) 존재
        • 리더-팔로워 간 상태 정보가 없다면 어떤 브로커가 리더인지, 어느 파티션에 데이터가 저장되는지 알 수 없다
      • 오프셋 관리
        • Kafka는 각 소비자 그룹의 읽기 위치를 오프셋으로 관리한다.
        • 이 상태 정보가 없다면 소비자가 어디서부터 데이터를 읽어야 하는지 알 수 없어 메시지 손실이나 중복 처리 문제가 발생할 수 있다.
      • 분산 환경
        • Kafka는 여러 브로커가 협력하여 동작하는 분산 시스템이므로, 각 브로커의 상태 정보가 중요
        • 예를 들어, 리더 레플리카가 다운되었을 때 리더를 재 선출하려면 기존 상태 정보가 필요하다.
    • Kafka 구조
    • ZooKeeper
      • 다양한 분산 시스템의 중앙 코디네이터 역할 수행
      • 카프카에선 분산된 브로커들을 관리하는 용도로 사용
      • 브로커 목록이나 설정 정보 관리
      • 변경사항(토픽 생성 및 제거, 브로커 생성 및 제거)이 발생하면 모든 브로커에 내용을 전달
      • Zookeeper는 노드마다 고유한 신분(ID)과 데이터(상태)가 필요하다 ⇒ 이해가 필요
  • 데이터베이스(MySQL, PostgreSQL…)
    • 영구 스토리지 관리
      • StatefulSet 은 Pod가 삭제되더라도 PVC는 유지
      • 데이터가 삭제되지 않으므로 손실 방지 가능
    • 고유 id와 네트워크
      • 데이터베이스 클러스터는 각 노드가 고유한 ID를 가져야 한다
      • StatefulSet은 고유 Pod 이름과 dns 주소를 가지기에 클러스터 노드 간 통신과 동기화가 용이
    • 순차적 생성 및 종료
      • 분산 데이터베이스는 노드가 순차적으로 초기화되거나 종료되어야 할 때가 많다

StatefulSet의 기능

  • 고유 Pod 이름 Ordinal index로 생성(ex. pod-0, pod-1 …)
  • Pod 순차 생성
  • Pod 재 생성 시 이름 유지
  • Pod 삭제 시 인덱스 높은 순 부터 삭제 (2→1→0)
  • volumeClaimTemplates 통한 볼륨 동적 생성
  • 영구 스토리지 제공

HeadLess Service가 어떻게 StatefulSet에 사용될까?

  • HeadLess:
    • 클러스터 IP를 제공x
    • 각 Pod에 고유한 DNS 이름 부여하여 직접 참조 가능하게 함(이름 → 도메인으로 확장)
    <**Pod 이름**>.<서비스 이름>.<네임스페이스>.svc.cluster.local
    
  • StatefulSet의 Pod들을 도메인 이름을 통해 통신할 수 있음
  • StatefulSet에서 사용되는 Pod는 각각 고유한 상태와 데이터를 가지며, 다른 Pod와 독립적으로 동작해야한다
  • 사용예시
    • 카프카
      1. 각 브로커를 Pod로 생성 (kafka-0, kafka-1…)
      2. 각 브로커에대해 헤드리스 서비스를 사용하여 dns 생성
        1. (kafka-0.kafka-service.default.svc.cluster.local)
      3. 클라이언트는 특정 브로커(Pod)에 DNS 주소로 직접 연결.

volumeClaimTemplates

  • StatefulSet에서 사용하는 템플릿으로, 각 Pod에 고유한 영구 스토리지(PersistentVolume)를 제공하기 위해 사용
  • 각 Pod는 이 템플릿을 기반으로 고유한 PVC를 생성하고, 해당 PVC에 연결된 PersistentVolume(PV)를 사용

'k8s' 카테고리의 다른 글

쿠버네티스(K8S) 개념 정리 (k8s 오브젝트)  (0) 2025.01.10