Comment résoudre les problèmes liés au montage de mes volumes EBS dans Amazon EKS ?

Date de la dernière mise à jour : 24/03/2022

Je reçois l'erreur suivante dans mes pods lors du montage de volumes Amazon Elastic Block Store (Amazon EBS) dans mon cluster Amazon Elastic Kubernetes Service (Amazon EKS) :

« Le délai a expiré en attendant que les volumes soient attachés ou montés pour le pod. »

Comment résoudre ce problème ?

Solution

Avant de commencer les étapes de dépannage suivantes, vérifiez que vous disposez des éléments suivants :

  • Les autorisations AWS Identity and Access Management (IAM) requises pour votre rôle IAM de compte de service « ebs-csi-controller-sa ».
  • Un PersistentVolumeClaim (PVC) valide est présent dans le même espace de noms que le pod.
  • Une définition de classe de stockage EBS valide à l'aide de l'outil d'allocation dans l'arborescence « kubernetes.io/aws-ebs » ou de l'outil d'allocation de pilote Amazon EBS Container Storage Interface (CSI) « ebs.csi.aws.com ».

Vérifiez que le contrôleur de pilote et les pods de nœuds Amazon EBS CSI sont en cours d'exécution.

Le pilote CSI Amazon EBS se compose de pods de contrôleur qui s'exécutent en tant que déploiement ainsi que de pods de nœuds qui s'exécutent en tant que daemonset. Exécutez les commandes suivantes pour vérifier si ces pods sont en cours d'exécution dans votre cluster :

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

Remarque : le pilote CSI Amazon EBS n'est pas pris en charge sur les composants masters Windows ni sur EKS Fargate.

Assurez-vous que la version du pilote CSI Amazon EBS installée est compatible avec la version Kubernetes de votre cluster.

Vérifiez si le PVC a rencontré des problèmes lors de la liaison au volume persistant EBS

Pour vérifier si le PVC a rencontré des problèmes, exécutez la commande suivante pour afficher les événements. Dans l'exemple de commande suivant, remplacez pvc-name et espace de noms par les valeurs correctes pour votre environnement.

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

Si vous utilisez l'allocation dynamique des volumes, passez en revue les événements renvoyés pour déterminer si l'allocation de volumes a réussi ou échoué. Vous pouvez également voir le nom de volume persistant correspondant auquel le PVC est lié, comme illustré dans l'exemple suivant :

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

Si l'allocation a échoué, recherchez le message d'erreur dans les événements.

Consulter les journaux des pods de contrôleur CSI Amazon EBS

Consultez les journaux des pods de contrôleur pour comprendre la cause des défaillances de montage. Si le volume est défaillant lors de la création, reportez-vous aux journaux ebs-plugin et csi-provisioner. Exécutez les commandes suivantes pour récupérer les journaux de conteneurs 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

Exécutez la commande suivante pour récupérer les journaux de conteneurs csi-provisioner :

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

Si les volumes EBS ne parviennent pas à être attachés au pod, consultez les journaux csi-attacher pour comprendre pourquoi. Exécutez la commande suivante pour récupérer les journaux de conteneurs csi-attacher :

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

Vérifiez que le compte de service de contrôleur de pilote CSI Amazon EBS est annoté avec le rôle IAM correct et que le rôle IAM a les autorisations requises

Les erreurs non autorisées dans vos événements PVC ou dans vos journaux ebs-csi-controller sont causées par les éléments suivants :

1.    Exécutez la commande suivante pour déterminer si le compte de service utilisé par les pods ebs-csi-controller ont la bonne annotation :

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

Vérifiez que l'annotation suivante est présente :

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

2.    Vérifiez que le fournisseur OIDC IAM pour le cluster est créé et que le rôle IAM a les autorisations requises pour effectuer des appels d'API EBS. Vérifiez également que la politique d'approbation du rôle IAM fait confiance au compte de service ebs-csi-controller-sa.

3.    Consultez les journaux AWS CloudTrail de votre compte pour vérifier que les appels CreateVolume, AttachVolume et DetachVolume sont effectués. Consultez également les journaux CloudTrail pour déterminer quel principal a effectué les appels. Ces informations vous aident à déterminer si le rôle IAM du compte de service est en cours d'utilisation par le rôle IAM du contrôleur ou du composant master.

Vérifier l'affinité de nœuds du volume persistant

Chaque volume persistant est créé avec une affinité de nœuds limitant l'attachement des volumes persistants aux nœuds dans une seule zone de disponibilité. En effet, les volumes EBS ne peuvent être attachés qu'à des pods ou à des nœuds s'exécutant dans la même zone de disponibilité dans laquelle ils ont été créés. Si des pods planifiés sur des nœuds dans une zone de disponibilité tentent d'utiliser le volume persistant EBS dans une autre zone de disponibilité, vous recevez un message d'erreur similaire au suivant :

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

Pour éviter cela, utilisez StatefulSets au lieu de Deployment, afin qu'un volume EBS unique soit créé pour chaque pod des StatefulSets dans la même zone de disponibilité que le pod.

Vous pouvez vérifier l'affinité de nœuds du volume persistant en exécutant la commande suivante. Dans l'exemple de commande suivant, remplacez nom-volume persistant par le nom de votre volume.

kubectl describe pv <persistent-volume-name>

Remarque : n'oubliez pas que vous ne pouvez pas monter un volume EBS sur deux pods différents s'exécutant sur deux composants masters différents. Le volume EBS peut être attaché à des pods s'exécutant sur un nœud, mais ne peut pas être attaché à un autre nœud en même temps. Si vous essayez d'attacher votre volume EBS à deux pods différents sur des composants masters différents, le pod échoue et vous recevez un message d'erreur similaire au suivant :

"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"

Vérifier que vos pods de contrôleur EBS sont connectés à l'API EC2

Si des erreurs indiquant l'expiration des délais de connexion s'affichent dans les journaux EBS-CSI-Controller, le contrôleur CSI EBS n'est peut-être pas connecté à l'API EC2. Si les pods de contrôleur présentent des problèmes de connectivité à l'API EC2, une erreur similaire à la suivante s'affiche lors de la création de votre PVC :

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

Pour corriger cette erreur, vérifiez que les sous-réseaux des pods de contrôleur EBS sont connectés à l'API EC2. Si vous exécutez un cluster privé avec un proxy HTTP/HTTPS, vérifiez que vos pods de contrôleur EBS CSI sont configurés pour utiliser le proxy HTTP/HTTPS. L'installation du Helm du pilote EBS CSI prend en charge la configuration d'un proxy HTTP/HTTPS.


Cet article vous a-t-il été utile ?


Besoin d'aide pour une question technique ou de facturation ?