¿Cómo soluciono los errores al crear un objeto de volumen persistente de Kubernetes de forma dinámica mediante el controlador CSI de Amazon EFS?

6 minutos de lectura
0

Recibo errores al crear un pod de Amazon Elastic Kubernetes Service (Amazon EKS) que usa la reclamación de volúmenes persistente. El volumen persistente se crea de forma dinámica y está en estado Pendiente.

Resolución

El controlador CSI de Amazon Elastic File System (Amazon EFS) utiliza el rol de AWS Identity and Access Management (IAM) para la cuenta de servicio (IRSA). Esta característica requiere que varios componentes, incluidos el proveedor de OpenID Connect (OIDC), el rol de IAM y los permisos de acceso, estén configurados correctamente. Estos componentes se configuran mediante la política de roles de IAM y la cuenta de servicio de Kubernetes. Siga los siguientes pasos para solucionar el problema según el mensaje de error que aparezca.

Nota: Si recibe errores al ejecutar comandos de AWS CLI, asegúrese de que utiliza la versión más reciente de AWS CLI.

storageclass.storage.k8s.io “<STORAGE_CLASS_NAME>” not found (storageclass.storage.k8s.io no se ha encontrado “<STORAGE_CLASS_NAME>”)

Este error indica que la clase de almacenamiento a la que hace referencia el parámetro storageClassName de la definición del objeto PersistentVolumeClaim no existe y debe crearse.

Para resolver este error, haga lo siguiente:

1.    Cree un objeto de clase de almacenamiento de Kubernetes.

2.    Descargue un manifiesto de clases de almacenamiento para Amazon EFS:

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

3.    Edite el archivo descargado. Busque la siguiente instrucción y, a continuación, sustituya el valor de FileSystemID por el ID de su sistema de archivos.

fileSystemId: fs-582a03f344f0fc633 # Replace the filesystem id

4.    Implemente la clase de almacenamiento:

kubectl apply -f storageclass.yaml

failed to provision volume with StorageClass "<STORAGE_CLASS_NAME>": rpc error: code = InvalidArgument desc = File System does not exist: Resource was not found (no se pudo aprovisionar el volumen con StorageClass “<STORAGE_CLASS_NAME>”: error de rpc: código = InvalidArgument desc = El sistema de archivos no existe: no se encontró el recurso)

Este error indica que el FileSystemID al que hace referencia el objeto de la clase de almacenamiento no existe en la región o es incorrecto.

Para solucionar este error, compruebe si el sistema de archivos Amazon EFS al que se hace referencia en la clase de almacenamiento es correcto y existe en la región:

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

Nota: Asegúrese de reemplazar PVC_NAME por el nombre de su PersistentVolumeClaim.

Si el sistema de archivos de EFS (FileSystemID) que se devuelve no existe en la región, elimina el objeto de clase de almacenamiento de Kubernetes. A continuación, vuelva a crearlo incluyendo el ID del sistema de archivos correcto para el campo fileSystemId.

failed to provision volume with StorageClass “<STORAGE_CLASS_NAME>”: rpc error: code = Internal desc = Failed to fetch File System info: Describe File System failed: WebIdentityErr: failed to retrieve credentials caused by: InvalidIdentityToken: No OpenIDConnect provider found in your account for https://oidc.eks.<REGION-CODE>.amazonaws.com/id/<OIDC ID> status code: 400, request id: <REQUEST ID> (no se pudo aprovisionar el volumen con StorageClass “<STORAGE_CLASS_NAME>”: error de rpc: código = Internal desc = No se pudo obtener información acerca del sistema de archivos: Error al describir el sistema de archivos: WebIdentityErr: error al recuperar las credenciales. Causado por: InvalidIdentityToken: No se encontró ningún proveedor de OpenIDConnect en su cuenta para https://oidc.eks. <REGION-CODE>.amazonaws.com/id/<OIDC ID> código de estado: 400, identificador de solicitud: <REQUEST ID>)

Este error indica que la identidad de OIDC de IAM proporcionada no se creó en IAM para el clúster de Amazon EKS.

1.    Recupere el ID del proveedor de OIDC del clúster y guárdelo en una variable:

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

Nota: Asegúrese de reemplazar CLUSTER_NAME por el nombre de su clúster.

2.    Cree un proveedor de identidad de OIDC de IAM para su clúster:

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

Nota: Si no puede usar la utilidad eksctl para crear el proveedor de OIDC de IAM, utilice la consola de administración de AWS.

no se pudo aprovisionar el volumen con StorageClass "<STORAGE_CLASS_NAME>«: error de rpc: code = Unauthenticated desc = Acceso denegado. Asegúrese de tener los permisos de AWS correctos: Access denied (Acceso denegado)

Este error indica que la IRSA no tiene los permisos de acceso necesarios (ejemplo: elasticfilesystem:CreateAccessPoint).

1.    Recupere la cuenta de servicio que utiliza la implementación del controlador CSI de EFS:

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

2.    Busque el rol de IAM que usa la cuenta de servicio:

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

3.    Descargue el documento de política de IAM de GitHub:

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

4.    Cree la política de IAM si no existe:

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

5.    Adjunte esta política de IAM al rol de IAM que recuperó anteriormente, anotada con la cuenta de servicio que utiliza la implementación del controlador CSI de 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:

Puede recuperar el identificador de la cuenta si ejecuta el siguiente comando:

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

Puede recuperar el rol de IAM si ejecuta el siguiente comando:

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

Failed to fetch File System info: Describe File System failed: WebIdentityErr: failed to retrieve credentials caused by: AccessDenied: Not authorized to perform sts:AssumeRoleWithWebIdentity (No se pudo encontrar información acerca del sistema de archivos: Error al describir el sistema de archivos: WebIdentityErr: no se pudieron recuperar las credenciales. Causado por: AccessDenied: no hay autorización para ejecutar sts:AssumeRoleWithWebIdentity)

Este error se produce debido a uno de los siguientes motivos:

  • No se proporciona el permiso de IAM sts:AssumeRoleWithWebIdentity.
  • El proveedor de identidades de OIDC de IAM que figura en el documento de relación de confianza adjunto al rol de IAM no es correcto.
  • La cuenta de servicio de Kubernetes (ejemplo: system:serviceaccount:kube-system:efs-csi-controller-sa) mencionada no coincide con la que se utiliza para implementar el controlador CSI de EFS.

Para solucionar este error, haga lo siguiente:

1.    Recupere el ID del proveedor de OIDC del clúster y guárdelo en una variable.

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

Asegúrese de reemplazar CLUSTER_NAME por el nombre de su clúster.

2.    Compruebe que el ID del proveedor de OIDC de IAM existe en la cuenta de AWS:

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

3.    Revise el documento de relación de confianza que se adjunta al rol de IAM:

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

Compruebe que la acción sts:AssumeRoleWithWebIdentity esté permitida. Además, confirme que el ID de OIDC de IAM coincide con el ID de OIDC devuelto por el comando anterior.

Nota:

Puede recuperar el rol de IAM si ejecuta el siguiente comando:

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

Información relacionada

Roles de IAM para cuentas de servicio

Controlador de CSI de Amazon EFS

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace un año