Warning FailedAttachVolume Multi-Attach error for volume

September 10, 2020 By Corey Dinkens
Volume is already exclusively attached to one node and can’t be attached to another

Based on my previous post, this is meant to be succinct for others encountering the ‘Multi-Attach’ error. Kubernetes does not allow multiple nodes to mount (certain) volumes concurrently. A Kubernetes bug also exists that does not forcefully detach a pv from a node after the 6 minute timeout, causing multi-attach headaches. References:


How it begins

Hmm.. Pods are not restarting, what did I do this time?

kubectl describe pod { podname }
Events:
  Type     Reason                 Age                 From                     Message
  ----     ------                 ----                ----                     -------
  Normal   Scheduled              43m                 default-scheduler        Successfully assigned nginx-x2hs2 to kubew05
  Warning  FailedAttachVolume     43m                 attachdetach-controller  Multi-Attach error for volume "pvc-0a5eb91b-3720-11e8-8d2b-000c29f8a512" Volume is already exclusively attached to one node and can't be attached to another
  Normal   SuccessfulMountVolume  43m                 kubelet, kubew05         MountVolume.SetUp succeeded for volume "default-token-scwwd"
  Warning  FailedMount            51s (x19 over 41m)  kubelet, kubew05         Unable to mount volumes for pod "nginx-x2hs2_project(c0e45e49-3721-11e8-8d2b-000c29f8a512)": timeout expired waiting for volumes to attach/mount for pod "project"/"nginx-x2hs2". 

Primary issue found:

Warning FailedAttachVolume Multi-Attach error for volume "pvc-{guid}" Volume is already exclusively attached to one node and can't be attached to another

How does one recover from this situation? There a few ways to do this.

Start by identifying the volume attachments in question:

kubectl get volumeattachments
NAME                                                                   ATTACHER                 PV                                         NODE                    ATTACHED   AGE
csi-9f7704015b456f146ce8c6c3bd80a5ec6cc55f4f5bfb90c61c250d0b050a283c   openebs-csi.openebs.io   pvc-b39248ab-5a99-439b-ad6f-780aae30626c   csi-node2.mayalabs.io   true       66m

Kubernetes thinks the PVC is attached to a non-existent node, and since we have passed the 6m timeout the PVCs will not be detaching automatically. The bugs linked at the beginning and end of this post go into more detail as to why they may not detach from a node automatically (potential data corruption/loss is the main one).

Remove finalizers:
kubectl edit volumeattachment csi-xxxxxxxxx

Locate and comment out the finalizer with the # symbol (warning: if you use Windows, take care of line endings and tabs):

"finalizers": [
 #"external-attacher/csi-vsphere-vmware-com"
 ],

Remove all volumeattachments finalizers (Warning, you may not want to remove all of your volumeattachments. It was necessary in my situation:

kubectl get volumeattachments| tail -n+2 | awk '{print $1}' | xargs -I{} kubectl patch volumeattachments {} --type='merge' -p '{"metadata":{"finalizers": null}}'

Your volume attachments should clear from the unavailable node, and your pods should begin reassigning to available resources.