Usar Workload Identity con Google Cloud

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

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

Configurar una cuenta de servicio de Google Cloud

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

Obtener tu grupo y proveedor de identidades de carga de trabajo

Para configurar la identidad de carga de trabajo, debes tener los valores del URI del proveedor de identidades y de los grupos de identidades de carga de trabajo de tu clúster.

  1. Determina el grupo de identidades de carga de trabajo de tu clúster:

    Todos los clústeres de GKE tienen un proveedor de identidades creado en el grupo de identidades de carga 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)'
    

    Haz los cambios siguientes:

    • CLUSTER_NAME por el nombre de tu clúster.
    • GOOGLE_CLOUD_LOCATION con el nombre de la Google Cloud ubicación que gestiona tu 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 identidades de tu clúster.

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

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

    Haz los cambios siguientes:

    • 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 Google Cloud cuenta de servicio

Para crear una Google Cloud cuenta de servicio (GSA), concederle permisos y añadir un enlace de política de gestión de identidades y accesos a la GSA, sigue estos pasos:

  1. Crea la cuenta de servicio con Google Cloud CLI:

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

    Haz los cambios siguientes:

    • GSA_NAME: el nombre del GSA de tu aplicación.
    • PROJECT_ID: proyecto de la GSA. Google Cloud
  2. Añade una vinculación de gestión de identidades y accesos 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
    

    Haz los cambios siguientes:

    • GSA_NAME: el nombre de la búsqueda de sitio de Google de tu aplicación
    • PROJECT_ID: el ID de proyecto de la GSA
    • IAM_ROLE: el rol de gestión de identidades y accesos que se va a conceder a la GSA

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

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member serviceAccount:GSA_NAME@PROJECT_ID.iam.gserviceaccount.com \
        --role roles/compute.viewer
    
  3. Concede permisos a tu cuenta de servicio de Kubernetes (KSA) para suplantar la identidad de la GSA. Para ello, añade una vinculación de política de gestión de identidades y accesos con el rol 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
    

    Haz los cambios siguientes:

    • GSA_NAME
    • PROJECT_ID
    • NAMESPACE: el espacio de nombres de Kubernetes de la aplicación
    • KSA_NAME: el KSA que se va a usar en la aplicación

Desplegar una aplicación de ejemplo

En esta sección, desplegarás una aplicación de ejemplo que accede a la API Compute Engine. Para usar este ejemplo, tu cuenta de servicio debe tener asignado el rol de gestión de identidades y accesos roles/compute.viewer. Para implementar la aplicación de ejemplo, 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
    

    Haz los cambios siguientes:

    • PROJECT_ID
    • NAMESPACE
    • KSA_NAME
    • GSA_NAME
    • IDENTITY_PROVIDER con el nombre del proveedor de identidades de tu clúster.
  2. Aplica el manifiesto a tu clúster

    kubectl apply -f workload-identity-sample.yaml
    
  3. Verifica que la aplicación de ejemplo funciona. Para ello, consulta los registros del pod:

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

    Haz los cambios siguientes:

    • NAMESPACE

    Si el pod accede correctamente a la API de computación de Google Cloud, verás un resultado similar a este:

    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
    

Eliminar los recursos utilizados

  1. Eliminar la aplicación de ejemplo

    kubectl delete -f manifest.yaml
    
  2. Quita la vinculación de la política de gestión de identidades y accesos 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
    

    Haz los cambios siguientes:

    • GSA_NAME
    • PROJECT_ID
    • NAMESPACE
    • KSA_NAME
  3. Quita la vinculación de la política de gestión de identidades y accesos del proyecto.

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

    Haz los cambios siguientes:

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

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

    Haz los cambios siguientes:

    • GSA_NAME
    • PROJECT_ID

Siguientes pasos