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 dentro de GKE en Azure 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.
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 azure 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.
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 azure 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:
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.
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ónPROJECT_ID
: es el ID del proyecto para la GSAIAM_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
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ónKSA_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:
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.
Aplica el manifiesto al clúster.
kubectl apply -f workload-identity-sample.yaml
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
Borra la aplicación de ejemplo:
kubectl delete -f manifest.yaml
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
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
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