EKS에서 Airflow 사용 중단 시 PV/PVC 정리 가이드

목적

Airflow를 더 이상 사용하지 않을 때, Kubernetes에 남아있는 리소스와 스토리지(PV/PVC)를 안전하게 정리하는 절차를 정리한다.

이 문서는 특정 클러스터/리소스명을 공개하지 않기 위해, 네임스페이스/PV/PVC/볼륨 ID 등은 모두 마스킹/일반화했다.


핵심 개념 정리 (짧게)

  • PVC: 네임스페이스 내에서 사용하는 스토리지 요청(“사용자 관점”)
  • PV: 실제 스토리지를 나타내는 클러스터 리소스(“관리자 관점”)
  • STATUS
    • Bound: 어떤 PVC에 연결되어 “사용 중”인 상태
    • Released: PVC는 사라졌는데 PV가 남아있는 상태(보통 정리 대상)
  • persistentVolumeReclaimPolicy
    • Delete: 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"

운영에서 많이 보는 패턴:

  • Released PV가 다수 남아 있음 (이전 배포/롤링/재설치 과정에서 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가 더 이상 필요 없는가?
  • Released PV가 누적되어 있지 않은가?
  • reclaim 정책이 Retain이라면, 클라우드 볼륨(비용/보안)이 남지 않게 별도 정리가 필요한가?