쿠버네티스에서 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이어야 합니다.
• updateStrategy를 RollingUpdate로 설정해야 합니다.
• 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