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 .
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.
-
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:
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.
-
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
-
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:
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.
-
Aplicar el manifiesto a su clúster
kubectl apply -f workload-identity-sample.yaml
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
Eliminar la aplicación de muestra
kubectl delete -f manifest.yaml
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
-
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
-
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
-