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.
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.
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:
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
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ónPROJECT_ID
: el ID de proyecto de la GSAIAM_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
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ónKSA_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:
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.
Aplica el manifiesto a tu clúster
kubectl apply -f workload-identity-sample.yaml
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
Eliminar la aplicación de ejemplo
kubectl delete -f manifest.yaml
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
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
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