Summary#
Kubernetes StatefulSet의 PVC 확장은 “StatefulSet 롤아웃”이라기보다 각 ordinal Pod가 소유한 기존 PVC를 개별적으로 grow-only 확장하는 작업이다. 성공 조건은 대략 다음 순서로 나뉜다: StorageClass가 확장을 허용해야 하고, PVC의 요청 용량을 더 크게 패치해야 하며, 스토리지 백엔드/CSI 드라이버가 컨트롤러 측 볼륨 확장을 완료해야 하고, 마지막으로 kubelet/CSI 노드 측에서 파일시스템 확장이 완료되어야 한다. StatefulSet의 RollingUpdate, partition, rollback은 Pod template 변경에는 적용되지만, 이미 생성된 PVC의 용량을 자동으로 되돌리거나 축소하지 않는다.
Key Points#
- StorageClass gate:
allowVolumeExpansion - PVC 확장은 해당 PVC의 StorageClass에
allowVolumeExpansion: true가 있어야 가능하다. - StorageClass 문서도 volume expansion은 “PVC 객체를 편집해 더 큰 storage request를 요청”하는 방식이라고 설명한다.
-
Kubernetes는 volume expansion을 증가 방향으로만 지원한다. 축소는 지원하지 않는다.
-
StatefulSet에서는
volumeClaimTemplates보다 생성된 PVC가 실체 - StatefulSet의
.spec.volumeClaimTemplates는 각 Pod ordinal에 대응하는 PVC를 생성해 stable storage를 제공한다. - 이미 만들어진 StatefulSet PVC를 늘릴 때는 보통
data-myapp-0,data-myapp-1같은 생성된 PVC 각각의spec.resources.requests.storage를 더 큰 값으로 패치한다. -
volumeClaimTemplates를 바꾸는 것만으로 기존 PVC들이 자동으로 동일하게 확장된다고 가정하면 안 된다. -
PVC resize controller / storage backend failure mode
- PVC request를 더 크게 변경하면 Kubernetes는 기존 PV를 대체하지 않고, 그 PV가 가리키는 기존 backing volume의 확장을 시도한다.
- 너무 큰 용량을 요청하거나 백엔드/CSI 드라이버가 확장에 실패하면 resize 시도가 반복될 수 있다.
- Kubernetes 문서는 실패 복구 절차로 PV reclaim policy를
Retain으로 바꾸고, PVC를 삭제·재생성하여 기존 PV에 다시 bind하는 수동 복구 경로를 제시한다. -
단, 재시도 크기는 현재
.status.capacity보다 커야 하며, 이미 커진 용량보다 작게 “축소”하는 복구는 지원되지 않는다. -
Filesystem resize failure mode
- backing volume 확장과 Pod 내부에서 보이는 filesystem 확장은 별도 단계다.
- filesystem volume의 경우 Kubernetes 문서는 XFS, Ext3, Ext4에 대해 filesystem resize를 지원한다고 설명한다.
- filesystem 확장은 PVC를 사용하는 새 Pod가 ReadWrite로 사용하거나, 드라이버와 filesystem이 online expansion을 지원할 때 running Pod에서 완료될 수 있다.
-
online expansion이 지원되지 않거나 노드 측 resize가 지연되면 PVC가
FileSystemResizePending류 상태로 남고, StatefulSet Pod를 ordinal 단위로 재시작해야 실제 filesystem 크기가 반영될 수 있다. -
Ordinal rollout interaction
- StatefulSet RollingUpdate는 Pod를 가장 큰 ordinal에서 가장 작은 ordinal로, 한 개씩 삭제·재생성한다.
- partition을 설정하면 partition 이상 ordinal만 업데이트되고, partition보다 작은 ordinal은 이전 버전으로 유지된다.
- 이 메커니즘은 Pod template 변경에는 유용하지만, PVC 확장 자체를 자동으로 순차 처리하는 전용 기능은 아니다.
-
운영적으로는 StatefulSet ordinal별 PVC를 하나씩 확장하고, 필요 시 해당 ordinal Pod를 재시작해 filesystem resize 완료 여부를 확인하는 방식이 안전하다.
-
Rollback boundary
kubectl rollout undo statefulset/...또는 ControllerRevision rollback은 StatefulSet의 Pod template revision을 되돌린다.- PVC의 requested size, PV capacity, 백엔드 volume size, filesystem size는 StatefulSet template rollback으로 되돌아가지 않는다.
- 따라서 잘못된 PVC expansion은 “롤백”보다 “복구” 문제에 가깝다. 아직 backend expansion이 실패 상태라면 더 작은, 그러나 현재 capacity보다 큰 값으로 재시도할 수 있지만, 이미 성공적으로 확장된 volume을 Kubernetes 표준 기능으로 shrink할 수는 없다.
Cautions#
- CSI 드라이버별 동작 차이가 크다. Kubernetes가 CSI volume expansion을 stable로 제공하더라도, 실제 성공 여부는 해당 CSI 드라이버가 controller expansion과 node/filesystem expansion을 어떻게 구현했는지에 좌우된다.
FileSystemResizePending의 처리 방식은 드라이버와 filesystem의 online expansion 지원 여부에 따라 다르다. 모든 환경에서 Pod 재시작이 필요한 것은 아니지만, 일부 환경에서는 재시작 없이는 파일시스템 크기가 갱신되지 않을 수 있다.- StatefulSet PVC 확장은 application-level replication, quorum, backup, snapshot, leader/follower 역할과 함께 계획해야 한다. Kubernetes의 ordinal 순서는 storage-safe 순서를 보장하지 않는다.
- PV를 직접 편집해 capacity를 맞추는 방식은 Kubernetes의 자동 resize 감지를 우회할 수 있으므로 피해야 한다.
- 이 초안은 공개 Kubernetes 문서와 공식 Kubernetes 블로그 중심으로 작성했다. 특정 클라우드 CSI 드라이버, 예: EBS/GCE PD/Azure Disk/vSphere/Longhorn 등의 세부 제한은 별도 드라이버 문서 확인이 필요하다.
Sources#
- https://kubernetes.io/docs/concepts/storage/persistent-volumes/
- https://kubernetes.io/docs/concepts/storage/storage-classes/
- https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/
- https://kubernetes.io/blog/2018/07/12/resizing-persistent-volumes-using-kubernetes/
- https://kubernetes.io/docs/reference/kubernetes-api/core/persistent-volume-claim-v1/
Related#
- Kubernetes StatefulSet Failure Modes: OrderedReady Deadlocks, Partitioned Rollouts, PVC Retention Semantics, and Stable Identity Boundaries
- DNS Drift
- Envoy xDS Rollout Failure Modes: Cluster Warming, Stale EDS State, Route Shadowing, and Hot Restart Drain Boundaries
Sagwan Revalidation 2026-09-17T03:30:53Z#
- verdict:
ok - note: Kubernetes PVC 확장·StatefulSet 경계 설명이 현재 관행과 문서에 부합함