Come posso risolvere i problemi che si verificano durante la creazione dinamica di un oggetto di volume persistente Kubernetes tramite il controller CSI di Amazon EFS?

5 minuti di lettura
0

Quando creo un pod Amazon Elastic Kubernetes Service (Amazon EKS) che utilizza l'affermazione di volume persistente ricevo degli errori. Il volume persistente viene creato dinamicamente nello stato Pending (In sospeso).

Risoluzione

Il driver CSI di Amazon Elastic File System (Amazon EFS) utilizza la funzionalità IRSA del ruolo AWS Identity and Access Management (IAM) per l'account di servizio. Questa funzionalità richiede che vari componenti, tra cui il provider OpenID Connect (OIDC), il ruolo IAM e le autorizzazioni di accesso siano configurati correttamente. Questi componenti sono configurati utilizzando la policy del ruolo IAM e l'account del servizio Kubernetes. Utilizza la seguente procedura per la risoluzione dei problemi in base al messaggio di errore visualizzato.

Nota: se ricevi un messaggio di errore durante l'esecuzione dei comandi di AWS CLI, assicurati di utilizzare la versione più recente di AWS CLI.

storageclass.storage.k8s.io "<STORAGE_CLASS_NAME>" non trovato

Questo errore indica che la classe di archiviazione a cui fa riferimento il parametro storageClassName nella definizione dell'oggetto PersistentVolumeClaim non esiste e deve essere creata.

Per risolvere l'errore, effettua le seguenti operazioni:

1.    Crea un oggetto della classe di archiviazione Kubernetes.

2.    Scarica un manifesto delle classi di archiviazione per Amazon EFS:

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

3.    Modifica il file scaricato. Individua la seguente istruzione, quindi sostituisci il valore di fileSystemId con l'ID del tuo file system.

fileSystemId: fs-582a03f344f0fc633 # Replace the filesystem id

4.    Implementazione della classe di archiviazione:

kubectl apply -f storageclass.yaml

impossibile eseguire il provisioning del volume con StorageClass "<STORAGE_CLASS_NAME>": rpc error: code = InvalidArgument desc = Il file system non esiste: la risorsa non è stata trovata

Questo errore indica che il fileSystemId a cui fa riferimento l'oggetto della classe di archiviazione non esiste nella regione o non è corretto.

Per risolvere questo errore, verifica che il file system Amazon EFS a cui si fa riferimento nella classe di archiviazione sia corretto ed esista nella regione:

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

Nota: assicurati di sostituire PVC_NAME con il nome del tuo PersistentVolumeClaim.

Se il file system EFS (fileSystemId) restituito non esiste nella regione, elimina l'oggetto della classe di archiviazione Kubernetes. Quindi, crealo nuovamente includendo l'ID del file system corretto per il campo fileSystemId.

impossibile eseguire il provisioning del volume con StorageClass "<STORAGE_CLASS_NAME>": rpc error: code = Internal desc = Impossibile recuperare le informazioni sul file system: Descrizione del file system non riuscita: WebIdentityErr: impossibile recuperare le credenziali a causa di: InvalidIdentityToken: Nessun provider OpenIDConnect trovato nell'account per https://oidc.eks.<REGION-CODE>.amazonaws.com/id/<OIDC ID> codice stato: 400, ID richiesta: <REQUEST ID>

Questo errore indica che l'identità OIDC IAM fornita non è stata creata in IAM per il cluster Amazon EKS.

1.    Recupera l'ID del provider OIDC del cluster e archivialo in una variabile:

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

Nota: assicurati di sostituire CLUSTER_NAME con il nome del tuo cluster.

2.    Crea un provider di identità OIDC in IAM per il tuo cluster:

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

Nota: se non puoi utilizzare l'utilità eksctl per creare il provider OIDC IAM, utilizza la Console di gestione AWS.

impossibile eseguire il provisioning del volume con StorageClass "<STORAGE_CLASS_NAME>": rpc error: code = Descrizione non autenticata = Accesso negato. Assicurati di disporre delle autorizzazioni AWS corrette: Accesso negato

Questo errore indica che l'IRSA non dispone delle autorizzazioni di accesso richieste (ad esempio: elasticfilesystem:CreateAccessPoint).

1.    Recupera l'account di servizio utilizzato dall'implementazione del controller CSI EFS:

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

2.    Individua il ruolo IAM utilizzato dall'account del servizio:

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

3.    Scarica il documento sulla policy IAM da GitHub:

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

4.    Crea la policy IAM se non esiste:

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

5.    Collega questa policy IAM al ruolo IAM precedentemente recuperato, annotato con l'account di servizio utilizzato dall'implementazione del controller CSI EFS.

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

Nota:

Puoi recuperare l'ID dell'account emettendo il seguente comando:

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

Puoi recuperare il ruolo IAM emettendo il seguente comando:

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

Impossibile recuperare le informazioni sul file system: Descrizione del file system non riuscita: WebIdentityErr: recupero delle credenziali non riuscito causato da: AccessDenied: Non autorizzato a eseguire sts:AssumeRoleWithWebIdentity

Questo errore viene visualizzato per uno o più dei seguenti motivi:

  • L'autorizzazione IAM sts:AssumeRoleWithWebIdentity non è stata fornita.
  • Il provider di identità OIDC IAM elencato nel documento di relazione attendibile collegato al ruolo IAM non è corretto.
  • L'account del servizio Kubernetes (ad esempio: system:serviceaccount:kube-system:efs-csi-controller-sa) menzionato non corrisponde a quello utilizzato dall'implementazione del controller CSI EFS.

Per risolvere questo errore, procedi come segue:

1.    Recupera l'ID del provider OIDC del cluster e archivialo in una variabile.

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

Assicurati di sostituire CLUSTER_NAME con il nome del tuo cluster.

2.    Verifica che l'ID del provider IAM OIDC esista nell'account AWS:

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

3.    Esamina il documento sulla relazione di attendibilità collegato al ruolo IAM:

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

Verifica che l'azione sts:AssumeRoleWithWebIdentity sia consentita. Inoltre, verifica che l'ID OIDC IAM corrisponda all'ID OIDC restituito dal comando precedente.

Nota:

Puoi recuperare il ruolo IAM emettendo il seguente comando:

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

Informazioni correlate

Ruoli IAM per gli account di servizio

Driver CSI per Amazon EFS

AWS UFFICIALE
AWS UFFICIALEAggiornata un anno fa