Kubernetes/Kubernetes Best Practices

[Scenario Playbook Ep.24] 🚀 StatefulSet 편 #3 | Pod 순차적 배포 및 업데이트 전략

ygtoken 2025. 3. 16. 17:42
728x90

 

쿠버네티스에서 StatefulSet은 Pod을 순차적으로 배포하고, 롤링 업데이트 시에도 순서를 유지하는 특징이 있습니다.

이번 글에서는 StatefulSet의 Pod이 순차적으로 생성되도록 설정하는 방법과 롤링 업데이트 전략을 적용하는 방법을 다룹니다.

 


📌 글에서 다루는 상황들

 

1️⃣ Pod을 순차적으로 배포하도록 설정

2️⃣ StatefulSet 업데이트 시 순차적 롤링 업데이트 적용

 

각 문제를 실무에서 바로 활용할 수 있도록 Manifest 템플릿과 예상 결과 값을 제공합니다.

 


1️⃣ Pod을 순차적으로 배포하도록 설정

 

❓ 문제 상황

 

운영팀에서 데이터베이스, 메시지 브로커, 분산 애플리케이션과 같은 서비스가 올바르게 실행되려면 Pod이 순차적으로 생성되어야 하는 요구사항이 생겼습니다.

각 Pod은 이전 Pod이 완전히 실행된 후에만 생성되어야 하며, 이전 Pod이 준비되지 않으면 다음 Pod이 생성되지 않아야 합니다.

StatefulSet의 이름은 seq-app이어야 합니다.

Pod은 seq-app-0, seq-app-1, seq-app-2 형식으로 순차적으로 생성되어야 합니다.

readinessProbe를 추가하여 각 Pod이 정상적으로 준비된 후에 다음 Pod이 생성되도록 설정해야 합니다.

 

✅ 어떻게 해결할 수 있을까요?

 


🛠️ 해결 방법

 

1. StatefulSet은 기본적으로 Pod을 순차적으로 생성하지만, 이를 더욱 강제하기 위해 readinessProbe를 추가해야 합니다.

readinessProbe를 설정하여 애플리케이션이 준비될 때까지 다음 Pod의 생성이 지연되도록 설정

 

2. Pod이 실행될 때 로그 메시지를 출력하여 배포 순서를 확인할 수 있도록 설정해야 합니다.

 


✅ 정답 Manifest (순차적 배포가 적용된 StatefulSet 설정)

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: seq-app  # StatefulSet 이름
spec:
  serviceName: "seq-app"  # Headless Service와 연결될 이름
  replicas: 3  # 실행할 Pod 개수
  selector:
    matchLabels:
      app: seq-app  # 레이블을 기반으로 Pod을 선택
  template:
    metadata:
      labels:
        app: seq-app  # Pod 레이블
    spec:
      containers:
      - name: test-container
        image: busybox  # 테스트용 컨테이너
        command: ["sh", "-c", "echo Pod is ready; sleep 3600"]
        readinessProbe:
          exec:
            command: ["sh", "-c", "echo readiness check passed"]
          initialDelaySeconds: 5
          periodSeconds: 10

 

 


📌 적용 후 예상 결과 값

 

1. StatefulSet 생성 확인

kubectl get statefulset

 

💡 예상 출력 값

NAME        READY   AGE
seq-app     3/3     5s

 

2. StatefulSet의 Pod이 순차적으로 생성되었는지 확인

kubectl get pods -l app=seq-app --sort-by=.metadata.creationTimestamp

 

💡 예상 출력 값

NAME        READY   STATUS    RESTARTS   AGE
seq-app-0   1/1     Running   0          10s
seq-app-1   1/1     Running   0          5s
seq-app-2   1/1     Running   0          2s

 

 


2️⃣ StatefulSet 업데이트 시 순차적 롤링 업데이트 적용

 

❓ 문제 상황

 

운영팀에서 StatefulSet을 업데이트할 때 한 번에 모든 Pod을 업데이트하는 것이 아니라, 한 개씩 순차적으로 업데이트되도록 설정해야 하는 요구사항이 생겼습니다.

이를 위해 RollingUpdate 전략을 적용하여 한 번에 하나씩 Pod을 업데이트하도록 설정해야 합니다.

StatefulSet의 이름은 rolling-update-app이어야 합니다.

updateStrategyRollingUpdate로 설정해야 합니다.

Pod은 한 개씩 업데이트되며, 이전 Pod이 준비된 후 다음 Pod이 업데이트되어야 합니다.

 

✅ 어떻게 해결할 수 있을까요?

 


🛠️ 해결 방법

 

1. StatefulSet의 updateStrategy를 RollingUpdate로 설정하여 한 개씩 업데이트되도록 구성해야 합니다.

RollingUpdate 전략을 적용하여 이전 Pod이 준비된 후 다음 Pod이 업데이트되도록 설정

 

2. Pod을 업데이트한 후 새로운 버전이 올바르게 적용되었는지 확인해야 합니다.

 


✅ 정답 Manifest (롤링 업데이트가 적용된 StatefulSet 설정)

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: rolling-update-app  # StatefulSet 이름
spec:
  serviceName: "rolling-update"  # Headless Service와 연결될 이름
  replicas: 3  # 실행할 Pod 개수
  updateStrategy:
    type: RollingUpdate  # 순차적 롤링 업데이트 설정
  selector:
    matchLabels:
      app: rolling-update  # 레이블을 기반으로 Pod을 선택
  template:
    metadata:
      labels:
        app: rolling-update  # Pod 레이블
    spec:
      containers:
      - name: test-container
        image: busybox  # 테스트용 컨테이너
        command: ["sh", "-c", "echo Rolling Update Applied; sleep 3600"]

 

 


📌 적용 후 예상 결과 값

 

1. StatefulSet 업데이트 적용

kubectl apply -f rolling-update-statefulset.yaml

 

💡 예상 출력 값

statefulset.apps/rolling-update-app configured

 

2. Pod이 순차적으로 업데이트되는지 확인

kubectl rollout status statefulset rolling-update-app

 

💡 예상 출력 값

partitioned rolling update in progress: 1/3 done
partitioned rolling update in progress: 2/3 done
statefulset "rolling-update-app" successfully rolled out

 

3. Pod의 업데이트된 이미지 확인

kubectl get pods -l app=rolling-update -o wide

 

💡 예상 출력 값

NAME                     READY   STATUS    RESTARTS   AGE   IMAGE
rolling-update-app-0     1/1     Running   0          30s   busybox
rolling-update-app-1     1/1     Running   0          20s   busybox
rolling-update-app-2     1/1     Running   0          10s   busybox
728x90