파드 이벤트에 다음 두 가지가 번갈아 찍히고 파드가 기동하지 못한다.
Warning FailedAttachVolume attachdetach-controller
rpc error: code = Aborted desc = Volume pvc-xxxx is not ready for workloads
Warning FailedMount kubelet
failed to attach or mount volumes: unmounted volumes=[data],
unattached volumes=[]: timed out waiting for the condition
볼륨이 파드에 붙기까지는 단계가 나뉜다. 어느 단계에서 멈췄는지에 따라 봐야 할 곳이 다르다.
| 단계 | 주체 | 실패 이벤트 |
|---|---|---|
| 바인딩 | 컨트롤 플레인 | PVC 가 Pending |
| attach | attachdetach-controller 와 CSI 컨트롤러 | FailedAttachVolume |
| mount | 노드의 kubelet 과 CSI 노드 플러그인 | FailedMount |
FailedMount 만 나오면 노드 쪽, FailedAttachVolume 이 함께 나오면 스토리지 시스템 쪽을 먼저 본다.
kubectl get pvc -n <ns>
kubectl describe pvc <pvc> -n <ns>
kubectl describe pv <pv>
Bound 라고 해서 쓸 수 있다는 뜻은 아니다. 쿠버네티스는 PVC 와 PV 객체가 짝지어졌는지만 보고, 실제 스토리지 볼륨의 건강 상태는 모른다. 스토리지 쪽에서 볼륨이 고장 상태여도 PVC 는 계속 Bound 로 보인다.
Longhorn 이면 대시보드나 CRD 에서 볼륨 상태를 본다.
kubectl get volumes.longhorn.io -n longhorn-system
kubectl get replicas.longhorn.io -n longhorn-system
Robustness 가 faulted 이면 복제본이 모두 손상됐다는 뜻이다. 이 상태에서는 attach 요청이 계속 거부된다. Ceph 이면 ceph health detail, NFS 면 서버 쪽 export 와 응답을 본다.
kubectl get nodes -o wide
kubectl describe node <node> | grep -A10 Taints
노드가 NotReady 이거나 node.kubernetes.io/unreachable 테인트가 붙어 있으면 그 노드로 가는 attach 는 계속 실패한다. 파드를 다른 노드로 옮기는 편이 빠른 경우가 많다.
kubectl get pods -n <csi-namespace> -o wide
kubectl get csidrivers
kubectl get volumeattachments | grep <pv>
노드 플러그인은 DaemonSet 이므로 특정 노드에서만 죽어 있을 수 있다. 문제가 그 노드에서만 생긴다면 거의 확실하다.
VolumeAttachment 객체가 남아 있는데 실제 연결은 없는 경우가 있다. 노드가 갑자기 죽었을 때 생긴다.
kubectl get pods -A -o json | jq -r '.items[] | select(.spec.volumes[]?.persistentVolumeClaim.claimName=="<pvc>") | .metadata.namespace + "/" + .metadata.name'
ReadWriteOnce 볼륨은 한 노드에만 붙는다. 롤링 업데이트에서 새 파드가 다른 노드로 스케줄되면 옛 파드가 완전히 사라질 때까지 붙지 못한다. 이 조합은 Recreate 전략이나 노드 어피니티로 푼다.
스토리지 쪽에서 먼저 살린다. Longhorn 은 건강한 복제본이 하나라도 남아 있으면 그 복제본으로 되살릴 수 있고, 하나도 없으면 스냅샷이나 백업에서 복원해야 한다. 쿠버네티스 쪽에서 PVC 를 지웠다 만드는 것으로는 해결되지 않고 데이터만 잃는다.
노드가 복구되지 않는 상황에서만, 그리고 그 노드에서 볼륨을 쓰는 프로세스가 확실히 없을 때만 지운다.
kubectl delete volumeattachment <name>
살아 있는 노드에서 이 객체를 지우면 두 노드가 같은 블록 장치를 동시에 쓰게 되어 파일 시스템이 깨진다.
권한 문제다. 파드에 fsGroup 을 주거나 초기화 단계에서 소유자를 맞춘다.
volumeBindingMode 가 WaitForFirstConsumer 이면 파드가 스케줄되기 전에는 PVC 가 Pending 인 것이 정상이다. 오류로 오해하지 않는다.