쿠버네티스/이론

스테이트풀셋(StatefulSet) 이란 ?

황동리 2025. 1. 2. 11:28
반응형

테이트풀셋(StatefulSet) 이란 ?

스테이트풀셋(StatefulSet)은 Kubernetes의 워크로드 API 중 하나로,
항상 동일한 상태의 애플리케이션을 배포하고 관리하기 위한 리소스 입니다.

디플로이먼트(Deployment)와 비슷하게, 동일한 컨테이너의 스펙을 기반으로
POD를 관리 합니다.

다만, 디플로이먼트(Deployment)는 POD가 재스케줄링 되면, 이전 파드가
가지고 있는 내용이 사라지지만,

스테이트풀셋(StatefulSet)은 재 스케줄링 되어도 이전의 POD와 동일한 상태를
유지합니다.


즉, 스테이트풀셋(StatefulSet)은 POD의 고유성(identity)과 순서를 보장하며,
데이터베이스, 분산 파일 시스템, 메시지 큐와 같은 상태를 저장해야 하는 애플리케이션을
배포할 때 주로 사용됩니다.

 

레플리카셋과 차이점을 좀 더 알아보면,

 

스테이트풀셋(StatefulSet)은 POD의 이름에도 규칙성이 일정하게 있다면,
레플리카셋은 POD의 이름에 규칙성이 따로 존재하지 않습니다.

 

따라서, 스테이트풀셋(StatefulSet)에서 POD의 갯수가 증가되거나 감소될 때,

 

POD의 이름 옆에 붙어있는 인덱스 번호 순서대로 증가 즉, 오름차순으로 증가하고

 

감소할 때는 가장 높은 인덱스 번호 즉, 내림차순으로 감소합니다.


이제 직접 스테이트풀셋(StatefulSet)을 배포해보도록 하겠습니다.

배포에 앞서 필요한 것들이 있습니다.

  • 데이터 파일을 저장하기 위한 퍼시스턴트 볼륨
  • 스테이트풀셋에 필요한 거버닝 서비스

 

그런데 저 같은 경우에는 퍼시스턴트 볼륨을 동적으로 할당되도록 설정 해두었기 때문에
퍼시스턴트 볼륨 생성 과정은 넘어가도록 하겠습니다.

거버닝 서비스 생성

스테이트풀셋은 POD 간의 고유한 네트워크 ID와 DNS 이름을 필요로 하기 때문에,
Headless Service(거버닝 서비스)가 필수입니다.

 

이 서비스가 없으면 StatefulSet Pod가 제대로 생성되지 않거나,
DNS 레코드가 누락될 수 있습니다.

apiVersion: v1
kind: Service
metadata:
  name: kubia
spec:
  clusterIP: None	# 중요
  selector:
    app: kubia
  ports:
  - name: http
    port: 80

 

거버닝 서비스는 헤드리스 서비스로 생성을 해야하기 때문에,

 

ClusterIP를 None으로 설정을 해주어야 합니다.

 

스테이트풀셋 생성하기

이제 스테이트풀셋을 생성해보도록 하겠습니다.

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: kubia
spec:
  serviceName: kubia # 스테이트풀셋과 연결될 헤드리스 서비스 이름
  replicas: 2
  selector:
    matchLabels:
      app: kubia
  template:
    metadata:
      labels:
        app: kubia
    spec:
      containers:
      - name: kubia
        image: luksa/kubia-pet
        ports:
        - name: http
          containerPort: 8080
        volumeMounts:
        - name: data
          mountPath: /var/data # 컨테이너 내부의 /var/data 경로에 PVC 볼륨 마운트
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      resources:
        requests:
          storage: 1Mi
      accessModes:
      - ReadWriteOnce
      storageClassName: nfs-client # PV 생성을 위한 스토리지클래스 정의

 

저 같은 경우에는 동적으로 PV를 할당할 수 있도록 스토리지 클래스를 미리 정의 해둔 상태여서,

 

volumeClaimTemplates에 스토리지클래스 이름만 정의를 해주었습니다.

 

위 Yaml 파일로 스테이트풀셋을 생성하면 아래와 같이 생성 됩니다.

 

이제 스테이트풀 POD를 삭제해서 재 스케줄링된 파드가 동일 스토리지에 연결되는지 확인해보도록 하겠습니다.

 

먼저 쿠버네티스 API 서버에 접근 할 수 있도록 해줍니다.

# kubectl proxy

 

그리고 터미널을 하나 새로 열고, curl 명령어로 데이터를 전송해줍니다.

# curl -X POST -d "Hey there! This greeting was submitted to kubia-0" localhost:8001/api/v1/namespaces/10/pods/kubia-0/proxy/
# curl -X POST -d "Hey there! This greeting was submitted to kubia-1" localhost:8001/api/v1/namespaces/10/pods/kubia-1/proxy/\

 

정상적으로 저장이 되었는지 확인해줍니다.

# curl localhost:8001/api/v1/namespaces/10/pods/kubia-0/proxy/

# curl localhost:8001/api/v1/namespaces/10/pods/kubia-1/proxy/

 

이제 kubia-0 POD를 삭제하고 다시 확인해보도록 하겠습니다.

# kubectl delete pods kubia-0

# curl localhost:8001/api/v1/namespaces/10/pods/kubia-0/proxy/

 

POD를 삭제하고 재스케줄링 되어도 이전에 연결되었던 스토리지가 사라지지 않고
다시 재 연결되는 것을 확인 할 수 있습니다.

 

이상 입니다.

반응형