Al usar AWS re:Post, aceptas las AWS re:Post Términos de uso

¿Cómo puedo solucionar los problemas de un proveedor de OIDC e IRSA en Amazon EKS?

7 minutos de lectura
0

Mis pods no pueden usar los permisos del rol de AWS Identity and Access Management (IAM) con el token de cuenta de Amazon Elastic Kubernetes Service (Amazon EKS).

Resolución

Cómo comprobar si ya tiene un proveedor OIDC de IAM para su clúster

Si ya existe un proveedor, se mostrará un error similar al siguiente: «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 comprobar si ya tiene un proveedor de OIDC de IAM, siga estos pasos:

  1. Compruebe la URL del proveedor de OIDC de su clúster:

    $ aws eks describe-cluster --name cluster_name --query "cluster.identity.oidc.issuer" --output text

    Resultado del ejemplo:

    https://oidc.eks.us-west-2.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E
  2. Enumere los proveedores de OIDC de IAM de su cuenta. Sustituya EXAMPLED539D4633E53DE1B716D3041E por el valor que haya obtenido del comando anterior:

    aws iam list-open-id-connect-providers | grep EXAMPLED539D4633E53DE1B716D3041E

    Resultado del ejemplo:

    "Arn": "arn:aws:iam::111122223333:oidc-provider/oidc.eks.us-west-2.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E"

Si el comando devuelve un resultado, significa que ya tiene un proveedor para su clúster. Si el comando no devuelve ningún resultado, debe crear un proveedor de OIDC de IAM.

Cómo comprobar si su rol de IAM tiene los permisos necesarios y una política de IAM adjunta

Nota: Si se muestran errores al ejecutar comandos de la interfaz de la línea de comandos de AWS (AWS CLI), consulte Troubleshoot AWS CLI errors. Además, asegúrese de utilizar la versión más reciente de la AWS CLI.

Para comprobar que su rol de IAM tenga los permisos necesarios, siga estos pasos:

  1. Abra la consola de IAM.
  2. En el panel de navegación, elija Roles.
  3. Seleccione el rol que desee verificar.
  4. En la pestaña Permisos, compruebe que la política necesaria esté asociada al rol.
  5. Verifique que las relaciones de confianza de los roles de IAM estén configuradas correctamente.

Para comprobar que su rol de IAM tenga una política adjunta, siga estos pasos:

  1. Abra la consola de IAM.

  2. En el panel de navegación, elija Roles.

  3. Seleccione el rol que desee comprobar.

  4. Seleccione la pestaña Relaciones de confianza. Verifique que el formato de su política coincida con el formato de la siguiente 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"
            }
          }
        }
      ]
    }

    Para verificar las relaciones de confianza, ejecute el comando get-role en la interfaz de la línea de comandos de AWS (AWS CLI):

    $ aws iam get-role --role-name EKS-IRSA

    Nota: Sustituya EKS-IRSA por el nombre de su rol de IAM.
    En el JSON de salida, busque la sección AssumeRolePolicyDocument.
    Resultado del ejemplo:

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

    Nota: En función de su caso de uso, actualice la región de AWS, el nombre de la cuenta de servicio de Kubernetes y el espacio de nombres de Kubernetes.

Cómo comprobar si ha creado una cuenta de servicio

Ejecute el siguiente comando:

$ kubectl get sa -n YOUR_NAMESPACE

Nota: Sustituya YOUR_NAMESPACE por su espacio de nombres de Kubernetes.

Resultado del ejemplo:

NAME      SECRETS   AGEdefault   1         28d
irsa      1         66m

Si no tiene una cuenta de servicio, consulte Configure Service Accounts for Pods en el sitio web de Kubernetes.

Cómo verificar si la cuenta de servicio tiene las anotaciones de rol de IAM correctas

Para comprobar que su cuenta de servicio tenga las anotaciones de rol de IAM correctas, ejecute el siguiente comando:

$ kubectl describe sa irsa -n YOUR_NAMESPACE

Nota: Sustituya irsa por el nombre de su cuenta de servicio de Kubernetes y YOUR_NAMESPACE por su espacio de nombres de Kubernetes.

Resultado del ejemplo:

Name:                irsaNamespace:           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

Cómo verificar si ha especificado correctamente serviceAccountName en su pod

Para verificar el serviceAccountName, ejecute el siguiente comando:

$ kubectl get pod POD_NAME  -o yaml -n YOUR_NAMESPACE| grep -i serviceAccountName:

Nota: Sustituya POD_NAME y YOUR_NAMESPACE por su pod y espacio de nombres de Kubernetes.

Resultado del ejemplo:

serviceAccountName: irsa

Comprobación de las variables de entorno y los permisos

Busque AWS_ROLE_ARN y AWS_WEB_IDENTITY_TOKEN_FILE en las variables de entorno del pod:

$ kubectl -n YOUR_NAMESPACE exec -it POD_NAME -- env | grep AWS

Resultado del ejemplo:

AWS_REGION=ap-southeast-2AWS_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

Cómo verificar si la aplicación utiliza un SDK de AWS compatible

La versión del SDK debe ser superior o igual a los siguientes valores:

Java (Version 2) — 2.10.11Java — 1.11.704
Go — 1.23.13
Python (Boto3) — 1.9.220
Python (botocore) — 1.12.200
AWS CLI — 1.16.232
Node — 3.15.0
Ruby — 2.11.345
C++ — 1.7.174
.NET — 3.3.659.1
PHP — 3.110.7

Para comprobar la última versión del SDK compatible, consulte Uso de un SDK de AWS compatible.

Cómo volver a crear pods

Si creó pods antes de aplicar IRSA, ejecute el siguiente comando para volver a crear los pods:

$ kubectl rollout restart deploy nginx

Resultado del ejemplo:

deployment.apps/nginx restarted

Para los despliegues de daemonsets o satefulsets, ejecute el siguiente comando:

$ kubectl rollout restart deploy DEPLOYMENT_NAME

Si solo ha creado un pod, debe eliminarlo y volver a crearlo:

  1. Para eliminar el pod, ejecute el siguiente comando:
    $ kubectl delete pod POD_NAME
    Nota: Sustituya POD_NAME por el nombre de su pod.
  2. Ejecute el siguiente comando para volver a crear el pod:
    $ kubectl apply -f SPEC_FILE
    Nota: Sustituya SPEC_FILE por la ruta y el nombre del archivo de manifiesto de Kubernetes.

Cómo verificar si la audiencia es correcta

Si ha creado el proveedor de OIDC con la audiencia incorrecta, se mostrará el siguiente error: «Error - An error occurred (InvalidIdentityToken) when calling the AssumeRoleWithWebIdentity operation: Incorrect token audience».

Compruebe el proveedor de identidad de IAM de su clúster. Su ClientIDList es sts.amazonaws.com:

$ 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

Resultado del ejemplo:

{  "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": []
}

Cómo verificar si ha configurado la huella digital correcta

Si la huella digital configurada en el OIDC de IAM no es correcta, se mostrará el siguiente error: «failed to retrieve credentials caused by: InvalidIdentityToken: OpenIDConnect provider's HTTPS certificate doesn't match configured thumbprint».

Para configurar automáticamente la huella digital correcta, utilice eksctl o la Consola de administración de AWS para crear el proveedor de identidad de IAM. Para ver otras formas de obtener una huella digital, consulte Obtención de la huella digital de un proveedor de identidades OpenID Connect.

Región de AWS de China: comprobación de la variable de entorno AWS_DEFAULT_REGION

En el caso de un pod o daemonset aplicado por IRSA que esté desplegado en un clúster de la región de AWS de China, defina la variable de entorno AWS_DEFAULT_REGION en la especificación del pod. Si no configura esta variable, es posible que el pod o el daemonset muestren el siguiente error:«An error occurred (InvalidClientTokenId) when calling the GetCallerIdentity operation: The security token included in the request is invalid».

Para agregar la variable de entorno AWS_DEFAULT_REGION a la especificación del pod o daemonset, ejecute un comando similar al del siguiente ejemplo:

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"
...
OFICIAL DE AWS
OFICIAL DE AWSActualizada hace 10 meses