Come posso risolvere i problemi relativi ai montaggi del mio volume EBS in Amazon EKS?

Ultimo aggiornamento: 24/03/2022

Durante il montaggio di volumi Amazon Elastic Block Store (Amazon EBS) nel mio cluster Amazon Elastic Kubernetes Service (Amazon EKS) ricevo il seguente errore nei miei pod:

"Timeout scaduto in attesa che i volumi vengano collegati o montati per il pod"

In che modo posso risolvere il problema?

Risoluzione

Prima di iniziare con i passaggi successivi per la risoluzione dei problemi, verifica di avere:

  • Le autorizzazioni AWS Identity and Access Management (IAM) richieste per il ruolo IAM dell'account di servizio "ebs-csi-controller-sa".
  • Un PersistentVolumeClaim (PVC) valido, è presente nello stesso spazio dei nomi del pod.
  • Una definizione valida della classe di archiviazione EBS utilizzando il provisioner in-tree "kubernetes.io/aws-ebs" o il provisioner del driver Amazon EBS Container Storage Interface (CSI) "ebs.csi.aws.com".

Verifica che il controller del driver Amazon EBS CSI e i pod dei nodi siano in esecuzione

Il driver Amazon EBS CSI è costituito da pod controller che vengono eseguiti come pod di distribuzione e pod nodo eseguiti come daemonset. Esegui i seguenti comandi per verificare se questi pod sono in esecuzione nel tuo cluster:

kubectl get all -l app.kubernetes.io/name=aws-ebs-csi-driver -n kube-system

Nota: il driver Amazon EBS CSI non è supportato sui nodi (worker) Windows o EKS Fargate.

Assicurati che la versione del driver Amazon EBS CSI installata sia compatibile con la versione Kubernetes del tuo cluster.

Verifica se il PVC ha riscontrato problemi durante l'associazione al volume persistente EBS

Per verificare se il PVC ha riscontrato problemi, esegui il seguente comando per visualizzare gli eventi. Nel seguente comando di esempio, sostituisci pvc-name e spazio dei nomi con i valori corretti per il tuo ambiente.

kubectl describe pvc <pvc-name> -n <namespace>

Se utilizzi il provisioning dinamico dei volumi, esamina gli eventi restituiti per determinare se il provisioning dei volumi ha avuto esito positivo o negativo. Inoltre, puoi visualizzare il nome del volume persistente corrispondente a cui è associato il PVC, come mostrato nell'esempio seguente:

Name:          ebs-claim
Namespace:     default
StorageClass:  ebs-sc
Status:        Bound
Volume:        pvc-5cbd76de-6f15-41e4-9948-2bba2574e205
Annotations:   pv.kubernetes.io/bind-completed: yes
               pv.kubernetes.io/bound-by-controller: yes
               volume.beta.kubernetes.io/storage-provisioner: ebs.csi.aws.com
               volume.kubernetes.io/selected-node: ip-10-0-2-57.ec2.internal
. . . . .
. . . . . 
Events:
  Type    Reason                 Age                    From                                                                                      Message
  ----    ------                 ----                   ----                                                                                      -------
. . . . .
  Normal  Provisioning           5m22s                  ebs.csi.aws.com_ebs-csi-controller-57d4cbb9cc-dr9cd_8f0373e8-4e58-4dd0-b83c-da6f9ad5d5ce  External provisioner is provisioning volume for claim "default/ebs-claim"
  Normal  ProvisioningSucceeded  5m18s                  ebs.csi.aws.com_ebs-csi-controller-57d4cbb9cc-dr9cd_8f0373e8-4e58-4dd0-b83c-da6f9ad5d5ce  Successfully provisioned volume pvc-5cbd76de-6f15-41e4-9948-2bba2574e205

Se il provisioning non è riuscito, trova il messaggio di errore negli eventi.

Esamina i registri dei pod del controller CSI di Amazon EBS

Controlla i registri dei pod del controller per comprendere la causa dei montaggi non riusciti. Se durante la sua creazione il volume presenta un errore, fai riferimento ai registri ebs-plugin e csi-provisioner. Esegui i seguenti comandi per recuperare i registri del container ebs-plugin:

kubectl logs deployment/ebs-csi-controller -n kube-system -c ebs-plugin
kubectl logs daemonset/ebs-csi-node -n kube-system -c ebs-plugin

Esegui il seguente comando per recuperare i registri del container csi-provisioner:

kubectl logs deployment/ebs-csi-controller -n kube-system -c csi-provisioner

Se i volumi EBS non riescono a collegarsi al pod, esamina i registri csi-attacher per capire il motivo. Esegui il seguente comando per recuperare i registri del container csi-attacher:

kubectl logs deployment/ebs-csi-controller -n kube-system -c csi-attacher

Verifica che l'account di servizio del controller del driver CSI di Amazon EBS sia annotato con il ruolo IAM corretto e che il ruolo IAM disponga delle autorizzazioni richieste

Gli errori non autorizzati negli eventi PVC o nei registri ebs-csi-controller sono causati da quanto segue:

1.    Esegui il seguente comando per determinare se l'account di servizio utilizzato dai pod ebs-csi-controller dispone dell'annotazione corretta:

kubectl describe sa ebs-csi-controller-sa -n kube-system

Verifica che sia presente la seguente annotazione:

eks\.amazonaws\.com/role-arn"="arn:aws:iam::111122223333:role/AmazonEKS_EBS_CSI_DriverRole

2.    Verifica che il provider IAM OIDC per il cluster sia stato creato e che il ruolo IAM disponga delle autorizzazioni necessarie per eseguire chiamate API EBS. Inoltre, verifica che la policy di attendibilità del ruolo IAM consideri attendibile l'account di servizio ebs-csi-controller-sa.

3.    Controlla i registri AWS CloudTrail del tuo account per verificare che le chiamate CreateVolume, AttachVolume e DetachVolume siano in corso. Esamina anche i registri di CloudTrail per determinare quale principale ha effettuato le chiamate. Queste informazioni consentono di determinare se il ruolo IAM dell'account di servizio viene utilizzato dal controller o dal ruolo IAM del nodo (worker).

Verifica l'affinità dei nodi del volume persistente

Ogni volume persistente viene creato con un'affinità di nodo che limita il collegamento di volumi persistenti ai nodi all'interno di una singola zona di disponibilità. Questo perché i volumi EBS possono essere collegati solo a pod o nodi in esecuzione nella stessa zona di disponibilità in cui sono stati creati. Se i pod pianificati su nodi in una zona di disponibilità tentano di utilizzare il volume persistente EBS in una zona di disponibilità diversa, viene visualizzato un errore simile al seguente:

"FailedScheduling: 1 node(s) had volume node affinity conflict".

Per evitare che questo avvenga, utilizza StatefulSets invece di Deployment, in modo che venga creato un volume EBS univoco per ogni pod degli StatefulSets nella stessa zona di disponibilità del pod.

Puoi verificare l'affinità dei nodi del volume persistente eseguendo il seguente comando. Nel seguente comando di esempio, sostituisci persistent-volume-name con il nome del tuo volume.

kubectl describe pv <persistent-volume-name>

Nota: tieni presente che non puoi montare un volume EBS su due pod diversi in esecuzione su due diversi nodi (worker). Il volume EBS può essere collegato a pod in esecuzione su un nodo ma non può essere collegato a un altro nodo contemporaneamente. Se tenti di collegare il volume EBS a due diversi pod su nodi (worker) diversi, il pod genera un errore simile al seguente:

"Warning FailedAttachVolume 2m38s attachdetach-controller Multi-Attach error for volume "pvc-1cccsdfdc8-fsdf6-43d6-a1a9-ea837hf7h57fa" Volume is already exclusively attached to one node and can't be attached to another"

Assicurati che i tuoi controller pod EBS abbiano la connettività all'API EC2

Se vengono visualizzati errori che indicano timeout di connessione nei registri del controller EBS-CSI, il controller EBS CSI potrebbe non essere connesso all'API EC2. Se i controller pod presentano problemi di connettività all'API EC2, durante la creazione del PVC viene visualizzato un errore simile al seguente:

Warning   ProvisioningFailed       persistentvolumeclaim/storage-volume-1   failed to provision volume with StorageClass "ebs-sc": rpc error: code = DeadlineExceeded desc = context deadline exceeded

Per correggere questo errore, verifica che le sottoreti dei pod del controller EBS abbiano connettività all'API EC2. Se stai eseguendo un cluster privato con un proxy HTTP/HTTPS, verifica che i tuoi controller pod EBS CSI siano configurati per utilizzare il proxy HTTP/HTTPS. L'installazione dell'helm del driver EBS CSI supporta la configurazione di un proxy HTTP/HTTPS.


Questo articolo è stato utile?


Hai bisogno di supporto tecnico o per la fatturazione?