Comment résoudre les problèmes liés à la création dynamique d'un objet de volume persistant Kubernetes à l'aide du contrôleur CSI Amazon EFS ?

Lecture de 6 minute(s)
0

Je reçois des erreurs lorsque je crée un pod Amazon Elastic Kubernetes Service (Amazon EKS) qui utilise la demande de volume persistant. Le volume persistant est créé dynamiquement et est en attente.

Solution

Le pilote CSI Amazon Elastic File System (Amazon EFS) utilise le rôle AWS Identity and Access Management (IAM) pour la fonctionnalité de compte de service (IRSA). Cette fonctionnalité nécessite que divers composants, notamment le fournisseur OpenID Connect (OIDC), le rôle IAM et les autorisations d'accès soient correctement configurés. Ces composants sont configurés à l'aide de la politique de rôle IAM et du compte de service Kubernetes. Utilisez les étapes de dépannage suivantes en fonction du message d'erreur qui s'affiche.

Remarque : Si vous recevez des messages d'erreurs pendant l'exécution de commandes AWS CLI, assurez-vous d'utiliser la version la plus récente d'AWS CLI.

storageclass.storage.k8s.io « <STORAGE_CLASS_NAME>» non trouvé

Cette erreur indique que la classe de stockage référencée par le paramètre storageClassName dans votre définition d'objet PersistentVolumeClaim n'existe pas et doit être créée.

Afin de corriger cette erreur, procédez comme suit :

1.    Créez un objet de classe de stockage Kubernetes.

2.    Téléchargez un manifeste des classes de stockage pour Amazon EFS :

curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-efs-csi-driver/master/examples/kubernetes/dynamic_provisioning/specs/storageclass.yaml

3.    Modifiez le fichier téléchargé. Recherchez l'instruction suivante, puis remplacez la valeur de fileSystemId par l'ID de votre système de fichiers.

fileSystemId: fs-582a03f344f0fc633 # Replace the filesystem id

4.    Déployer la classe de stockage :

kubectl apply -f storageclass.yaml

échec du provisionnement du volume avec StorageClass « <STORAGE_CLASS_NAME> » : erreur rpc : code = InvalidArgument desc = Le système de fichiers n'existe pas : ressource introuvable

Cette erreur indique que le fileSystemId référencé par l'objet de classe de stockage n'existe pas dans la région ou qu'il est incorrect.

Pour résoudre cette erreur, vérifiez si le système de fichiers Amazon EFS référencé dans la classe de stockage est correct et existe dans la région :

kubectl get storageclass `kubectl get pvc ${PVC_NAME} -o jsonpath='{.spec.storageClassName}'` -o jsonpath='{.parameters.fileSystemId}'

Remarque : veillez à remplacer PVC_NAME par le nom de votre PersistentVolumeClaim.

Si le système de fichiers EFS (fileSystemId) renvoyé n'existe pas dans la région, supprimez l'objet de classe de stockage Kubernetes. Ensuite, créez-le à nouveau en incluant l'ID de système de fichiers correct pour le champ fileSystemId.

impossible de provisionner le volume avec StorageClass « <STORAGE_CLASS_NAME> » : erreur rpc : code = Internal desc = Impossible de récupérer les informations du système de fichiers : Décrire le système de fichiers a échoué : WebIdentityErr : impossible de récupérer les informations d'identification en raison de : InvalidIdentityToken : aucun fournisseur OpenIDConnect n'a été trouvé sur votre compte pour https://oidc.eks. <REGION-CODE>.amazonaws.com/id/ <OIDC ID>code d'état : 400, identifiant de demande : <REQUEST ID>

Cette erreur indique que l'identité IAM OIDC fournie n'est pas créée dans IAM pour le cluster Amazon EKS.

1.    Récupérez l'identifiant du fournisseur OIDC de votre cluster et enregistrez-le dans une variable :

oidc_id=$(aws eks describe-cluster --name ${CLUSTER_NAME} --query "cluster.identity.oidc.issuer" --output text | cut -d '/' -f 5); echo $oidc_id

Remarque : veillez à remplacer CLUSTER_NAME par le nom de votre cluster.

2.    Créer un fournisseur d'identité OIDC IAM pour votre cluster :

eksctl utils associate-iam-oidc-provider --cluster ${CLUSTER_NAME} –-approve

Remarque : Si vous ne pouvez pas utiliser l'utilitaire eksctl pour créer le fournisseur IAM OIDC, utilisez la Console de gestion AWS.

Impossible de provisionner le volume avec StorageClass « <STORAGE_CLASS_NAME> » : erreur rpc : code = Unauthenticated desc = Accès refusé. Assurez-vous de disposer des autorisations AWS appropriées : Accès refusé

Cette erreur indique que l'IRSA ne dispose pas des autorisations d'accès requises (exemple : elasticfilesystem:CreateAccessPoint).

1.    Récupérez le compte de service utilisé par le déploiement du contrôleur EFS CSI :

kubectl get deploy -n kube-system efs-csi-controller -o=jsonpath={'.spec.template.spec.serviceAccount'}

2.    Recherchez le rôle IAM utilisé par le compte de service :

kubectl get sa -n kube-system ${SERVICE_ACCOUNT} -oyaml -o=jsonpath={'.metadata.annotations.eks\.amazonaws\.com/role-arn'}

3.    Téléchargez le document de stratégie IAM à partir de GitHub :

curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-efs-csi-driver/master/docs/iam-policy-example.json

4.    Créez la politique IAM si elle n'existe pas :

aws iam create-policy --policy-name AmazonEKS_EFS_CSI_Driver_Policy --policy-document file://iam-policy-example.json

5.    Attachez cette politique IAM au rôle IAM que vous avez précédemment récupéré, annoté avec le compte de service utilisé par le déploiement du contrôleur EFS CSI.

aws iam attach-role-policy --policy-arn arn:aws:iam::${ACCOUNT_ID}:policy/AmazonEKS_EFS_CSI_Driver_Policy --role-name ${IAM_ROLE_NAME}

Remarque :

Vous pouvez récupérer l'identifiant du compte en exécutant la commande suivante :

aws sts get-caller-identity --query "Account" --output text

Vous pouvez récupérer le rôle IAM en exécutant la commande suivante :

echo $IAM_ROLE_ARN | cut -d "/" -f2

Impossible de récupérer les informations du système de fichiers : échec de la description du système de fichiers : WebIdentityErr : impossible de récupérer les informations d'identification en raison de : AccessDenied : Non autorisé à exécuter sts:AssumeRoleWithWebIdentity

Cette erreur s'affiche pour une ou plusieurs des raisons suivantes :

  • L'autorisation IAM sts:AssumeRoleWithWebIdentity n'est pas fournie.
  • Le fournisseur d'identité IAM OIDC répertorié dans le document de relation de confiance associé au rôle IAM n'est pas correct.
  • Le compte de service Kubernetes (exemple : system:serviceaccount:kube-system:efs-csi-controller-sa) mentionné ne correspond pas à celui utilisé par le déploiement du contrôleur EFS CSI.

Pour résoudre cette erreur, procédez comme suit :

1.    Récupérez l'identifiant du fournisseur OIDC de votre cluster et enregistrez-le dans une variable.

oidc_id=$(aws eks describe-cluster --name ${CLUSTER_NAME} --query "cluster.identity.oidc.issuer" --output text | cut -d '/' -f 5); echo ${oidc_id}

Veillez à remplacer CLUSTER_NAME par le nom de votre cluster.

2.    Vérifiez que l'ID du fournisseur IAM OIDC existe dans le compte AWS :

aws iam list-open-id-connect-providers | grep $oidc_id | cut -d "/" -f4

3.    Consultez le document de relation de confiance associé au rôle IAM :

aws iam get-role --role-name ${IAM_ROLE_NAME} --output json --query "Role.AssumeRolePolicyDocument"

Vérifiez que l'action sts:AssumeRoleWithWebIdentity est autorisée. Vérifiez également que l'ID IAM OIDC correspond à l'ID OIDC renvoyé par la commande précédente.

Remarque :

Vous pouvez récupérer le rôle IAM en exécutant la commande suivante :

echo $IAM_ROLE_ARN | cut -d "/" -f2

Informations connexes

Rôles IAM pour les comptes de service

Lecteur CSI EFS Amazon

AWS OFFICIEL
AWS OFFICIELA mis à jour il y a un an