Utilice la identidad de la carga de trabajo con AWS

La identidad de la carga de trabajo le permite asignar identidades y autorizaciones específicas y específicas para cada aplicación de su clúster. La identidad de la carga de trabajo es la forma recomendada para que las aplicaciones que se ejecutan en GKE en AWS accedan a AWS y... Google Cloud Servicios. Para obtener más información, consulte Identidad de la carga de trabajo .

Este tema explica cómo crear un proveedor de OIDC, aprovisionar cuentas de servicio y probar una carga de trabajo de ejemplo mediante la identidad de la carga de trabajo. Esta página está dirigida a administradores de identidades y cuentas, operadores y desarrolladores que desean crear y administrar políticas relacionadas con los permisos de usuario. Para obtener más información sobre los roles comunes y las tareas de ejemplo a las que hacemos referencia en Google Cloud contenido, consulte Roles y tareas de usuario comunes de GKE Enterprise .

Cree un proveedor de AWS IAM OIDC para su clúster

Para usar la identidad de la carga de trabajo con su clúster, primero debe crear un proveedor de AWS IAM OIDC que haga referencia a su clúster. Si ya tiene un proveedor de IAM OIDC para su clúster, puede omitir esta sección.

Para crear el proveedor, siga estos pasos:

  1. Determine el URI del emisor de OIDC para su clúster:

    gcloud container aws clusters describe CLUSTER_NAME \
         --location=GOOGLE_CLOUD_LOCATION \
         --format='value(workloadIdentityConfig.issuerUri)'
    

    Reemplace lo siguiente:

    • CLUSTER_NAME : el nombre de su clúster
    • GOOGLE_CLOUD_LOCATION : el nombre de la Google CloudUbicación desde la que se administrará este grupo de nodos, como se define en Google Cloud regiones de gestión

    La salida incluye el URI del emisor OIDC de su clúster. Guarde este valor para el siguiente paso.

  2. A continuación, cree un proveedor OIDC de AWS IAM que haga referencia a su clúster con el siguiente comando:

    aws iam create-open-id-connect-provider \
        --url ISSUER_URI \
        --client-id-list sts.amazonaws.com \
        --thumbprint-list 08745487e891c19e3078c1f2a07e452950ef36f6
    

    Reemplace ISSUER_URI con el URI de su emisor del paso anterior.

    La huella dactilar de la Google Cloud El servicio que atiende al URI del emisor siempre es 08745487e891c19e3078c1f2a07e452950ef36f6 .

Configurar una función de AWS IAM con una política de IAM adjunta

Para configurar una función de AWS IAM y asociarle una política, siga estos pasos:

  1. Determine el host del emisor eliminando el prefijo https:// de su URI. Por ejemplo, si su URI es https://oidc-provider.com/v1/projects/pid/locations/us-west1/awsClusters/awscluster , el host será oidc-provider.com/v1/projects/pid/locations/us-west1/awsClusters/awscluster . Guarde este valor. Lo necesitará más adelante.

  2. Determine el nombre de recurso de Amazon (ARN) del proveedor ejecutando lo siguiente:

    aws iam list-open-id-connect-providers --output=text \
        --query 'OpenIDConnectProviderList[?ends_with(Arn, `ISSUER_HOST`) == `true`].Arn'
    

    Reemplace ISSUER_HOST con el nombre de host del URI del emisor del clúster.

  3. A continuación, cree una política de confianza para proporcionar las credenciales de OIDC a la cuenta de servicio de Kubernetes. Cree un archivo llamado trust-policy.json con el siguiente contenido:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "Federated": "PROVIDER_ARN"
          },
          "Action": "sts:AssumeRoleWithWebIdentity",
          "Condition": {
            "StringEquals": {
              "ISSUER_HOST:sub": "system:serviceaccount:NAMESPACE:KSA_NAME"
            }
          }
        }
      ]
    }
    

    Reemplace lo siguiente:

    • PROVIDER_ARN : el ARN del proveedor IAM OIDC del clúster
    • ISSUER_HOST : el nombre de host del URI del emisor para el clúster.
    • NAMESPACE : el espacio de nombres de Kubernetes donde se ejecuta la aplicación
    • KSA_NAME : la cuenta de servicio de Kubernetes (KSA) que se utilizará para la aplicación
  4. Crear un rol de AWS IAM:

    aws iam create-role --role-name=AWS_ROLE_NAME \
        --assume-role-policy-document file://trust-policy.json
    

    Reemplace AWS_ROLE_NAME con el nombre del rol de AWS IAM para la aplicación.

  5. Adjunte una política de AWS IAM al rol:

    aws iam attach-role-policy --role-name=AWS_ROLE_NAME \
        --policy-arn=AWS_POLICY_ARN
    

    Reemplace lo siguiente:

    • AWS_ROLE_NAME : el nombre del rol de AWS IAM para la aplicación

    Por ejemplo, para crear un rol llamado ec2-readonly , con la arn:aws:iam::aws:policy/AmazonEC2ReadOnlyAccess , ejecute el siguiente comando:

    aws iam attach-role-policy --role-name=ec2-readonly \
        --policy-arn=arn:aws:iam::aws:policy/AmazonEC2ReadOnlyAccess
    

Implementar una aplicación de muestra

Para probar la identidad de la carga de trabajo, siga estos pasos para implementar una aplicación de muestra:

  1. Determinar el ARN del rol:

    aws iam get-role --role-name=AWS_ROLE_NAME --query 'Role.Arn'
    

    Reemplace AWS_ROLE_NAME .

  2. Cree un manifiesto para un espacio de nombres de Kubernetes, una KSA y un pod. Copie el siguiente manifiesto en un archivo llamado workload-identity-test.yaml :

    apiVersion: v1
    kind: Namespace
    metadata:
      name: NAMESPACE
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: KSA_NAME
      namespace: NAMESPACE
    automountServiceAccountToken: false
    ---
    apiVersion: v1
    kind: Pod
    metadata:
      name: aws-cli-example
      namespace: NAMESPACE
    spec:
      serviceAccount: KSA_NAME
      containers:
      - name: aws-cli
        image: amazon/aws-cli:latest
        command:
        - /bin/bash
        - -c
        - "set -eu -o pipefail; while true; do aws ec2 describe-availability-zones; sleep 5; done"
        env:
        - name: AWS_ROLE_ARN
          value: AWS_ROLE_ARN
        - name: AWS_WEB_IDENTITY_TOKEN_FILE
          value: /var/run/secrets/aws-iam-token/serviceaccount/token
        - name: AWS_REGION
          value: AWS_REGION
        volumeMounts:
        - mountPath: /var/run/secrets/aws-iam-token/serviceaccount
          name: aws-iam-token
          readOnly: true
      volumes:
      - name: aws-iam-token
        projected:
          defaultMode: 420
          sources:
          - serviceAccountToken:
              audience: sts.amazonaws.com
              expirationSeconds: 86400
              path: token
    

    Reemplace lo siguiente:

    • NAMESPACE
    • KSA_NAME
    • AWS_ROLE_ARN : el ARN del rol de AWS IAM para la aplicación
    • AWS_REGION : la región de AWS del clúster
  3. Aplicar el manifiesto:

    kubectl apply -f workload-identity-test.yaml
    

    Espere unos minutos hasta que se inicie el Pod y continúe con la siguiente sección.

Verifique que la aplicación de muestra esté funcionando

Para verificar que la aplicación de muestra pueda acceder a la API de EC2, mire los registros del pod:

kubectl logs -f aws-cli-example -n NAMESPACE

Si el pod puede acceder a la API de EC2, la salida incluye información sobre las zonas de disponibilidad de EC2 y se parece a la siguiente:

-------------------------------------------------
|           DescribeAvailabilityZones           |
+-----------------------------------------------+
||              AvailabilityZones              ||
|+---------------------+-----------------------+|
||  GroupName          |  us-west-2            ||
||  NetworkBorderGroup |  us-west-2            ||
||  OptInStatus        |  opt-in-not-required  ||
||  RegionName         |  us-west-2            ||
||  State              |  available            ||
||  ZoneId             |  usw2-az1             ||
||  ZoneName           |  us-west-2a           ||
|+---------------------+-----------------------+|
||              AvailabilityZones              ||
|+---------------------+-----------------------+|
||  GroupName          |  us-west-2            ||
||  NetworkBorderGroup |  us-west-2            ||
||  OptInStatus        |  opt-in-not-required  ||
||  RegionName         |  us-west-2            ||
||  State              |  available            ||
||  ZoneId             |  usw2-az2             ||
||  ZoneName           |  us-west-2b           ||
|+---------------------+-----------------------+|
||              AvailabilityZones              ||
|+---------------------+-----------------------+|
||  GroupName          |  us-west-2            ||
||  NetworkBorderGroup |  us-west-2            ||
||  OptInStatus        |  opt-in-not-required  ||
||  RegionName         |  us-west-2            ||
||  State              |  available            ||
||  ZoneId             |  usw2-az3             ||
||  ZoneName           |  us-west-2c           ||
|+---------------------+-----------------------+|
||              AvailabilityZones              ||
|+---------------------+-----------------------+|
||  GroupName          |  us-west-2            ||
||  NetworkBorderGroup |  us-west-2            ||
||  OptInStatus        |  opt-in-not-required  ||
||  RegionName         |  us-west-2            ||
||  State              |  available            ||
||  ZoneId             |  usw2-az4             ||
||  ZoneName           |  us-west-2d           ||
|+---------------------+-----------------------+|

Limpiar

Para eliminar esta aplicación de muestra, siga estos pasos:

  1. Eliminar el manifiesto de la aplicación de muestra de su clúster:

    kubectl delete -f workload-identity-test.yaml
    
  2. Desvincular la política de AWS IAM del rol:

    aws iam detach-role-policy --role-name AWS_ROLE_NAME \
        --policy-arn arn:aws:iam::aws:policy/AmazonEC2ReadOnlyAccess
    

    Reemplace AWS_ROLE_NAME con el nombre del rol de AWS IAM para la aplicación.

  3. Eliminar la función de AWS IAM:

    aws iam delete-role --role-name AWS_ROLE_NAME
    

    Reemplace AWS_ROLE_NAME con el nombre del rol de AWS IAM para la aplicación.

  4. Eliminar el proveedor OIDC de AWS IAM:

    aws iam delete-open-id-connect-provider --open-id-connect-provider-arn PROVIDER_ARN
    

    Reemplace PROVIDER_ARN con el ARN del proveedor IAM OIDC para el clúster.

¿Qué sigue?