Saltar al contenido

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

8 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 AWS de Amazon Elastic Kubernetes Service (Amazon EKS).

Solución

Nota: Si se muestran errores al ejecutar comandos de la Interfaz de la línea de comandos de AWS (AWS CLI), consulta Solución de problemas de AWS CLI. Además, asegúrate de utilizar la versión más reciente de la AWS CLI.

Cómo comprobar si ya tienes un proveedor de OIDC de IAM para tu clúster

Si no existe un proveedor de OpenID Connect (OIDC), recibirás 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 tienes un proveedor de OIDC de IAM, sigue estos pasos:

  1. Para comprobar la URL del proveedor de OIDC de tu clúster, ejecuta el siguiente comando describe-cluster de la AWS CLI:

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

    Nota: Sustituye cluster_name por el nombre de tu clúster.
    Resultado de ejemplo:

    https://oidc.eks.us-west-2.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E
  2. Para enumerar los proveedores de OIDC de IAM de tu cuenta, ejecuta el siguiente comando list-open-id-connect-providers:

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

    Nota: Sustituye EXAMPLED539D4633E53DE1B716D3041E por la URL del proveedor de OIDC que hayas obtenido del comando anterior.
    Si el comando devuelve un resultado, significa que ya tienes un proveedor para tu clúster. Si el comando no devuelve ningún resultado, debes crear un proveedor de OIDC de IAM. Resultado de ejemplo:

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

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

Sigue estos pasos:

  1. Abre la consola de IAM.
  2. En el panel de navegación, selecciona Roles.
  3. Elige el rol que está asociado a tu cuenta de servicio de Kubernetes.
  4. Selecciona la pestaña Permisos. A continuación, comprueba la política asociada al rol para asegurarte de que contiene los permisos necesarios para tu configuración.
  5. Elige la pestaña Relaciones de confianza. A continuación, comprueba que el formato de tu política de IAM 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"
            }
          }
        }
      ]
    }
    O bien, ejecuta el siguiente comando get-role para comprobar tu relación de confianza:
    aws iam get-role --role-name EKS-IRSA
    Nota: Sustituye EKS-IRSA por tu nombre de rol de IAM para cuentas de servicio (IRSA).
    Resultado de 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"
        }
      }
    }
    En el JSON de salida, consulta la sección AssumeRolePolicyDocument para verificar la política de relación de confianza.
  6. (Opcional) Actualiza la relación de confianza del rol con la región de AWS, el nombre de la cuenta de servicio de Kubernetes o el espacio de nombres de Kubernetes correctos.

Cómo comprobar si has creado una cuenta de servicio

Para comprobar si existe una cuenta de servicio, ejecuta el siguiente comando:

kubectl get sa -n YOUR_NAMESPACE

Nota: Sustituye YOUR_NAMESPACE por tu espacio de nombres de Kubernetes.

Resultado de ejemplo:

NAME      SECRETS   AGEdefault   1         28d
irsa      1         66m

Asegúrate de que la salida muestre tu cuenta de servicio. Si no tienes una cuenta de servicio, consulta Configuración de cuentas de servicio para 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 tu cuenta de servicio tenga las anotaciones de rol de IAM correctas, ejecuta el siguiente comando:

kubectl describe sa irsa -n YOUR_NAMESPACE

Nota: Sustituye irsa por el nombre de tu cuenta de servicio de Kubernetes y YOUR_NAMESPACE por tu espacio de nombres de Kubernetes.

Resultado de ejemplo:

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

Comprueba las anotaciones para asegurarte de que el rol de IAM es correcto. Si no lo es, ejecuta el siguiente comando para editar la cuenta de servicio:

kubectl edit sa -n NAMESPACE

Nota: Sustituye NAMESPACE por el ID de tu espacio de nombres.

A continuación, actualiza el valor de las anotaciones con el rol de IAM correcto.

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

Para verificar el serviceAccountName, ejecuta el siguiente comando:

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

Nota: Sustituye POD_NAME por tu pod de Kubernetes y YOUR_NAMESPACE por tu espacio de nombres.

Resultado de ejemplo:

serviceAccountName: irsa

Si el valor del resultado es un nombre de cuenta de servicio incorrecto, modifica el manifiesto de despliegue con el nombre correcto. A continuación, vuelve a desplegar el manifiesto de despliegue.

Comprobación de las variables de entorno y los permisos

Para comprobar las variables de entorno del pod, ejecuta el siguiente comando:

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

Resultado de ejemplo:

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

Asegúrate de que la salida muestre tu cuenta de servicio. Si no tienes una cuenta de servicio, consulta Configuración de cuentas de servicio para pods en el sitio web de Kubernetes.

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

La versión del SDK de AWS debe ser superior o igual a la versión requerida para el SDK de AWS.

Cómo volver a crear pods

Si has creado pods antes de aplicar IRSA, ejecuta el siguiente comando para volver a crear los pods:

kubectl rollout restart deploy nginx

Resultado de ejemplo:

deployment.apps/nginx restarted

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

kubectl rollout restart deploy DEPLOYMENT_NAME

Si solo has creado un pod, debes eliminarlo y volver a crearlo. Sigue estos pasos:

  1. Para eliminar el pod, ejecuta el siguiente comando:
    kubectl delete pod POD_NAME
    Nota: Sustituye POD_NAME por el nombre de tu pod.
  2. Para volver a crear el pod, ejecuta el siguiente comando:
    kubectl apply -f SPEC_FILE
    Nota: Sustituye SPEC_FILE por la ruta y el nombre del archivo de manifiesto de Kubernetes.

Cómo verificar si el público es correcto

Si has creado el proveedor de OIDC con el público incorrecto, se mostrará el siguiente error:

«Error - An error occurred (InvalidIdentityToken) when calling the AssumeRoleWithWebIdentity operation: Incorrect token audience»

Para comprobar el proveedor de identidades de IAM de tu clúster, ejecuta el siguiente 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

Nota: Sustituye ACCOUNT_ID por tu ID de cuenta, AWS_REGION por tu región y EXAMPLED539D4633E53DE1B716D3041E por la URL de tu proveedor de OIDC.

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

En el resultado, asegúrate de que ClientIDList sea sts.amazonaws.com. Si no lo es, agrega un proveedor de identidades al rol e introduce sts.amazonaws.com para Público.

Cómo verificar si has configurado la huella digital correcta

Si la huella digital que has configurado en el OIDC de IAM no es correcta, recibirás 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, utiliza eksctl o la consola de Amazon AWS para crear el proveedor de identidades de IAM. Para ver otras formas de obtener una huella digital, consulta Obtención de la huella digital de un proveedor de identidades de OpenID Connect.

(Solo región de AWS de China) Comprobación de la variable de entorno AWS_DEFAULT_REGION

Para desplegar un pod o daemonset aplicado por IRSA en un clúster de la región de China de AWS, debes configurar AWS_DEFAULT_REGION en la especificación del pod. Si no configuras la variable de entorno AWS_DEFAULT_REGION, es posible que recibas el siguiente error en tu pod o daemonset:

«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, crea un manifiesto de despliegue 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"
...

O bien, ejecuta el siguiente comando para establecer la variable de entorno:

kubectl set env deployment deployment_name AWS_DEFAULT_REGION=example_region -n NAMESPACE"

Nota: Sustituye deployment_name por el nombre de tu despliegue, example_region por la región de China de AWS y NAMESPACE por tu espacio de nombres.