쿠버네티스의 상태 기반 컨트롤러인 StatefulSet 설명

개요

StatefulSet은 배포(배포)와 유사한 형태를 가진 컨트롤러로, 버전 1.9부터 공식적으로 출시된 기능입니다. 이는 상태가 유지되는 애플리케이션을 관리하기 위해 설계되었으며, 각 파드(Pod)에 고정된 이름과 일관된 시작/종료 순서를 보장합니다. 이러한 특성은 마치 네트워크 내에서 고유한 식별자 역할을 하는 호스트명(Hostname)을 부여하는 방식으로 구현됩니다.

StatefulSet에서는 일반적인 서비스(Service) 대신 헤드리스 서비스(Headless Service)를 사용합니다. 헤드리스 서비스는 클러스터 내부 IP를 가지지 않으며, 해당 서비스 이름을 조회하면 연결된 모든 파드의 엔드포인트 목록을 직접 반환합니다. 이는 파드 간의 정확한 네트워킹을 가능하게 합니다.

또한, StatefulSet은 각 파드에 대해 고유한 DNS 주소를 자동 생성합니다. 그 형식은 다음과 같습니다:

$(podname).$(headless_service_name).$(namespace).svc.cluster.local

실제 예제 분석

다음은 간단한 Nginx 상태 기반 어플리케이션을 구성하는 예제입니다.

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

---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: nginx-statefulset
spec:
  serviceName: "nginx-headless"
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: nginx
        image: k8s.gcr.io/nginx-slim:0.8
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: html-data
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: html-data
    spec:
      accessModes: ["ReadWriteOnce"]
      storageClassName: "cephfs"
      resources:
        requests:
          storage: 1Gi

위 설정은 세 가지 핵심 요소로 구성됩니다:

  • 헤드리스 서비스: 파드의 네트워크 식별자 및 도메인 규칙을 정의합니다.
  • StatefulSet 리소스: 실제 애플리케이션 인스턴스를 관리하며, 각 파드에 고유한 이름과 순서를 보장합니다.
  • volumeClaimTemplates: 각 파드마다 독립적인 볼륨을 제공하기 위한 볼륨 요청 템플릿입니다.

왜 헤드리스 서비스가 필요한가?

Deployment에서는 파드 이름이 무작위 문자열이며 순서 없이 생성되지만, StatefulSet은 파드의 순서와 이름을 고정해야 합니다. 파드 재생성 후에도 동일한 이름을 유지하고, 데이터와 상태를 유지해야 하므로 파드 이름이 고유 식별자로 작용합니다. 이를 위해서는 파드마다 고유한 이름을 부여할 수 있는 네트워크 메커니즘이 필요하며, 이 역할을 수행하는 것이 헤드리스 서비스입니다.

왜 volumeClaimTemplates가 필요한가?

상태 기반 애플리케이션은 각 인스턴스마다 고유한 데이터를 저장해야 하며, 모든 파드가 동일한 스토리지를 공유하는 것은 적절하지 않습니다. Deployment의 경우, 파드 템플릿 내에 정의된 볼륨은 모든 인스턴스가 동일한 볼륨을 공유하게 되어 데이터가 중복되거나 오염될 수 있습니다. 반면, StatefulSet는 각 파드마다 별도의 볼륨 요청을 자동 생성하도록 설계되어 있으며, 이를 통해 각 파드가 자신만의 프로비저닝된 볼륨을 할당받아 데이터 격리가 가능해집니다. 이때 사용되는 것이 바로 volumeClaimTemplates입니다.

이러한 구조 덕분에, StatefulSet은 데이터베이스, 분산 저장 시스템 등 상태가 중요한 애플리케이션을 안정적으로 운영할 수 있습니다.

태그: statefulset headless service volumeClaimTemplate persistent volume kubernetes networking

7월 15일 05:35에 게시됨