데브옵스
[트러블슈팅] Kubernetes StatefulSet 스토리지 확장: Non-cascade 전략으로 무중단 Immutable 제약 극복
두줄요약
Kubernetes StatefulSet의 Immutable 제약을 우회해 PVC를 먼저 확장하고 Non-cascade로 컨트롤러만 교체하는 절차를 정리했습니다. 서비스 중단 없이 스토리지를 늘리는 실무 트러블슈팅 방법을 설명했습니다.
문제 상황
- StatefulSet의 volumeClaimTemplates가 Immutable이라 용량 변경이 API 서버에서 차단되는 문제
- DB, 메시지 큐처럼 데이터를 유지한 채 스토리지만 확장해야 하는 운영 요구
- 서비스 중단 없이 인증·보안 시스템 가용성을 유지해야 하는 제약
원인 분석
- StatefulSet은 생성 후 템플릿 수정이 불가능한 구조
- 기존 PVC와 새 StatefulSet 템플릿의 용량 불일치 시 배포 거부
- 전체 재배포 방식은 운영 가용성 요구와 충돌
해결 방법
- PVC를 먼저 patch해 실제 스토리지를 확장
- StatefulSet을 --cascade=orphan 또는 Non-cascade로 삭제해 Pod 유지 후 컨트롤러만 교체
- 수정된 용량의 Manifest로 StatefulSet을 재배포하고 기존 Pod를 다시 편입
주의할 점
- updateStrategy가 OnDelete면 rollout restart가 동작하지 않음
- 용량 반영이 안 되면 Pod를 순차 재시작해야 함
- 작업 순서는 PVC 확장 후 StatefulSet 업데이트 순으로 유지
