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 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.

Configura los permisos de IAM

En esta sección, le otorgarás permisos a una ServiceAccount de Kubernetes para acceder a los servicios deGoogle Cloud otorgándole roles de IAM.

Obtén el grupo y el proveedor de identidades para cargas de trabajo

Para 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 identidades para cargas de trabajo de 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 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 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.

Otorga roles de IAM a tu ServiceAccount de Kubernetes

Otorga el rol de IAM en el proyecto a la ServiceAccount de Kubernetes:

gcloud projects add-iam-policy-binding PROJECT_ID \
    --member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KUBERNETES_SERVICEACCOUNT" \
    --role=IAM_ROLE \
    --condition=None

Reemplaza lo siguiente:

  • PROJECT_ID: ID del proyecto de Google Cloud
  • PROJECT_NUMBER: Es el número de tu proyecto de Google Cloud .
  • NAMESPACE: El espacio de nombres de Kubernetes para la aplicación
  • KUBERNETES_SERVICEACCOUNT: La cuenta de servicio de Kubernetes que se usará para la aplicación
  • IAM_ROLE: Es el rol de IAM que se otorgará a la cuenta de servicio de Kubernetes.

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="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KUBERNETES_SERVICEACCOUNT" \
    --role=roles/compute.viewer \
    --condition=None

Implementa una aplicación de ejemplo

En esta sección, implementarás una aplicación de muestra que acceda a la API de Compute Engine. Para usar este ejemplo, tu cuenta de servicio de Kubernetes debe tener el rol de IAM roles/compute.viewer otorgado. 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: KUBERNETES_SERVICEACCOUNT
      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",
          "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: KUBERNETES_SERVICEACCOUNT
      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
    • KUBERNETES_SERVICEACCOUNT
    • 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 accede correctamente a la API de Compute 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 del proyecto

    gcloud projects remove-iam-policy-binding PROJECT_ID \
        --member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KUBERNETES_SERVICEACCOUNT" \
        --role=roles/compute.viewer \
        --condition=None
    

    Reemplaza lo siguiente:

    • PROJECT_ID
    • PROJECT_NUMBER
    • NAMESPACE
    • KUBERNETES_SERVICEACCOUNT

¿Qué sigue?