Como solucionar problemas ao criar dinamicamente um objeto de volume persistente do Kubernetes usando o controlador CSI do Amazon EFS?
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
Conteúdo relevante
- AWS OFICIALAtualizada há 8 meses
- AWS OFICIALAtualizada há um ano
- AWS OFICIALAtualizada há 2 anos