FailedAttachVolume — 삭제된 EBS 볼륨 복구
쿠버네티스 파드가 데이터를 저장할 때는 PV(PersistentVolume)가 가리키는 AWS EBS 볼륨을 붙여 씁니다. 그 EBS 볼륨이 AWS 쪽에서 삭제되면 파드는 붙일 대상이 없어 뜨지 못합니다.
데이터를 볼륨에 두고 쓰는 워크로드라 파드마다 PVC 가 하나씩 붙어 있고, 그 PVC 가 PV 를 잡고, 그 PV 가 실제 EBS 볼륨을 가리킵니다. 어제까지 잘 쓰던 파드가 갑자기 안 떠서 이벤트를 보니 볼륨 쪽이었습니다.
원인 — 존재하지 않는 EBS 볼륨
파드 이벤트를 봤습니다.
Warning FailedAttachVolume attachdetach-controller
AttachVolume.Attach failed for volume "pvc-xxxx":
rpc error: code = Internal desc = Could not attach volume "vol-xxxx" to node "i-xxxx":
api error InvalidVolume.NotFound: The volume 'vol-xxxx' does not exist.
InvalidVolume.NotFound. PV 는 여전히 어떤 EBS 볼륨을 가리키고 있는데, 그
볼륨이 AWS 에서 실제로는 삭제돼 있었습니다. 무엇이 지웠는지는 로그가 남아
있지 않아 끝내 특정하지 못했습니다.
파드 입장에서는 붙일 볼륨이 없으니 FailedAttachVolume 에서 무한히 대기합니다.
스케줄은 되는데 볼륨을 못 붙여 컨테이너가 시작을 못 하는 교착입니다.
volumeHandle은 immutable — PV 재생성
복구의 핵심은 PV 의 volumeHandle(실제 EBS 볼륨 ID)이 immutable 이라는
점입니다. 기존 PV 에서 볼륨 ID 만 새 걸로 갈아끼울 수 없습니다. PV 를 지우고
새로 만들어야 합니다.
순서는 이렇습니다.
1. 같은 사양으로 새 EBS 볼륨을 만든다. 원래 볼륨과 같은 크기·타입·가용영역 으로 생성합니다. 가용영역이 다르면 그 노드에 붙지 못하니 반드시 맞춥니다.
NEW_VOL=$(aws ec2 create-volume \
--region ap-northeast-2 --availability-zone ap-northeast-2c \
--volume-type gp3 --size 55 --iops 3000 \
--query 'VolumeId' --output text)
aws ec2 wait volume-available --region ap-northeast-2 --volume-ids $NEW_VOL
새로 만든 볼륨이라 안은 비어 있습니다. 데이터가 든 원래 볼륨이 삭제된 거라 백업이나 스냅샷이 없으면 내용은 못 되살리고, 여기서는 볼륨을 다시 붙여 파드를 띄우는 것까지가 목표입니다.
2. PV 를 지우고 새 볼륨으로 재생성한다.
apiVersion: v1
kind: PersistentVolume
metadata:
name: <pv-name>
spec:
accessModes: [ReadWriteOnce]
capacity:
storage: 55Gi
csi:
driver: ebs.csi.aws.com
fsType: ext4
volumeHandle: <NEW_VOL> # 새 볼륨 ID
persistentVolumeReclaimPolicy: Retain
volumeMode: Filesystem
Retain 정책을 쓴 이유는, 앞으로 PV 가 지워져도 볼륨은 남기기 위해서입니다.
기본값 Delete 면 PV 를 지울 때 볼륨도 같이 삭제됩니다.
3. 볼륨 ID 를 어딘가에서 따로 추적하고 있으면 그것도 갱신한다. 애플리케이션 이 볼륨 ID 를 자체 DB 나 설정에 들고 있는 구조라면, 새 볼륨 ID 로 바꿔줘야 다음에도 맞게 붙습니다.
재발 방지
FailedAttachVolume 은 알람으로 감지할 수 있습니다. 이 증상이 뜨면 대개
볼륨·노드·CSI 쪽 문제입니다.
근본 원인(볼륨을 누가 지웠나)은 못 밝혔습니다. 지운 쪽 로그가 파드 재시작 과정에서 사라졌기 때문입니다. 복구 작업이 곧 로그 삭제라, 파드를 재시작하는 순간 원인 추적의 기회를 같이 잃습니다. 관련 컴포넌트 로그는 복구를 시작하기 전에 빼둬야 합니다.
볼륨은 되살렸지만 안에 있던 데이터는 되찾을 수 없었습니다. 볼륨이 사라지는 사고 자체를 막을 수 없다면, 사라져도 복구할 수 있게 스냅샷이 있어야 합니다.
댓글 0