Asignación de un rol de IAM a la cuenta de servicio de Kubernetes - Amazon EKS

Ayude a mejorar esta página

¿Quiere contribuir a esta guía del usuario? Desplácese hasta el final de esta página y seleccione Editar esta página en GitHub. Sus contribuciones ayudarán a que nuestra guía del usuario sea mejor para todos.

Asignación de un rol de IAM a la cuenta de servicio de Kubernetes

En este tema se explica cómo configurar una cuenta de servicio de Kubernetes para asumir un rol de AWS Identity and Access Management (IAM) con el Pod Identity de EKS. Los Pods que estén configurados para usar la cuenta de servicio pueden acceder a cualquier Servicio de AWS al que el rol tenga permisos para acceder.

Para crear una asociación de Pod Identity de EKS, solo hay un paso: se crea la asociación en EKS a través de la AWS Management Console, la AWS CLI, los SDK de AWS, la AWS CloudFormation y otras herramientas. No existen datos ni metadatos sobre las asociaciones dentro del clúster en ningún objeto de Kubernetes y no se agrega ninguna anotación a las cuentas de servicio.

Requisitos previos
  • Un clúster existente. Si no tiene uno, puede crearlo mediante una de las siguientes guías de Introducción a Amazon EKS.

  • La entidad principal de IAM que va a crear la asociación debe tener iam:PassRole.

  • La última versión de AWS CLI instalada y configurada en su dispositivo o AWS CloudShell. Puede comprobar su versión actual con aws --version | cut -d / -f2 | cut -d ' ' -f1. Los administradores de paquetes tales como yum, apt-get o Homebrew para macOS suelen estar atrasados varias versiones respecto de la versión de la AWS CLI más reciente. Para instalar la versión más reciente, consulte Instalar, actualizar y desinstalar la AWS CLI y Configuración rápida con aws configure en la Guía del usuario de AWS Command Line Interface. La versión de la AWS CLI instalada en AWS CloudShell también puede estar atrasada varias versiones respecto de la versión más reciente. Para actualizarla, consulte Instalación de AWS CLI en el directorio de inicio en la Guía del usuario de AWS CloudShell.

  • La herramienta de línea de comandos de kubectl está instalada en su dispositivo o AWS CloudShell. La versión puede ser la misma o hasta una versión secundaria anterior o posterior a la versión de Kubernetes de su clúster. Por ejemplo, si la versión del clúster es 1.29, puede usar la versión 1.28, 1.29 o 1.30 de kubectl con él. Para instalar o actualizar kubectl, consulte Configuración de kubectl y eksctl.

  • Un archivo config de kubectl existente que contenga la configuración del clúster. Para crear un archivo config de kubectl, consulte Conexión de kubectl a un clúster de EKS mediante la creación de un archivo kubeconfig.

Creación de la asociación de Pod Identity de EKS

AWS Management Console
  1. Abra la consola de Amazon EKS en https://console.aws.amazon.com/eks/home#/clusters.

  2. En el panel de navegación izquierdo, seleccione Clústeres y, a continuación, seleccione el nombre del clúster para el que desea configurar el complemento de agente de Pod Identity de EKS.

  3. Elija la pestaña Acceder.

  4. En las Asociaciones de Pod Identity, elija Crear.

  5. Para el Rol de IAM, seleccione el rol de IAM con los permisos que quiere que tenga la carga de trabajo.

    nota

    La lista solo contiene roles que tienen la siguiente política de confianza, que permite a Pod Identity de EKS utilizarlas.

    { "Version": "2012-10-17", "Statement": [ { "Sid": "AllowEksAuthToAssumeRoleForPodIdentity", "Effect": "Allow", "Principal": { "Service": "pods.eks.amazonaws.com" }, "Action": [ "sts:AssumeRole", "sts:TagSession" ] } ] }
    sts:AssumeRole

    Pod Identity de EKS usa AssumeRole para asumir el rol de IAM antes de pasar las credenciales temporales a sus pods.

    sts:TagSession

    Pod Identity de EKS usa TagSession para incluir etiquetas de sesión en las solicitudes para AWS STS.

    Puede usar estas etiquetas en condition keys en la política de confianza para restringir qué cuentas de servicio, espacios de nombres y clústeres pueden usar este rol.

    Para obtener una lista de las claves de condición de Amazon EKS, consulte Condiciones de Amazon Elastic Kubernetes Service en la Referencia de autorizaciones de servicio. Para obtener más información sobre las acciones y los recursos con los que puede utilizar una clave de condición, consulte Acciones definidas por Amazon Elastic Kubernetes Service.

  6. Para el Espacio de nombres de Kubernetes, seleccione el espacio de nombres de Kubernetes que contiene la cuenta de servicio y la carga de trabajo. Si lo desea, puede especificar un espacio de nombres por nombre que no existe en el clúster.

  7. Para la Cuenta de servicio de Kubernetes, seleccione la cuenta de servicio de Kubernetes que desee usar. El manifiesto de su carga de trabajo de Kubernetes debe especificar esta cuenta de servicio. Si lo desea, puede especificar una cuenta de servicio por nombre que no exista en el clúster.

  8. (Opcional) Para las Etiquetas, elija Agregar etiqueta para agregar metadatos en un par clave-valor. Estas etiquetas se aplican a la asociación y se pueden utilizar en las políticas de IAM.

    Puede repetir este paso para agregar varias etiquetas.

  9. Seleccione Crear.

AWS CLI
  1. Si desea asociar una política de IAM existente a su rol de IAM, vaya al siguiente paso.

    Cree una política de IAM. Puede crear su propia política o copiar una política gestionada por AWS que ya conceda algunos de los permisos que necesita y personalizarla según sus requisitos específicos. Para obtener más información, consulte Creación de políticas de IAM en la Guía del usuario de IAM.

    1. Cree un archivo que incluya los permisos para los Servicios de AWS a los que quiere que accedan sus Pods. Para obtener una lista de todas las acciones para todos los Servicios de AWS, consulte la referencia de autorizaciones de servicio.

      Puede ejecutar el siguiente comando para crear un archivo de política de ejemplo que permita el acceso de solo lectura a un bucket de Amazon S3. Opcionalmente, puede almacenar información de configuración o un script de arranque en este bucket, y los contenedores de su Pod pueden leer el archivo desde el bucket y cargarlo en su aplicación. Si desea crear esta política de ejemplo, copie el siguiente contenido en su dispositivo. Sustituya my-pod-secrets-bucket por el nombre de su bucket y ejecute el comando.

      cat >my-policy.json <<EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::my-pod-secrets-bucket" } ] } EOF
    2. Cree la política de IAM.

      aws iam create-policy --policy-name my-policy --policy-document file://my-policy.json
  2. Cree un rol de IAM y asócielo a una cuenta de servicio de Kubernetes.

    1. Si tiene una cuenta de servicio de Kubernetes existente que desea que asuma un rol de IAM, puede omitir este paso.

      Cree una cuenta de servicio de Kubernetes. Copie los siguientes contenidos en su dispositivo. Reemplace my-service-account por el nombre que desee y default por un espacio de nombres diferente, si es necesario. Si cambia default, el espacio de nombres debe existir previamente.

      cat >my-service-account.yaml <<EOF apiVersion: v1 kind: ServiceAccount metadata: name: my-service-account namespace: default EOF kubectl apply -f my-service-account.yaml

      Ejecute el siguiente comando de la .

      kubectl apply -f my-service-account.yaml
    2. Ejecute el siguiente comando para crear un archivo de política de confianza para el rol de IAM.

      cat >trust-relationship.json <<EOF { "Version": "2012-10-17", "Statement": [ { "Sid": "AllowEksAuthToAssumeRoleForPodIdentity", "Effect": "Allow", "Principal": { "Service": "pods.eks.amazonaws.com" }, "Action": [ "sts:AssumeRole", "sts:TagSession" ] } ] } EOF
    3. Cree el rol. Reemplace my-role con un nombre para el rol de IAM, y my-role-description con una descripción de su función.

      aws iam create-role --role-name my-role --assume-role-policy-document file://trust-relationship.json --description "my-role-description"
    4. Adjunte la política de IAM al rol. Reemplace my-role por el nombre de su rol de IAM y my-policy por el nombre de una política existente que haya creado.

      aws iam attach-role-policy --role-name my-role --policy-arn=arn:aws:iam::111122223333:policy/my-policy
      nota

      A diferencia de los roles de IAM para cuentas de servicio, Pod Identity de EKS no utiliza ninguna anotación en la cuenta de servicio.

    5. Ejecute el siguiente comando para crear la asociación. Reemplace my-cluster por el nombre del clúster, reemplace my-service-account por el nombre que desee y default por un espacio de nombres diferente, si es necesario.

      aws eks create-pod-identity-association --cluster-name my-cluster --role-arn arn:aws:iam::111122223333:role/my-role --namespace default --service-account my-service-account

      Un ejemplo de salida sería el siguiente.

      { "association": { "clusterName": "my-cluster", "namespace": "default", "serviceAccount": "my-service-account", "roleArn": "arn:aws:iam::111122223333:role/my-role", "associationArn": "arn:aws::111122223333:podidentityassociation/my-cluster/a-abcdefghijklmnop1", "associationId": "a-abcdefghijklmnop1", "tags": {}, "createdAt": 1700862734.922, "modifiedAt": 1700862734.922 } }
      nota

      Puede especificar un espacio de nombres y una cuenta de servicio por nombre que no existe en el clúster. Debe crear el espacio de nombres, la cuenta de servicio y la carga de trabajo que utiliza la cuenta de servicio para que funcione la asociación de Pod Identity de EKS.

  3. Confirme que el rol y la cuenta de servicio se hayan configurado correctamente.

    1. Confirme que la política de confianza del rol de IAM se haya configurado correctamente.

      aws iam get-role --role-name my-role --query Role.AssumeRolePolicyDocument

      Un ejemplo de salida sería el siguiente.

      { "Version": "2012-10-17", "Statement": [ { "Sid": "Allow EKS Auth service to assume this role for Pod Identities", "Effect": "Allow", "Principal": { "Service": "pods.eks.amazonaws.com" }, "Action": [ "sts:AssumeRole", "sts:TagSession" ] } ] }
    2. Confirme que la política que adjuntó a su rol en un paso anterior se encuentre adjunta al rol.

      aws iam list-attached-role-policies --role-name my-role --query AttachedPolicies[].PolicyArn --output text

      Un ejemplo de salida sería el siguiente.

      arn:aws:iam::111122223333:policy/my-policy
    3. Establezca una variable para almacenar el nombre de recurso de Amazon (ARN) de la política que quiera utilizar. Reemplace my-policy por el nombre de la política para la que desea confirmar los permisos.

      export policy_arn=arn:aws:iam::111122223333:policy/my-policy
    4. Vea la versión predeterminada de la política.

      aws iam get-policy --policy-arn $policy_arn

      Un ejemplo de salida sería el siguiente.

      { "Policy": { "PolicyName": "my-policy", "PolicyId": "EXAMPLEBIOWGLDEXAMPLE", "Arn": "arn:aws:iam::111122223333:policy/my-policy", "Path": "/", "DefaultVersionId": "v1", [...] } }
    5. Vea el contenido de la política para asegurarse de que incluye todos los permisos que su Pod necesita. Si es necesario, reemplace 1 en el siguiente comando por la versión devuelta en la salida anterior.

      aws iam get-policy-version --policy-arn $policy_arn --version-id v1

      Un ejemplo de salida sería el siguiente.

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::my-pod-secrets-bucket" } ] }

      Si creó la política de ejemplo en un paso anterior, el resultado es el mismo. Si creó una política diferente, el contenido de example es diferente.

Siguiente paso

Configuración de pods para acceder a los servicios de AWS con cuentas de servicio