EKS에서 Airflow 사용 중단 시 PV/PVC 정리 가이드
목적
Airflow를 더 이상 사용하지 않을 때, Kubernetes에 남아있는 리소스와 스토리지(PV/PVC)를 안전하게 정리하는 절차를 정리한다.
이 문서는 특정 클러스터/리소스명을 공개하지 않기 위해, 네임스페이스/PV/PVC/볼륨 ID 등은 모두 마스킹/일반화했다.
핵심 개념 정리 (짧게)
- PVC: 네임스페이스 내에서 사용하는 스토리지 요청(“사용자 관점”)
- PV: 실제 스토리지를 나타내는 클러스터 리소스(“관리자 관점”)
STATUSBound: 어떤 PVC에 연결되어 “사용 중”인 상태Released: PVC는 사라졌는데 PV가 남아있는 상태(보통 정리 대상)
persistentVolumeReclaimPolicyDelete: PVC 삭제 시 실제 스토리지도 자동 삭제될 수 있음Retain: PVC/PV 오브젝트를 지워도 실제 스토리지는 남을 수 있음(클라우드 비용/보안 이슈로 이어질 수 있음)
1) Airflow가 “정말” 안 쓰이는지 확인
아래는 “Airflow 네임스페이스”가 있다고 가정한 예시다.
kubectl get ns | grep -i <airflow-namespace>
kubectl get pods -n <airflow-namespace> -o wide
kubectl get all -n <airflow-namespace>
추가로, 클러스터 전체에서 Airflow 관련 Pod가 남아있는지 확인:
kubectl get pods -A | grep -i airflow
2) PVC/PV 현황 확인 (정리 대상 식별)
2.1 PVC 확인
kubectl get pvc -n <airflow-namespace>
2.2 PV 확인 (필수 컬럼만)
kubectl get pv -o custom-columns="NAME:.metadata.name,CAPACITY:.spec.capacity.storage,STATUS:.status.phase,CLAIM:.spec.claimRef.name,PROVISIONER:.metadata.annotations.pv\.kubernetes\.io/provisioned-by"
운영에서 많이 보는 패턴:
ReleasedPV가 다수 남아 있음 (이전 배포/롤링/재설치 과정에서 PV가 누적)- EBS/EFS 등 Provisioner가 섞여 있음
3) 삭제 순서(권장)
3.1 네임스페이스 삭제(가장 깔끔)
Airflow를 완전히 제거할 거라면, 보통 네임스페이스 단위 삭제가 가장 단순하다.
kubectl delete namespace <airflow-namespace> --wait=true --timeout=10m
이 단계로 네임스페이스 내 리소스(Pod/Deployment/Service/ConfigMap/Secret/PVC 등)가 정리된다.
3.2 Released PV 정리
네임스페이스가 지워져도 PV는 클러스터 범위 리소스라 남을 수 있다. 특히 reclaim 정책이 Retain이면 흔하다.
kubectl get pv
kubectl delete pv <pv-name-1> <pv-name-2> ...
보수적으로 가려면: 먼저
Released만 대상으로 삼는다.
3.3 (중요) Bound PV 삭제는 매우 신중하게
Bound는 “현재 PVC에 붙어 있는 PV”다.
- Airflow를 완전히 지웠다면
Bound가 남아있지 않거나, - 남아있다면 “다른 워크로드가 그 PVC를 재사용 중”일 수도 있다.
따라서 Bound PV를 지우기 전엔 반드시 “현재 PVC/Pod가 없는지”를 재확인한다.
4) 클라우드 볼륨(EBS/EFS 등)까지 정리하려면
PV 오브젝트를 지우는 것과, 클라우드의 실제 디스크를 지우는 것은 별개다.
4.1 PV에서 실제 볼륨 식별자 확인 (CSI volumeHandle)
kubectl get pv <pv-name> -o jsonpath="{.spec.csi.volumeHandle}{'\n'}"
4.2 reclaim 정책 확인
kubectl get pv <pv-name> -o jsonpath="{.spec.persistentVolumeReclaimPolicy}{'\n'}"
Retain이면 K8s 오브젝트를 삭제해도 볼륨이 남을 수 있으니, 클라우드 콘솔/CLI로 볼륨을 찾아 직접 삭제할지 결정해야 한다.
5) PVC 이름으로 PVC 삭제(참고)
kubectl delete pvc <pvc-name> -n <namespace>
여러 개를 한 번에:
kubectl delete pvc -n <namespace> <pvc-name-1> <pvc-name-2> <pvc-name-3>
체크리스트
-
kubectl get pods -A | grep -i airflow결과가 비어 있는가? - Airflow 네임스페이스의
pvc가 더 이상 필요 없는가? -
ReleasedPV가 누적되어 있지 않은가? - reclaim 정책이
Retain이라면, 클라우드 볼륨(비용/보안)이 남지 않게 별도 정리가 필요한가?