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.
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_NAMEpor el nombre del clúster.GOOGLE_CLOUD_LOCATIONpor 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.
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_NAMEGOOGLE_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 CloudPROJECT_NUMBER: Es el número de tu proyecto de Google Cloud .NAMESPACE: El espacio de nombres de Kubernetes para la aplicaciónKUBERNETES_SERVICEACCOUNT: La cuenta de servicio de Kubernetes que se usará para la aplicaciónIAM_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:
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.jsonReemplaza lo siguiente:
PROJECT_IDNAMESPACEKUBERNETES_SERVICEACCOUNTIDENTITY_PROVIDERpor el nombre del proveedor de identidad del clúster.
Aplica el manifiesto al clúster.
kubectl apply -f workload-identity-sample.yamlVerifica que la aplicación de muestra funcione, revisa los registros del Pod:
kubectl logs -f cloud-sdk-example -n NAMESPACEReemplaza 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
Borra la aplicación de ejemplo:
kubectl delete -f manifest.yamlQuita 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=NoneReemplaza lo siguiente:
PROJECT_IDPROJECT_NUMBERNAMESPACEKUBERNETES_SERVICEACCOUNT