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

Kubernetes20분조회 –

원격 개발 환경 서비스를 EKS 로 운영하고, 사용자가 환경을 만들면 파드가 뜨고 거기에 PVC 가 하나 물리고 저장소로는 EBS 를 씁니다. EBS 는 접근 모드가 RWO(ReadWriteOnce) 라 한 번에 한 노드에서만 붙습니다.

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

그 환경에서 파드가 ContainerCreating 이나 Pending 에서 4~5시간씩 안 뜬다는 알람이 떴습니다. 쓰는 쪽에서는 환경을 만들어 놓고 화면이 준비 중에서 안 넘어가는 상태로 남습니다.

삭제 순서 경쟁과 pvc-protection 파이널라이저

야간 백업 Job 은 복사가 끝나면 뒷정리로 PVC 를 삭제합니다. 그런데 그 삭제 요청이 사용자 파드가 같은 PVC 를 다시 참조한 시점보다 약 77초 뒤에 들어왔습니다.

사용자 파드PVC 참조 시작백업 Job 뒷정리같은 PVC 삭제 요청pvc-protection 파이널라이저쓰는 중이라 삭제가 멈춤Terminating PVC 를 마운트파드가 못 뜸77초 뒤
지우지도 쓰지도 못하는 교착

PVC 에는 pvc-protection 파이널라이저가 붙어 있어서 사용 중이면 삭제가 Terminating 에서 멈춥니다. 쓰고 있는 볼륨이 밑에서 사라지는 걸 막는 안전장치지만, 이 순서에서는 PVC 가 삭제되는 중 상태로 붙잡히고 사용자 파드는 Terminating 인 PVC 를 마운트하려다 못 떠서, 지우지도 쓰지도 못하는 교착이 됩니다.

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

여기에 하나가 더 겹칩니다. 뒷정리까지 끝내지 못하고 아직 살아 있는 백업 Job 이 한 노드에서, 사용자 파드가 다른 노드에서 같은 RWO PVC 를 요구했습니다. RWO 는 한 노드에만 붙으니 서로 다른 노드가 동시에 잡으려 하면 붙이는 단계에서 막힙니다.

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

게다가 그 Job 의 activeDeadlineSeconds 가 86400 이라 실패해도 24시간이 지나기 전에는 안 끝나고, 볼륨을 계속 붙잡고 있었습니다. 사람이 손대지 않으면 볼륨이 풀리는 건 그 24시간이 지난 뒤입니다.

볼륨은 지워졌는데 살아남은 Deployment

PVC 와 PV, 실제 볼륨까지 지워진 뒤에도 Deployment 가 남아서 파드를 계속 재생성했습니다. 새로 뜨는 파드는 없는 PVC 를 참조하니 영원히 Pending 입니다.

persistentvolumeclaim "..." not found

파드 테이블만 훑는 정리 루프에는 이게 안 잡혔습니다. 상위 컨트롤러가 살아 있으면 파드는 지워도 지워도 다시 생기니, 파드 목록만 보고 있으면 지운 것 같으면서도 계속 남아 있는 것처럼 보입니다.

삭제 전 확인 순서 — 사용자, 파이널라이저, 상위 컨트롤러

RWO 볼륨을 백업 Job 과 사용자 파드가 같이 만질 수 있으면 겹치지 않게 순서를 강제해야 합니다. 삭제하기 전에 지금 이 PVC 를 누가 쓰고 있는지부터 확인하는 게 그 최소한입니다.

Terminating 에 걸린 PVC 를 만나면 파이널라이저를 봅니다. pvc-protection 이면 아직 참조하는 파드가 있다는 뜻이라, 파이널라이저를 억지로 떼는 게 아니라 그 파드를 먼저 정리해야 풀립니다.

볼륨을 지울 때는 파드가 아니라 상위 컨트롤러부터 내려야 합니다. Deployment 를 먼저 0 으로 줄이거나 지워야 파드가 다시 안 생깁니다.

ContainerCreating 뒤에 겹쳐 있는 문제들

RWO 볼륨은 한 번에 한 노드라는 제약 때문에, 여러 쪽에서 같은 볼륨을 만지는 순간 삭제와 부착과 재생성이 서로 물립니다. 알람은 파드가 안 뜬다는 하나였지만 그 아래에는 삭제 순서 경쟁과 파이널라이저에 걸려 Terminating 에서 멈춘 PVC, Multi-Attach, 남아 있는 Deployment 가 겹쳐 있었습니다.

파드가 오래 ContainerCreating 이면 파드만 보지 말고 PVC 의 상태부터 봅니다. Terminating 인지, 파이널라이저가 뭐가 붙어 있는지, 그 볼륨을 지금 어느 노드나 Job 이 붙잡고 있는지까지 같이 봐야 어느 층에서 막힌 건지가 나옵니다.

  1. 불러오는 중