Help us improve the AWS re:Post Knowledge Center by sharing your feedback in a brief survey. Your input can influence how we create and update our content to better support your AWS journey.
Como solucionar problemas de um provedor de OIDC e IRSA no Amazon EKS?
Meus Pods não podem usar as permissões do perfil do AWS Identity and Access Management (AWS IAM) com o token da conta do Amazon Elastic Kubernetes Service (Amazon EKS) da AWS.
Resolução
Observação: se você receber erros ao executar comandos da AWS Command Line Interface (AWS CLI), consulte Solução de problemas da AWS CLI. Além disso, verifique se você está usando a versão mais recente da AWS CLI.
Verifique se já existe um provedor IAM OIDC para seu cluster
Se um provedor OpenID Connect (OIDC) não existir, você receberá um erro semelhante ao seguinte:
“WebIdentityErr: failed to retrieve credentials\ncaused by: InvalidIdentityToken: No OpenIDConnect provider found in your account for https://oidc.eks.eu-west-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E\n\tstatus code: 400”
Para verificar se existe um provedor IAM OIDC, conclua as seguintes etapas:
-
Para verificar a URL do provedor OIDC do seu cluster, execute o seguinte comando describe-cluster da AWS CLI:
aws eks describe-cluster --name cluster_name --query "cluster.identity.oidc.issuer" --output textObservação: substitua cluster_name pelo nome do seu cluster.
Exemplo de saída:https://oidc.eks.us-west-2.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E -
Para listar os provedores IAM OIDC em sua conta, execute o seguinte comando list-open-id-connect-providers:
aws iam list-open-id-connect-providers | grep EXAMPLED539D4633E53DE1B716D3041EObservação: substitua EXAMPLED539D4633E53DE1B716D3041E pelo URL do provedor OIDC gerado do comando anterior.
Se o comando retornar uma saída, você já tem um provedor para seu cluster. Se o comando não retornar uma saída, você deverá criar um provedor IAM OIDC. Exemplo de saída:"Arn": "arn:aws:iam::111122223333:oidc-provider/oidc.eks.us-west-2.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E"
Verifique se seu perfil do IAM tem as permissões necessárias e uma política do IAM anexada
Conclua as etapas a seguir:
- Abra o console do IAM.
- No painel de navegação, escolha Perfis.
- Escolha o perfil associado à sua conta de serviço do Kubernetes.
- Escolha a guia Permissões. Em seguida, verifique a política anexada ao perfil para garantir que ela contenha as permissões necessárias para sua configuração.
- Escolha a guia Relações de confiança. Em seguida, verifique se o formato da sua política do IAM corresponde ao formato da seguinte política JSON:
Ou execute o seguinte comando get-role para verificar sua relação de confiança:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::ACCOUNT_ID:oidc-provider/oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E:sub": "system:serviceaccount:SERVICE_ACCOUNT_NAMESPACE:SERVICE_ACCOUNT_NAME", "oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E:aud": "sts.amazonaws.com" } } } ] }
Observação: substitua EKS-IRSA pelo nome do perfil do IAM para contas de serviço (IRSA).aws iam get-role --role-name EKS-IRSA
Exemplo de saída:
No JSON de saída, verifique a seção AssumeRolePolicyDocument para verificar a política de relacionamento de confiança.{ "Role": { "Path": "/", "RoleName": "EKS-IRSA", "RoleId": "AROAQ55NEXAMPLELOEISVX", "Arn": "arn:aws:iam::ACCOUNT_ID:role/EKS-IRSA", "CreateDate": "2021-04-22T06:39:21+00:00", "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::ACCOUNT_ID:oidc-provider/oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E:aud": "sts.amazonaws.com", "oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E:sub": "system:serviceaccount:SERVICE_ACCOUNT_NAMESPACE:SERVICE_ACCOUNT_NAME" } } } ] }, "MaxSessionDuration": 3600, "RoleLastUsed": { "LastUsedDate": "2021-04-22T07:01:15+00:00", "Region": "AWS_REGION" } } } - (Opcional) Atualize a relação de confiança do perfil para a região da AWS, nome da conta de serviço Kubernetes ou namespace Kubernetes corretos.
Verifique se você criou uma conta de serviço
Para verificar se existe uma conta de serviço, execute o seguinte comando:
kubectl get sa -n YOUR_NAMESPACE
Observação: substitua YOUR_NAMESPACE pelo seu namespace Kubernetes.
Exemplo de saída:
NAME SECRETS AGEdefault 1 28d irsa 1 66m
Certifique-se de que a saída liste sua conta de serviço. Se você não tiver uma conta de serviço, consulte Configure service accounts for Pods no site do Kubernetes.
Verifique se a conta de serviço tem as anotações de perfis do IAM corretas
Para verificar se sua conta de serviço tem as anotações de perfil do IAM corretas, execute o seguinte comando:
kubectl describe sa irsa -n YOUR_NAMESPACE
Observação: substitua irsa pelo nome da sua conta de serviço Kubernetes e YOUR_NAMESPACE pelo seu namespace Kubernetes.
Exemplo de saída:
Name: irsa Namespace: default Labels: none Annotations: eks.amazonaws.com/role-arn: arn:aws:iam::ACCOUNT_ID:role/IAM_ROLE_NAME Image pull secrets: none Mountable secrets: irsa-token-v5rtc Tokens: irsa-token-v5rtc Events: none
Verifique as Anotações para garantir que o perfil do IAM esteja correto. Se não estiver, execute o seguinte comando para editar a conta de serviço:
kubectl edit sa -n NAMESPACE
Observação: substitua NAMESPACE pelo seu namespace.
Em seguida, atualize o valor de Anotações com o perfil do IAM correto.
Verifique se você especificou corretamente o serviceAccountName em seu Pod
Para verificar o serviceAccountName, execute o seguinte comando:
kubectl get pod POD_NAME -o yaml -n YOUR_NAMESPACE| grep -i serviceAccountName:
Observação: substitua POD_NAME pelo seu pod do Kubernetes e YOUR_NAMESPACE pelo seu namespace.
Exemplo de saída:
serviceAccountName: irsa
Se o valor na saída for o nome incorreto da conta de serviço, edite o manifesto de implantação com o nome correto. Em seguida, reimplante o manifesto de implantação.
Verifique as variáveis e permissões do ambiente
Para verificar as variáveis de ambiente do Pod, execute o seguinte comando:
kubectl -n YOUR_NAMESPACE exec -it POD_NAME -- env | grep AWS
Exemplo de saída:
AWS_REGION=ap-southeast-2 AWS_ROLE_ARN=arn:aws:iam::111122223333:role/EKS-IRSA AWS_WEB_IDENTITY_TOKEN_FILE=/var/run/secrets/eks.amazonaws.com/serviceaccount/token AWS_DEFAULT_REGION=ap-southeast-2
Certifique-se de que a saída liste sua conta de serviço. Se você não tiver uma conta de serviço, consulte Configure service accounts for pods no site do Kubernetes.
Verifique se a aplicação usa um AWS SDK compatível
Sua versão do AWS SDK deve ser maior ou igual à versão exigida para seu AWS SDK.
Recriar pods
Se você criou Pods antes de aplicar o IRSA, execute o seguinte comando para recriar os Pods:
kubectl rollout restart deploy nginx
Exemplo de saída:
deployment.apps/nginx restarted
Para implantações de daemonsets ou statefulsets, execute o seguinte comando:
kubectl rollout restart deploy DEPLOYMENT_NAME
Se você criou apenas um Pod, deverá excluí-lo e recriá-lo. Conclua as etapas a seguir:
- Para excluir o Pod, execute o seguinte comando:
Observação: substitua POD_NAME pelo nome do seu Pod.kubectl delete pod POD_NAME - Execute o seguinte comando para recriar o Pod:
Observação: substitua SPEC_FILE pelo nome do caminho e nome de arquivo do manifesto do Kubernetes.kubectl apply -f SPEC_FILE
Verifique se o público está correto
Se você criou o provedor OIDC com o público incorreto, receberá o seguinte erro:
“Error - An error occurred (InvalidIdentityToken) when calling the AssumeRoleWithWebIdentity operation: Incorrect token audience”
Para verificar o provedor de identidade do IAM do seu cluster, execute o seguinte comando get-open-id-connect-provider:
aws iam get-open-id-connect-provider --open-id-connect-provider-arn arn:aws:iam::ACCOUNT_ID:oidc-provider/oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E
Observação: substitua ACCOUNT_ID pelo ID da sua conta, AWS_REGION pela sua região e EXAMPLED539D4633E53DE1B716D3041E pelo URL do seu provedor OIDC.
Exemplo de saída:
{ "Url": "oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E", "ClientIDList": [ "sts.amazonaws.com" ], "ThumbprintList": [ "9e99a48a9960b14926bb7f3b02e22da2b0ab7280" ], "CreateDate": "2021-01-21T04:29:09.788000+00:00", "Tags": [] }
Na saída, certifique-se de que ClientIDList seja sts.amazonaws.com. Caso contrário, adicione um provedor de identidade ao perfil e insira sts.amazonaws.com para Público.
Verifique se você configurou a impressão digital correta
Se a impressão digital que você configurou no IAM OIDC não estiver correta, você receberá o seguinte erro:
“failed to retrieve credentials caused by: InvalidIdentityToken: OpenIDConnect provider's HTTPS certificate doesn't match configured thumbprint”
Para configurar automaticamente a impressão digital correta, use eksctl ou o console do Amazon EKS para criar o provedor de identidade IAM. Para conhecer outras formas de obter uma impressão digital, consulte Obter a impressão digital para um provedor de identidade OpenID Connect.
(Somente região da AWS China) Verifique a variável de ambiente AWS_DEFAULT_REGION
Para implantar um Pod ou daemonset aplicado pelo IRSA em um cluster na região da AWS China, você deve definir AWS_DEFAULT_REGION na especificação do Pod. Se você não definir a variável de ambiente AWS_DEFAULT_REGION, poderá receber o seguinte erro para seu Pod ou daemonset:
“An error occurred (InvalidClientTokenId) when calling the GetCallerIdentity operation: The security token included in the request is invalid”
Para adicionar a variável de ambiente AWS_DEFAULT_REGION à sua especificação de Pod ou daemonset, crie um manifesto de implantação semelhante ao exemplo a seguir:
apiVersion: apps/v1kind: Deployment metadata: name: my-app spec: template: metadata: labels: app: my-app spec: serviceAccountName: my-app containers: - name: my-app image: my-app:latest env: - name: AWS_DEFAULT_REGION value: "AWS_REGION" ...
Ou execute o seguinte comando para definir a variável de ambiente:
kubectl set env deployment deployment_name AWS_DEFAULT_REGION=example_region -n NAMESPACE"
Observação: substitua deployment_name pelo seu nome de implantação, example_region pela região da AWS China e NAMESPACE pelo seu namespace.
- Tópicos
- Containers
- Idioma
- Português
Vídeos relacionados


Conteúdo relevante
- feita há 4 meses
AWS OFICIALAtualizada há 2 anos