Usa Workload Identity con Google Cloud

Workload Identity te permite asignar identidades y autorizaciones distintas y detalladas para cada aplicación en el clúster. Workload Identity es la forma recomendada para que las aplicaciones que se ejecutan en GKE en AWS accedan a los servicios de Google Cloud. Para obtener más información, consulta Workload Identity.

En este tema, se describe cómo usar Workload Identity para conectarte a los servicios de Google Cloud desde tus cargas de trabajo.

Configura una cuenta de servicio de Google Cloud

En esta sección, crearás una cuenta de servicio de Google Cloud (GSA) con permisos limitados para acceder a los servicios de Google Cloud.

Obtén el grupo y el proveedor de Workload Identity

A fin de configurar Workload Identity, debes tener los valores para el URI del proveedor de identidad de tu clúster y los grupos de Workload Identity.

  1. Determina el grupo de Workload Identity para tu clúster:

    Todos los clústeres de GKE tienen un proveedor de identidad creado en el grupo de identidades para cargas de trabajo PROJECT_ID.svc.id.goog. Para obtener el nombre del grupo de identidades de tu clúster, usa Google Cloud CLI:

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

    Reemplaza lo siguiente:

    • CLUSTER_NAME por el nombre del clúster.
    • GOOGLE_CLOUD_LOCATION por el nombre de la ubicación de Google Cloud que administra el clúster

    El resultado incluye el nombre del grupo de identidades de tu clúster. Guarda este valor. Lo necesitarás más tarde.

  2. Determina el proveedor de identidad de tu clúster.

    Para encontrar el nombre del proveedor de identidad del clúster, usa Google Cloud CLI:

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

    Reemplaza lo siguiente:

    • CLUSTER_NAME
    • GOOGLE_CLOUD_LOCATION

    El resultado incluye el nombre del proveedor de identidades de tu clúster. Guarda este valor. Lo necesitarás más tarde.

Crea una cuenta de servicio de Google Cloud.

Para crear una cuenta de servicio de Google Cloud (GSA), otórgale permisos y agrega una vinculación de política de IAM a la GSA, sigue estos pasos:

  1. Crea la GSA con Google Cloud CLI:

    gcloud iam service-accounts create GSA_NAME --project=PROJECT_ID
    

    Reemplaza lo siguiente:

    • GSA_NAME: es el nombre de la GSA para tu aplicación.
    • PROJECT_ID: es el proyecto de Google Cloud de la GSA.
  2. Agrega una vinculación de IAM para permitir que la GSA acceda a los servicios.

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member serviceAccount:GSA_NAME@PROJECT_ID.iam.gserviceaccount.com \
        --role IAM_ROLE
    

    Reemplaza lo siguiente:

    • GSA_NAME: es el nombre de la GSA para tu aplicación
    • PROJECT_ID: es el ID del proyecto para la GSA
    • IAM_ROLE: es la función de IAM que se otorgará a la GSA

    En este ejemplo, usaremos el rol roles/compute.viewer, que permite el acceso de solo lectura a los servicios de procesamiento:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member serviceAccount:GSA_NAME@PROJECT_ID.iam.gserviceaccount.com \
        --role roles/compute.viewer
    
  3. Otorga permisos para que tu cuenta de servicio de Kubernetes (KSA) actúe en nombre de GSA. Para ello, agrega una vinculación de política de IAM con la función roles/iam.workloadIdentityUser:

    gcloud iam service-accounts add-iam-policy-binding GSA_NAME@PROJECT_ID.iam.gserviceaccount.com \
        --member serviceAccount:PROJECT_ID.svc.id.goog[NAMESPACE//KSA_NAME] \
        --role roles/iam.workloadIdentityUser
    

    Reemplaza lo siguiente:

    • GSA_NAME
    • PROJECT_ID
    • NAMESPACE el espacio de nombres de Kubernetes para la aplicación
    • KSA_NAME: es la KSA que se usará para la aplicación

Implementar una aplicación de muestra

En esta sección, implementarás una aplicación de muestra que acceda a la API de Compute Engine. Para usar esta muestra, tu cuenta de servicio debe tener la función de IAM roles/compute.viewer otorgada. Para implementar la aplicación de muestra, sigue estos pasos:

  1. Copia el siguiente manifiesto en un archivo llamado workload-identity-sample.yaml.

    apiVersion: v1
    kind: Namespace
    metadata:
      name: NAMESPACE
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: KSA_NAME
      namespace: NAMESPACE
    automountServiceAccountToken: false
    ---
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: cloud-sdk-config
      namespace: NAMESPACE
    data:
      config: |
        {
          "type": "external_account",
          "audience": "identitynamespace:PROJECT_ID.svc.id.goog:IDENTITY_PROVIDER",
          "service_account_impersonation_url": "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/GSA_NAME@PROJECT_ID.iam.gserviceaccount.com:generateAccessToken",
          "subject_token_type": "urn:ietf:params:oauth:token-type:jwt",
          "token_url": "https://sts.googleapis.com/v1/token",
          "credential_source": {
            "file": "/var/run/secrets/tokens/gcp-ksa/token"
          }
        }
    ---
    apiVersion: v1
    kind: Pod
    metadata:
      name: cloud-sdk-example
      namespace: NAMESPACE
    spec:
      serviceAccount: KSA_NAME
      containers:
      - name: cloud-sdk
        image: gcr.io/google.com/cloudsdktool/cloud-sdk:latest
        command:
        - /bin/bash
        - -c
        - 'set -eu -o pipefail; while true; do gcloud compute zones list --filter="name ~ us-central1-*"; sleep 5; done'
        env:
        - name: CLOUDSDK_AUTH_CREDENTIAL_FILE_OVERRIDE
          value: /var/run/secrets/tokens/gcp-ksa/google-application-credentials.json
        - name: CLOUDSDK_CORE_PROJECT
          value: PROJECT_ID
        volumeMounts:
        - name: gcp-ksa
          mountPath: /var/run/secrets/tokens/gcp-ksa
          readOnly: true
      volumes:
      - name: gcp-ksa
        projected:
          defaultMode: 420
          sources:
          - serviceAccountToken:
              audience: PROJECT_ID.svc.id.goog
              expirationSeconds: 86400
              path: token
          - configMap:
              name: cloud-sdk-config
              optional: false
              items:
              - key: config
                path: google-application-credentials.json
    

    Reemplaza lo siguiente:

    • PROJECT_ID
    • NAMESPACE
    • KSA_NAME
    • GSA_NAME
    • IDENTITY_PROVIDER por el nombre del proveedor de identidad del clúster.
  2. Aplica el manifiesto al clúster.

    kubectl apply -f workload-identity-sample.yaml
    
  3. Verifica que la aplicación de muestra funcione, revisa los registros del Pod:

    kubectl logs -f cloud-sdk-example -n NAMESPACE
    

    Reemplaza lo siguiente:

    • NAMESPACE

    Si el Pod tiene acceso exitoso a la API de procesamiento de Google Cloud, verás un resultado similar al siguiente:

    NAME           REGION       STATUS  NEXT_MAINTENANCE  TURNDOWN_DATE
    us-central1-c  us-central1  UP
    us-central1-a  us-central1  UP
    us-central1-f  us-central1  UP
    us-central1-b  us-central1  UP
    

Realice una limpieza

  1. Borra la aplicación de ejemplo:

    kubectl delete -f manifest.yaml
    
  2. Quita la vinculación de política de IAM de la cuenta de servicio de Google Cloud

    gcloud iam service-accounts remove-iam-policy-binding \
        GSA_NAME@PROJECT_ID.iam.gserviceaccount.com \
        --member serviceAccount:PROJECT_ID.svc.id.goog[NAMESPACE//KSA_NAME] \
        roles/iam.workloadIdentityUser
    

    Reemplaza lo siguiente:

    • GSA_NAME
    • PROJECT_ID
    • NAMESPACE
    • KSA_NAME
  3. Quita la vinculación de política de IAM del proyecto

    gcloud projects remove-iam-policy-binding PROJECT_ID \
        --member serviceAccount:GSA_NAME@PROJECT_ID.iam.gserviceaccount.com \
        --role roles/compute.viewer
    

    Reemplaza lo siguiente:

    • GSA_NAME
    • PROJECT_ID
  4. Borra la cuenta de servicio de Google Cloud

    gcloud iam service-accounts delete \
       GSA_NAME@PROJECT_ID.iam.gserviceaccount.com
    

    Reemplaza lo siguiente:

    • GSA_NAME
    • PROJECT_ID

¿Qué sigue?