Como soluciono problemas com minhas montagens de volume do EBS no Amazon EKS?

Data da última atualização: 24/03/2022

Estou recebendo o seguinte erro em meus pods ao montar volumes do Amazon Elastic Block Store (Amazon EBS) em meu cluster do Amazon Elastic Kubernetes Service (Amazon EKS):

“O tempo limite expirou aguardando que os volumes sejam anexados ou montados para o pod”

Como corrigir isso?

Resolução

Antes de iniciar as seguintes etapas de solução de problemas, verifique se você tem o seguinte:

  • As permissões necessárias do AWS Identity and Access Management (IAM) para a função do IAM da conta de serviço “ebs-csi-controller-sa”.
  • Um PersistentVolumeClaim (PVC) válido está presente no mesmo namespace que o pod.
  • Uma definição de classe de armazenamento do EBS válida usando o provisionador na árvore "kubernetes.io/aws-ebs" ou o provisionador de driver da interface de armazenamento de contêiner (CSI) do Amazon EBS "ebs.csi.aws.com”.

Verifique se o controlador do driver CSI do Amazon EBS e os pods de nó estão sendo executados

O driver CSI do Amazon EBS consiste em pods de controlador que são executados como uma implantação e pods de nó que são executados como um daemonset. Execute os seguintes comandos para verificar se esses pods estão sendo executados no cluster:

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

Observação: o driver CSI do Amazon EBS não tem suporte nos nós de processamento do Windows ou no EKS Fargate.

Verifique se a versão instalada do driver do Amazon EBS CSI é compatível com a versão do Kubernetes do seu cluster.

Verifique se o PVC encontrou problemas durante a vinculação ao volume persistente do EBS

Para verificar se o PVC encontrou problemas, execute o seguinte comando para visualizar os eventos. No exemplo de comando a seguir, substitua pvc-name e namespace pelos valores corretos para o seu ambiente.

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

Se você estiver usando o provisionamento de volume dinâmico, analise os eventos retornados para determinar se o provisionamento de volume foi bem-sucedido ou falhou. Você também pode ver o nome do volume persistente correspondente ao qual o PVC está vinculado, conforme mostrado no exemplo a seguir:

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

Se o provisionamento falhar, encontre a mensagem de erro nos eventos.

Analisar os logs dos pods do controlador CSI do Amazon EBS

Verifique os registros do pod do controlador para entender a causa das falhas de montagem. Se o volume falhar durante a criação, consulte os logs do ebs-plugin e do csi-provisioner. Execute os seguintes comandos para recuperar os logs do contêiner 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

Execute o seguinte comando para recuperar os logs do contêiner csi-provisioner:

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

Se os volumes do EBS não estiverem se conectando ao pod, analise os logs do csi-attacher para entender o porquê. Execute o seguinte comando para recuperar os logs do contêiner csi-attacher:

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

Verifique se a conta de serviço do controlador do driver CSI do Amazon EBS está anotada com a função do IAM correta e se a função do IAM tem as permissões necessárias

Erros não autorizados em seus eventos de PVC ou nos logs do ebs-csi-controller são causados pelo seguinte:

1.    Execute o seguinte comando para determinar se a conta de serviço usada pelos pods ebs-csi-controller tem a anotação correta:

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

Verifique se a seguinte anotação está presente:

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

2.    Verifique se o provedor OIDC do IAM para o cluster foi criado e se a função do IAM tem as permissões necessárias para executar chamadas de API do EBS. Além disso, verifique se a política de confiança da função do IAM confia na conta de serviço ebs-csi-controller-sa.

3.    Revise os registros do AWS CloudTrail de sua conta para verificar se as chamadas CreateVolume, AttachVolume e DetachVolume estão sendo feitas. Analise também os registros do CloudTrail para determinar qual principal fez as chamadas. Essas informações ajudam a determinar se a função do IAM da conta de serviço está sendo usada pelo controlador ou pela função do IAM do nó de processamento.

Verifique a afinidade do nó do volume persistente

Cada volume persistente é criado com uma afinidade de nó que limita a anexação de volumes persistentes a nós dentro de uma única zona de disponibilidade. Isso ocorre porque os volumes do EBS só podem ser anexados a pods ou nós em execução na mesma zona de disponibilidade em que foram criados. Se os pods programados em nós em uma zona de disponibilidade tentarem usar o volume persistente do EBS em uma zona de disponibilidade diferente, você receberá um erro semelhante ao seguinte:

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

Para evitar isso, use StatefulSets em vez de Deployment, para que um volume exclusivo do EBS seja criado para cada pod dos StatefulSets na mesma zona de disponibilidade do pod.

Você pode verificar a afinidade do nó do volume persistente executando o seguinte comando. No exemplo de comando a seguir, substitua persistent-volume-name pelo nome do volume.

kubectl describe pv <persistent-volume-name>

Observação: lembre-se de que você não pode montar um volume do EBS em dois pods diferentes em execução em dois nós de processamento diferentes. O volume do EBS pode ser anexado a pods em execução em um nó, mas não pode ser conectado a outro nó ao mesmo tempo. Se você tentar anexar o volume do EBS a dois pods diferentes em nós de processamento diferentes, o pod falhará e você receberá um erro semelhante ao seguinte:

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

Certifique-se de que os pods do controlador do EBS tenham conectividade com a API do EC2

Se você vir erros indicando tempos limite de conexão nos logs do controlador EBS-CSI, o controlador do EBS CSI pode não estar conectado à API do EC2. Se os pods do controlador tiverem problemas de conectividade com a API do EC2, você verá um erro semelhante ao seguinte ao criar seu PVC:

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

Para corrigir esse erro, verifique se as sub-redes dos pods do controlador do EBS têm conectividade com a API do EC2. Se você estiver executando um cluster privado com um proxy HTTP/HTTPS, verifique se os pods do controlador CSI do EBS estão configurados para usar o proxy HTTP/HTTPS. A instalação do leme do driver CSI do EBS suporta a configuração de um proxy HTTP/HTTPS.


Este artigo ajudou?


Precisa de ajuda com faturamento ou suporte técnico?