Utilice la identidad de la carga de trabajo con Google Cloud

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...Google Cloud Servicios. Para obtener más información, consulte Identidad de la carga de trabajo .

Este tema describe cómo usar la identidad de la carga de trabajo para conectarse aGoogle Cloud servicios de sus cargas de trabajo.

Configurar una Google Cloud cuenta de servicio

En esta sección, crearás un Google Cloud Cuenta de servicio (GSA) con permisos limitados para acceder Google Cloud servicios.

Obtenga su grupo de identidades de carga de trabajo y su proveedor

Para configurar la identidad de la carga de trabajo, debe tener los valores para el URI del proveedor de identidad de su clúster y los grupos de identidades de la carga de trabajo .

  1. Determine el grupo de identidades de carga de trabajo para su clúster:

    Todos los clústeres de GKE tienen un proveedor de identidades creado en el grupo de identidades de la carga de trabajo PROJECT_ID .svc.id.goog . Para obtener el nombre del grupo de identidades de su clúster, use la CLI de Google Cloud:

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

    Reemplace lo siguiente:

    • CLUSTER_NAME con el nombre de su clúster.
    • GOOGLE_CLOUD_LOCATION con el nombre de la Google Cloudubicación que administra su clúster

    La salida incluye el nombre del grupo de identidades de tu clúster. Guarda este valor. Lo necesitarás más adelante.

  2. Determine el proveedor de identidad para su clúster.

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

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

    Reemplace lo siguiente:

    • CLUSTER_NAME
    • GOOGLE_CLOUD_LOCATION

    La salida incluye el nombre del proveedor de identidad de tu clúster. Guarda este valor. Lo necesitarás más adelante.

Crear una Google Cloud cuenta de servicio

Para crear una Google Cloud cuenta de servicio (GSA), otorgarle permisos y agregar un enlace de política de IAM a la GSA, realice estos pasos:

  1. Cree el GSA con la CLI de Google Cloud:

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

    Reemplace lo siguiente:

    • GSA_NAME : el nombre del GSA para su aplicación.
    • PROJECT_ID : el GSA Google Cloud proyecto.
  2. Agregue un enlace IAM para permitir que 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
    

    Reemplace lo siguiente:

    • GSA_NAME : el nombre del GSA para su aplicación
    • PROJECT_ID : el ID del proyecto para GSA
    • IAM_ROLE : el rol de IAM que se otorgará al GSA

    En este ejemplo, utilizaremos el rol roles/compute.viewer , que permite acceso de solo lectura a los servicios de cómputo:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member serviceAccount:GSA_NAME@PROJECT_ID.iam.gserviceaccount.com \
        --role roles/compute.viewer
    
  3. Otorgue permisos a su cuenta de servicio de Kubernetes (KSA) para que suplante la GSA. Para ello, agregue un enlace de política de IAM 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
    

    Reemplace lo siguiente:

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

Implementar una aplicación de muestra

En esta sección, implementará una aplicación de ejemplo que accede a la API de Compute Engine. Para usar esta aplicación de ejemplo, su cuenta de servicio debe tener asignado el rol de IAM roles/compute.viewer . Para implementar la aplicación de ejemplo, siga estos pasos:

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

    Reemplace lo siguiente:

    • PROJECT_ID
    • NAMESPACE
    • KSA_NAME
    • GSA_NAME
    • IDENTITY_PROVIDER con el nombre del proveedor de identidad para su clúster.
  2. Aplicar el manifiesto a su clúster

    kubectl apply -f workload-identity-sample.yaml
    
  3. Verifique que la aplicación de muestra esté funcionando, verifique los registros del Pod:

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

    Reemplace lo siguiente:

    • NAMESPACE

    Si el pod logra acceder a la API de Google Cloud Computing, verá 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
    

Limpiando

  1. Eliminar la aplicación de muestra

    kubectl delete -f manifest.yaml
    
  2. Eliminar la vinculación de la 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
    

    Reemplace lo siguiente:

    • GSA_NAME
    • PROJECT_ID
    • NAMESPACE
    • KSA_NAME
  3. Eliminar el enlace de la 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
    

    Reemplace lo siguiente:

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

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

    Reemplace lo siguiente:

    • GSA_NAME
    • PROJECT_ID

¿Qué sigue?