Como solucionar problemas ao criar dinamicamente um objeto de volume persistente do Kubernetes usando o controlador CSI do Amazon EFS?

5 minuto de leitura
0

Estou recebendo erros ao criar um pod do Amazon Elastic Kubernetes Service (Amazon EKS) que usa a declaração de volume persistente. O volume persistente é criado dinamicamente e está no estado Pendente.

Resolução

O driver CSI do Amazon Elastic File System (Amazon EFS) usa o perfil do AWS IAM (Identity and Access Management) para o recurso de conta de serviço (IRSA). Esse recurso exige que vários componentes, incluindo o provedor OpenID Connect (OIDC), o perfil do IAM e as permissões de acesso, estejam configurados corretamente. Esses componentes são configurados usando a política de perfil do IAM e a conta de serviço do Kubernetes. Siga as etapas de solução de problemas indicadas a seguir de acordo com a mensagem de erro recebida.

Observação: se você receber erros ao executar comandos da AWS CLI, certifique-se de estar utilizando a versão mais recente da AWS CLI.

storageclass.storage.k8s.io "<STORAGE_CLASS_NAME>" não encontrado

Esse erro indica que a classe de armazenamento referenciada pelo parâmetro storageClassName na definição do objeto PersistentVolumeClaim não existe e deve ser criada.

Para resolver esse erro, faça o seguinte:

1.    Crie um objeto de classe de armazenamento Kubernetes.

2.    Baixe um manifesto de classe de armazenamento para o Amazon EFS:

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

3.    Edite o arquivo baixado. Encontre a instrução a seguir e substitua o valor de fileSystemId pelo ID do seu sistema de arquivos.

fileSystemId: fs-582a03f344f0fc633 # Replace the filesystem id

4.    Implante a classe de armazenamento:

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

Esse erro indica que o fileSystemId referenciado pelo objeto da classe de armazenamento não existe na região ou está incorreto.

Para solucionar esse erro, verifique se o sistema de arquivos do Amazon EFS referenciado na classe de armazenamento está correto e existe na região:

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

Observação: certifique-se de substituir PVC_NAME pelo nome do seu PersistentVolumeClaim.

Se o sistema de arquivos EFS (fileSystemId) retornado não existir na região, exclua o objeto da classe de armazenamento Kubernetes. Em seguida, crie-o novamente incluindo o ID correto do sistema de arquivos para o 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>

Esse erro indica que a identidade OIDC do IAM fornecida não foi criada no IAM para o cluster do Amazon EKS.

1.    Recupere o ID do provedor OIDC do seu cluster e armazene-o em uma variável:

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

Observação: certifique-se de substituir CLUSTER_NAME pelo nome do seu cluster.

2.    Crie um provedor de identidade OIDC do IAM para seu cluster:

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

Observação: se você não puder usar o utilitário eksctl para criar o provedor OIDC do IAM, use o Console de Gerenciamento da AWS.

failed to provision volume with StorageClass "<STORAGE_CLASS_NAME>": rpc error: code = Unauthenticated desc = Access Denied. Please ensure you have the right AWS permissions: Access denied

Esse erro indica que o IRSA não tem as permissões de acesso necessárias (exemplo: elasticfilesystem:CreateAccessPoint).

1.    Recupere a conta de serviço usada pela implantação do controlador EFS CSI:

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

2.    Encontre o perfil do IAM usado pela conta de serviço:

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

3.    Baixe o documento de política do IAM no GitHub:

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

4.    Crie a política do IAM se ela não existir:

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

5.    Anexe essa política do IAM à função do IAM que você recuperou anteriormente, anotada com a conta de serviço usada pela implantação do controlador 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}

Observação:

Você pode recuperar o ID da conta executando o seguinte comando:

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

Você pode recuperar o perfil do IAM executando o seguinte 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

Você recebe esse erro por um dos seguintes motivos:

  • A permissão do IAM sts:AssumeRoleWithWebIdentity não é fornecida.
  • O provedor de identidade OIDC do IAM listado no documento de relacionamento de confiança anexado ao perfil do IAM não está correto.
  • A conta de serviço do Kubernetes (exemplo: system:serviceaccount:kube-system:efs-csi-controller-sa) mencionada não corresponde à usada pela implantação do controlador EFS CSI.

Para solucionar esse erro, siga estas etapas:

1.    Recupere o ID do provedor OIDC do seu cluster e armazene-o em uma variável.

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

Certifique-se de substituir CLUSTER_NAME pelo nome do seu cluster.

2.    Verifique se o ID do provedor OIDC do IAM existe na conta da AWS:

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

3.    Analise o documento de relação de confiança que está anexado ao perfil do IAM:

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

Verifique se a ação sts:AssumeRoleWithWebIdentity é permitida. Além disso, confirme se o ID OIDC do IAM corresponde ao ID OIDC retornado pelo comando anterior.

Observação:

Você pode recuperar o perfil do IAM executando o seguinte comando:

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

Informações relacionadas

Perfis do IAM para contas de serviço

Driver CSI do Amazon EFS

AWS OFICIAL
AWS OFICIALAtualizada há um ano