RWO PVC 교착 — 삭제 순서와 Multi-Attach

Kubernetes3분조회

원격 개발 환경 서비스를 EKS 로 운영합니다. 사용자가 환경을 만들면 파드가 뜨고 거기에 PVC 가 하나 물리는데, 저장소로는 EBS 를 골랐습니다. EFS 처럼 여러 노드가 같이 붙는 선택지도 있지만 성능과 비용을 보고 EBS 로 갔고, 대신 접근 모드가 RWO(ReadWriteOnce) 라 한 번에 한 노드에서만 붙습니다.

여기에 야간 백업이 하나 걸려 있습니다. 밤마다 백업 Job 이 같은 볼륨을 붙여 내용을 복사하고, 끝나면 뒷정리로 PVC 를 지웁니다. 그러니까 볼륨 하나를 사용자 파드와 백업 Job 이 번갈아 만지는 구조입니다.

그 환경에서 파드가 ContainerCreating / Pending 에서 4~5시간씩 안 뜬다는 알람이 떴습니다.

원인 1 — 삭제 순서 경쟁 + pvc-protection 파이널라이저

야간 백업 Job 이 끝나고 뒷정리로 PVC 를 삭제했는데, 그 삭제가 사용자 파드가 같은 PVC 를 다시 참조한 시점보다 약 77초 뒤였습니다. 순서가 이렇게 꼬였습니다.

사용자 파드: PVC 참조 시작
   (77초 후)
백업 Job 뒷정리: 같은 PVC 삭제 요청

PVC 에는 pvc-protection 파이널라이저가 있어서, 사용 중이면 삭제가 Terminating 에서 멈춥니다. 그 결과 PVC 는 “삭제되는 중” 상태로 붙잡히고, 사용자 파드는 Terminating 인 PVC 를 마운트하려다 못 뜹니다. 지우지도, 쓰지도 못하는 교착입니다.

원인 2 — 같은 RWO 볼륨을 두 노드가 잡으면 Multi-Attach

한쪽에선 아직 안 끝난 백업 Job 이, 다른 노드에선 사용자 파드가 같은 RWO PVC 를 요구했습니다. RWO 는 한 노드에만 붙는데 서로 다른 노드가 잡으려 하니 Multi-Attach 에러가 납니다.

Multi-Attach error for volume "pvc-..."
Volume is already exclusively attached to one node

게다가 그 Job 이 activeDeadlineSeconds: 86400 이라 24시간을 재시도하며 볼륨을 계속 붙잡았습니다.

원인 3 — 볼륨은 삭제, 살아남은 Deployment

PVC·PV·볼륨은 지워졌는데 Deployment 는 남아 파드를 계속 재생성했습니다. 새 파드는 없는 PVC 를 참조하니 영원히 Pending 입니다.

persistentvolumeclaim "..." not found

파드 테이블만 훑는 정리 루프에는 이 좀비가 안 보였습니다. 상위(Deployment)가 살아 있으니 파드는 지워도 지워도 다시 생깁니다.

RWO 볼륨을 여럿이 만질 때의 순서 원칙

  • RWO 볼륨을 둘이 같이 만질 땐 순서를 강제합니다. 백업 Job 과 사용자 파드가 같은 PVC 를 쓸 수 있으면, 겹치지 않게 락이나 순서 보장을 둡니다. 삭제 전에는 “지금 이 PVC 를 누가 쓰는가” 를 먼저 확인합니다.
  • Terminating 에 걸린 PVC 는 파이널라이저를 봅니다. pvc-protection 이면 아직 참조하는 파드가 있다는 뜻이라, 파드를 먼저 정리해야 풀립니다.
  • 정리는 파드가 아니라 상위 컨트롤러부터 합니다. 볼륨을 지울 거면 Deployment 를 먼저 0 으로 내리거나 지워야 좀비 파드가 안 생깁니다.

ContainerCreating 뒤에 겹쳐 있는 문제들

RWO 볼륨은 “한 번에 한 노드” 라는 제약 때문에, 여러 쪽에서 같은 볼륨을 만지는 순간 삭제·부착·재생성이 서로 물립니다. 알람은 “파드가 안 뜬다” 하나지만, 그 아래엔 삭제 순서 경쟁, 파이널라이저 홀드, Multi-Attach, 좀비 Deployment 가 겹쳐 있을 수 있습니다. 파드가 오래 ContainerCreating 이면 파드만 보지 말고 PVC 의 상태(Terminating·파이널라이저)와 그 볼륨을 붙잡은 다른 노드/Job 까지 같이 봐야 풀립니다.

  1. 불러오는 중