Saltar al contenido

¿Por qué no puedo usar un rol de IAM para la cuenta de servicio en mi pod de Amazon EKS?

6 minutos de lectura
0

Quiero usar un rol de AWS Identity and Access Management (IAM) para una cuenta de servicio (IRSA). Sin embargo, mi pod de Amazon Elastic Kubernetes Service (Amazon EKS) no puede asumir el rol de IAM asignado. O bien, mi pod usa el rol de IAM predeterminado que está asignado al nodo de 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.

Comprobación de que tienes un proveedor de identidad de OIDC de IAM para tu clúster de Amazon EKS

Crea un proveedor de OpenID Connect (OIDC) de IAM para tu clúster, si aún no lo tienes. Debes tener un proveedor de OIDC para que tu clúster utilice un IRSA.

A continuación, sigue estos pasos para comprobar que has configurado correctamente el proveedor de OIDC:

  1. Abre la consola de IAM.
  2. En el panel de navegación, elige Proveedores de identidad.
  3. En Proveedor, identifica y anota la URL del proveedor de OIDC.
  4. En otra pestaña o ventana, abre la consola de Amazon EKS.
  5. En el panel de navegación, selecciona Clústeres.
  6. Selecciona tu clúster y, a continuación, elige la pestaña Configuración.
  7. En Detalles, comprueba el valor de la URL del proveedor de OpenID Connect. Comprueba que coincide con la URL del proveedor de OIDC en la consola de IAM.
  8. Si las URL no coinciden, debes crear un nuevo proveedor de OIDC de IAM.

Validación de las políticas de rol de IAM y la configuración de la política de confianza

Los problemas de IAM se producen cuando el rol de IAM no tiene todos los permisos necesarios. O bien, la política de relaciones de confianza de tu rol de IAM también podría tener errores de sintaxis si has creado el rol de IAM mediante la consola de administración de AWS o la AWS CLI.

Para validar tus políticas de rol de IAM y comprobar si hay errores de sintaxis en la política de confianza, sigue estos pasos:

  1. Abre la consola de IAM.
  2. En el panel de navegación, elige Roles y, a continuación, selecciona tu rol.
  3. Selecciona la pestaña Permisos y, a continuación, comprueba que has asignado al rol todos los permisos necesarios para la configuración.
  4. Selecciona la pestaña Relaciones de confianza y, a continuación, elige Editar la relación de confianza.
  5. En el documento de política de la relación de confianza, comprueba que el formato de la política coincide con el formato de la siguiente política JSON:
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "Federated": "arn:aws:iam::your-account-id:oidc-provider/oidc.eks.your-region-code.amazonaws.com/id/EXAMPLE_OIDC_IDENTIFIER"
          },
          "Action": "sts:AssumeRoleWithWebIdentity",
          "Condition": {
            "StringEquals": {
              "oidc.eks.your-region-code.amazonaws.com/id/EXAMPLE_OIDC_IDENTIFIER:sub": "system:serviceaccount:your-namespace:your-service-account",
              "oidc.eks.your-region-code.amazonaws.com/id/EXAMPLE_OIDC_IDENTIFIER:aud": "sts.amazonaws.com"
            }
          }
        }
      ]
    }
    En la política JSON, comprueba el formato de la línea de propiedad Federated y de la línea de propiedad StringEquals. En el caso de Federated, confirma que has formateado correctamente el código de región de AWS, el ID de cuenta de AWS y el identificador único de OIDC. Para StringEquals, confirma que has formateado correctamente el código de región, el identificador único de OIDC, el espacio de nombres de Kubernetes y el nombre de la cuenta de servicio de Kubernetes.
  6. Si editas el documento de política para corregir errores de formato, elige Actualizar la política de confianza.

Confirmar que la cuenta de servicio existe y que tiene una anotación con el formato correcto para el nombre de recurso de Amazon (ARN) del rol de IAM

Sigue estos pasos:

  1. Para confirmar que existe tu cuenta de servicio de Kubernetes, ejecuta el siguiente comando:
    kubectl get serviceaccount YOUR_ACCOUNT_NAME -n YOUR_NAMESPACE -o yaml
    Nota: Sustituye YOUR_ACCOUNT_NAME por el nombre de tu cuenta y YOUR_NAMESPACE por tu espacio de nombres.
    Si el comando anterior no devuelve un nombre de cuenta de servicio, crea una cuenta de servicio. Para obtener más información, consulta Uso de más de una ServiceAccount en el sitio web de Kubernetes.
  2. Confirma que tu cuenta de servicio usa el nombre que esperas. Además, confirma que la anotación role-arn tenga el formato correcto. Ejemplo:
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      annotations:
        eks.amazonaws.com/role-arn: arn:aws:iam::012345678912:role/my-example-iam-role
      name: my-example-serviceaccount
      namespace: my-test-namespace

Utilización de un pod de prueba para comprobar que la cuenta de servicio funciona

Ejecuta un pod de prueba para comprobar que la cuenta de servicio funciona correctamente, puede montar variables de entorno y puede asumir el rol de IAM especificado. Sigue estos pasos:

  1. Crea un archivo YAML local denominado awscli-pod.yaml. Ejemplo:

    apiVersion: v1
    kind: Pod
    metadata:
      name: awscli
      labels:
        app: awscli
    spec:
      serviceAccountName: YOUR_SERVICE_ACCOUNT
      containers:
      - image: amazon/aws-cli
        command:
          - "sleep"
          - "604800"
        imagePullPolicy: IfNotPresent
        name: awscli
      restartPolicy: Always

    Nota: Sustituye YOUR_SERVICE_ACCOUNT por el nombre de tu cuenta de servicio de Kubernetes.

  2. Para crear el pod de prueba a partir del archivo YAML de tu espacio de nombres, ejecuta el siguiente comando:

    kubectl apply -f ./awscli-pod.yaml -n YOUR_NAMESPACE

    Nota: Sustituye YOUR_NAMESPACE por tu espacio de nombres.

  3. Para confirmar que el pod awscli tiene las variables de entorno AWS_ROLE_ARN y AWS_WEB_IDENTITY_TOKEN_FILE, ejecuta el siguiente comando:

    kubectl exec -n YOUR_NAMESPACE awscli -- env | grep AWS

    Resultado de ejemplo:

    AWS_ROLE_ARN=arn:aws:iam::ACCOUNT_ID:role/IAM_ROLE_NAME
    AWS_WEB_IDENTITY_TOKEN_FILE=/var/run/secrets/eks.amazonaws.com/serviceaccount/token
  4. Para confirmar que el pod de prueba usa el rol de IAM correcto, ejecuta el siguiente comando:

    kubectl exec -it awscli -n YOUR_NAMESPACE -- aws sts get-caller-identity

    Resultado de ejemplo:

    {    "UserId": "REDACTEDY471234567890:botocore-session-1632772568",
        "Account": "012345678912",
        "Arn": "arn:aws:sts::012345678912:assumed-role/your-iam-role/botocore-session-1632772568"
    }

    Anota el valor de Arn. Asegúrate de que el rol de IAM sea el rol que deseas usar en el pod.

  5. Para eliminar el pod awscli, ejecuta el siguiente comando:

    kubectl delete -f ./awscli-pod.yaml -n YOUR_NAMESPACE

    Nota: Sustituye YOUR_NAMESPACE por tu espacio de nombres.

Si el pod awscli muestra el rol de IAM correcto, la característica de roles de IAM para cuentas de servicio funciona correctamente. Los pasos anteriores confirman que has montado correctamente el token de IAM en el pod. Si tu aplicación sigue sin poder usar el archivo de token de IAM, es probable que haya un problema a nivel de aplicación o SDK. Por ejemplo, puede haber problemas con la forma en que la aplicación usa las credenciales de AWS o con versiones de SDK no compatibles. Para obtener más información, consulta Uso de la cadena de proveedores de credenciales predeterminada y Uso de IRSA con AWS SDK.

OFICIAL DE AWSActualizada hace 5 meses