Skip to Content
Infra & DevOpsK8s PV/PVC 강제 삭제 및 Finalizers
☁️ Infra & DevOps2019년 9월 6일

K8s PV/PVC 강제 삭제 및 Finalizers

#kubernetes#infra-devops#storage#pv#pvc

1. 지워지지 않는 좀비 볼륨 이슈

쿠버네티스(k8s) 환경에서 StatefulSet 기반 데이터베이스나, 카프카(Kafka) 클러스터같이 무거운 볼륨을 사용하는 앱을 삭제했다가 다시 띄울 때 종종 마주했던 문제입니다. 리소스 정리 차원에서 kubectl delete pv {pv_name} 명령어를 입력했으나 즉시 지워지지 않고 Terminating 상태에 무한정 멈춰버리는 데드락(Deadlock) 상황이 발생합니다. 이는 쿠버네티스의 리소스 보호 스토리지 메커니즘이 원인입니다.

2. Finalizers 락킹 메커니즘

쿠버네티스 오브젝트(특히 PV, PVC, Namespace 등)에는 삭제 이벤트를 안전하게 처리하기 위한 일종의 가비지 컬렉터 락인 파이널라이저(Finalizers) 속성이 존재합니다. 볼륨이 어딘가에 마운트되어 있다고 쿠버네티스 컨트롤러가 false-positive 판단을 내렸거나, 백엔드 스토리지 프로비저너가 응답을 주지 못하면 이 파이널라이저 락이 풀리지 않아 강제 삭제가 막힙니다.

3. 메타데이터 패치를 통한 강제 삭제 및 구현

Terminating 상태인 PV에 강제로 걸려있는 kubernetes.io/pv-protection 파이널라이저를 해제하여 삭제를 강행하는 팁입니다.

1. Protection(파이널라이저) 확인

먼저 해당 볼륨에 어떤 락이 걸려있는지 확인합니다.

bash
$ kubectl describe pv data-kafka-cluster-1 | grep Finalizers # 출력 예시: Finalizers: [kubernetes.io/pv-protection]

2. Patch를 통한 강제 해제 (Release)

JSON Patch API를 활용하여 해당 오브젝트의 Metadata에서 finalizers 배열을 강제로 null로 비워버립니다.

bash
$ kubectl patch pv <지워지지_않는_PV> -p '{"metadata":{"finalizers":null}}' # 예시 $ kubectl patch pv data-kafka-cluster-1 -p '{"metadata":{"finalizers":null}}'

이 명령어가 REST API를 뚫고 들어가는 즉시, K8s 컨트롤 마스터는 파이널라이저가 해제되었다고 판단하여 Terminating 큐에 걸려있던 해당 리소스를 즉각 삭제(Delete) 완료 처리합니다. PVC의 경우도 patch pvc ... 명령으로 동일하게 적용 가능합니다.

4. 강제 삭제 시 주의사항

PV 강제 삭제는 아주 편리해 보이지만 양날의 검입니다. 실제로 백엔드 스토리지에 데이터와 디스크 락이 남아있는데 쿠버네티스 DB 레코드만 지워버리면 유령 볼륨이 쌓이게 됩니다. 에서는 해당 트러블슈팅 커맨드를 사용하기 전에 “진짜 해당 볼륨을 바라보는 파드가 없는지” grep으로 크로스 체크하는 룰을 세워 휴먼 에러를 방지했습니다.

Last updated on