들어가며
Kubernetes를 운영하다 보면 이런 고민을 하게 됩니다.
"우리 앱은 데이터를 로컬에 저장해야 하는데, Blue-Green 배포도 하고 싶어요"
결론부터 말하면, PVC 고정 + HPA + Blue-Green을 동시에 만족하는 깔끔한 방법은 없습니다. 하지만 이 문제를 해결하는 과정에서 Kubernetes 배포 전략의 본질을 이해할 수 있었습니다.
Kubernetes 워크로드 리소스 복습
먼저 기본기를 짚고 가겠습니다.
네 가지 주요 워크로드
| 리소스 | 핵심 목적 | 스케줄링 |
|---|---|---|
| ReplicaSet | Pod 복제본 수 유지 | 임의 노드 |
| Deployment | ReplicaSet + 롤링 업데이트/롤백 | 임의 노드 |
| StatefulSet | 상태 유지 (고유 ID, PVC) | 순차적 |
| DaemonSet | 모든 노드에 1개씩 | 노드당 1개 |
핵심은 Deployment = Stateless, StatefulSet = Stateful입니다.
문제: Argo Rollouts에서 PVC를 고정하고 싶다면?
Argo Rollouts는 Blue-Green, Canary 같은 고급 배포 전략을 제공합니다. 하지만 Deployment 기반이라 StatefulSet처럼 volumeClaimTemplates를 지원하지 않습니다.
시도할 수 있는 방법들
1. 미리 생성한 PVC 참조
spec:
replicas: 1 # RWO라면 1개만 가능
template:
spec:
volumes:
- name: data
persistentVolumeClaim:
claimName: my-app-pvc
한계: replicas를 늘릴 수 없음
2. EFS (ReadWriteMany) 사용
spec:
replicas: 3 # RWX라 여러 Pod 가능
template:
spec:
volumes:
- name: shared
persistentVolumeClaim:
claimName: efs-pvc
한계: Pod별 고유 PVC가 아닌 공유 스토리지
3. StatefulSet 2개 + Service 전환
Blue/Green 두 개의 StatefulSet을 만들고 Service selector로 전환하는 방식입니다.
# Green으로 전환
kubectl patch svc my-app -p '{"spec":{"selector":{"version":"green"}}}'
한계: 수동 관리, 복잡도 증가, PVC 비용 2배
왜 다들 Stateless로 설계할까?
여기서 의문이 생깁니다.
"그냥 StatefulSet에서 partition으로 카나리 배포하면 되지 않나?"
가능은 합니다. 하지만 현업에서는 거의 사용하지 않습니다.
12-Factor App이 답이다
현대 클라우드 네이티브 애플리케이션의 표준인 12-Factor App 원칙을 보면:
- Stateless Processes: 앱 프로세스는 상태를 저장하지 않음
- Backing Services: DB, 캐시는 외부 서비스로 분리
- Disposability: 빠른 시작/종료, 언제든 교체 가능
즉, 애플리케이션은 Stateless로, 데이터는 외부 저장소로 분리하는 게 표준입니다.
현업 표준 아키텍처
StatefulSet은 언제 쓰는가?
그렇다면 StatefulSet은 쓸모없는 걸까요? 아닙니다.
StatefulSet 사용 사례
- 자체 운영 DB: MySQL, PostgreSQL 클러스터
- 메시지 큐: Kafka, RabbitMQ
- 검색 엔진: Elasticsearch
- 분산 시스템: Zookeeper, etcd
StatefulSet의 표준 배포 전략: Rolling Update
StatefulSet에서는 Rolling Update가 90% 이상을 차지합니다.
역순(2→1→0)으로 업데이트: 보통 pod-0이 Primary/Master이기 때문
왜 Blue-Green이 아닐까요?
| 이유 | 설명 |
|---|---|
| 비용 | PVC 2배 필요 |
| 복잡도 | 데이터 동기화 문제 |
| 안정성 | DB는 빠른 배포보다 안전이 우선 |
Stateful 워크로드의 원칙: "느리고 안전하게"
워크로드별 배포 전략 총정리
| 워크로드 | 리소스 | 배포 전략 |
|---|---|---|
| 웹/API 서버 | Argo Rollouts | Blue-Green, Canary |
| 백그라운드 워커 | Deployment | Rolling Update |
| DB (관리형) | RDS, Aurora | AWS 콘솔 |
| 자체 운영 DB | StatefulSet | Rolling Update |
| 로깅 에이전트 | DaemonSet | Rolling Update |
결론
처음 질문으로 돌아가 봅시다.
"PVC 고정 앱에 Blue-Green 배포를 하고 싶다면?"
답변:
- 정말 로컬 스토리지가 필요한지 재검토
- 가능하면 Stateless로 재설계 + 외부 저장소 사용
- 어쩔 수 없다면 StatefulSet + Rolling Update 사용
무리하게 StatefulSet에 Blue-Green을 적용하려 하기보다, 아키텍처를 개선하는 게 장기적으로 훨씬 이득입니다.
"복잡한 배포 전략보다 단순한 아키텍처가 낫다"
참고 자료
'K8S' 카테고리의 다른 글
| 쿠버네티스 캐스케이딩 삭제(Cascading Deletion) (0) | 2026.01.22 |
|---|---|
| Kubernetes는 가상화 도구인가? (0) | 2026.01.22 |
| Kubernetes Pod 부팅 스파이크, 어떻게 해결할까? (0) | 2026.01.15 |
| Kubernetes v1.35 변화 정리 (0) | 2026.01.15 |
| Kubernetes에서 Prometheus 장기 저장 전략(Thanos vs Grafana Mimir ) (0) | 2026.01.02 |
댓글