¿Cómo soluciono los problemas con los montajes de volumen de EBS en Amazon EKS?

7 minutos de lectura
0

Aparece el siguiente error en mis pods al montar volúmenes de Amazon Elastic Block Store (Amazon EBS) en mi clúster de Amazon Elastic Kubernetes Service (Amazon EKS): “Timeout expired waiting for volumes to attach or mount for pod” (El tiempo de espera se agotó al esperar que los volúmenes se adjunten o se monten para el pod).

Resolución

Antes de comenzar con los siguientes pasos de solución de problemas, compruebe que cuenta con lo siguiente:

  • Los permisos de AWS Identity and Access Management (IAM) requeridos para su rol de IAM de la cuenta de servicio “ebs-csi-controller-sa”.
  • Un PersistentVolumeClaim (PVC) válido en el mismo espacio de nombres que el pod.
  • Una definición de clase de almacenamiento de EBS válida con el aprovisionador en árbol “kubernetes.io/aws-ebs” o el aprovisionador de controladores de la interfaz de almacenamiento de contenedores (CSI) de Amazon EBS “ebs.csi.aws.com”.

Compruebe que el controlador CSI de Amazon EBS y los pods de nodo estén en ejecución

El controlador CSI de Amazon EBS consta de pods de controlador que se ejecutan como implementación y pods de nodo que se ejecutan como un conjunto de daemon. Ejecute los siguientes comandos para comprobar si estos pods están en ejecución en su clúster:

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

Nota: El controlador CSI de Amazon EBS no se admite en los nodos de trabajo de Windows ni en EKS Fargate.

Asegúrese de que la versión del controlador CSI de Amazon EBS instalada sea compatible con la versión de Kubernetes del clúster.

Compruebe si el PVC ha detectado problemas al vincular al volumen persistente de EBS

Para comprobar si el PVC encontró problemas, ejecute el siguiente comando para ver los eventos. En el siguiente comando de ejemplo, reemplace pvc-name y namespace por los valores correctos para su entorno.

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

Si utiliza el aprovisionamiento dinámico de volúmenes, revise los eventos devueltos para determinar si el aprovisionamiento de volúmenes se realizó correctamente o falló. También puede ver el nombre del volumen persistente correspondiente al que está enlazado el PVC, como se muestra en el siguiente ejemplo:

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 el aprovisionamiento falló, busque el mensaje de error en los eventos.

Revise los registros de los pods del controlador CSI de Amazon EBS

Compruebe los registros del pod del controlador para comprender la causa de los errores en el montaje. Si el volumen falla durante la creación, consulte los registros de ebs-plugin y csi-provisioner. Ejecute los siguientes comandos para recuperar los registros del contenedor 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

Ejecute el siguiente comando para recuperar los registros del contenedor csi-provisioner:

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

Si los volúmenes de EBS no se pueden adjuntar al pod, revise los registros de csi-attacher para entender el motivo. Ejecute el siguiente comando para recuperar los registros del contenedor csi-attacher:

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

Compruebe que la cuenta de servicio del controlador CSI de Amazon EBS tenga anotado el rol de IAM correcto y que el rol de IAM tenga los permisos requeridos

Los errores no autorizados en sus eventos de PVC o en sus registros de ebs-csi-controller se deben a lo siguiente:

1.    Ejecute el siguiente comando para determinar si la cuenta de servicio utilizada por los pods ebs-csi-controller tiene la anotación correcta:

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

Compruebe que esté presente la siguiente anotación:

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

2.    Compruebe que se haya creado el proveedor de OIDC de IAM para el clúster y que el rol de IAM tenga los permisos necesarios para realizar llamadas a la API de EBS. Además, compruebe que la política de confianza del rol de IAM confía en la cuenta de servicio ebs-csi-controller-sa.

3.    Revise los registros de AWS CloudTrail de su cuenta para comprobar que se están realizando las llamadas de CreateVolume, AttachVolume y DetachVolume. Revise también los registros de CloudTrail para determinar qué entidad principal hizo las llamadas. Esta información lo ayuda a determinar si el rol de IAM de la cuenta de servicio está siendo utilizado por el controlador o el rol de IAM del nodo de trabajo.

Compruebe la afinidad de nodos del volumen persistente

Cada volumen persistente se crea con una afinidad de nodos que limita la conexión de volúmenes persistentes a los nodos dentro de una sola zona de disponibilidad. Esto se debe a que los volúmenes de EBS solo se pueden conectar a pods o nodos que se ejecutan en la misma zona de disponibilidad en la que se crearon. Si los pods que están programados en los nodos de una zona de disponibilidad intentan utilizar el volumen persistente de EBS en una zona de disponibilidad diferente, recibirá un error similar al siguiente:

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

Para evitarlo, utilice StatefulSets en lugar de Deployment, de modo que se cree un volumen de EBS único para cada pod de StatefulSets en la misma zona de disponibilidad que el pod.

Puede verificar la afinidad de nodos del volumen persistente al ejecutar el siguiente comando. En el siguiente comando de ejemplo, reemplace persistent-volume-name por el nombre del volumen.

kubectl describe pv <persistent-volume-name>

Nota: Tenga en cuenta que no puede montar un volumen de EBS en dos pods diferentes que se ejecuten en dos nodos de trabajo distintos. El volumen de EBS se puede conectar a los pods que se ejecutan en un nodo, pero no se puede conectar a otro nodo al mismo tiempo. Si intenta conectar el volumen de EBS a dos pods diferentes en nodos de trabajo distintos, el pod falla y recibirá un error similar al siguiente:

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

Asegúrese de que los pods del controlador de EBS tengan conectividad con la API de EC2

Si observa errores que indican tiempos de espera de conexión en los registros del controlador CSI de EBS, es posible que el controlador CSI de EBS no esté conectado a la API de EC2. Si los pods del controlador tienen problemas de conectividad con la API de EC2, verá un error similar al siguiente al crear su PVC:

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

Para corregir este error, compruebe que las subredes de los pods del controlador de EBS tengan conectividad con la API de EC2. Si ejecuta un clúster privado con un proxy HTTP/HTTPS, compruebe que los pods del controlador CSI de EBS estén configurados para utilizar el proxy HTTP/HTTPS. La instalación de Helm del controlador CSI de EBS admite la configuración de un proxy HTTP/HTTPS.


OFICIAL DE AWS
OFICIAL DE AWSActualizada hace 9 meses