Ir para o conteúdo

Como solucionar problemas de um provedor de OIDC e IRSA no Amazon EKS?

7 minuto de leitura
0

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:

  1. 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 text

    Observação: substitua cluster_name pelo nome do seu cluster.
    Exemplo de saída:

    https://oidc.eks.us-west-2.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E
  2. 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 EXAMPLED539D4633E53DE1B716D3041E

    Observaçã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:

  1. Abra o console do IAM.
  2. No painel de navegação, escolha Perfis.
  3. Escolha o perfil associado à sua conta de serviço do Kubernetes.
  4. 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.
  5. 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:
    {  "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"
            }
          }
        }
      ]
    }
    Ou execute o seguinte comando get-role para verificar sua relação de confiança:
    aws iam get-role --role-name EKS-IRSA
    Observação: substitua EKS-IRSA pelo nome do perfil do IAM para contas de serviço (IRSA).
    Exemplo de saída:
    {  "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"
        }
      }
    }
    No JSON de saída, verifique a seção AssumeRolePolicyDocument para verificar a política de relacionamento de confiança.
  6. (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:

  1. Para excluir o Pod, execute o seguinte comando:
    kubectl delete pod POD_NAME
    Observação: substitua POD_NAME pelo nome do seu Pod.
  2. Execute o seguinte comando para recriar o Pod:
    kubectl apply -f SPEC_FILE
    Observação: substitua SPEC_FILE pelo nome do caminho e nome de arquivo do manifesto do Kubernetes.

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.

AWS OFICIALAtualizada há 7 meses