Workload Identity consente di assegnare identità e autorizzazioni distinte e granulari per ogni applicazione nel cluster. Workload Identity è il modo consigliato per le applicazioni in esecuzione in GKE su AWS di accedere Google Cloud ai servizi. Per maggiori informazioni, consulta Workload Identity.
Questo argomento descrive come utilizzare Workload Identity per connetterti ai Google Cloud servizi dai tuoi carichi di lavoro.
Configura un Google Cloud service account
In questa sezione, creerai un Google Cloud service account (GSA) con autorizzazioni limitate per accedere ai Google Cloud servizi.
Recupera il pool di identità del workload e il provider
Per configurare Workload Identity, devi disporre dei valori dell'URI del provider di identità del cluster e dei pool di Workload Identity.
Determina il pool di identità del workload per il tuo cluster:
Tutti i cluster GKE hanno un provider di identità creato nel pool di Workload Identity
PROJECT_ID.svc.id.goog. Per ottenere il nome del pool di identità del cluster, utilizza Google Cloud CLI:gcloud container aws clusters describe CLUSTER_NAME \ --location=GOOGLE_CLOUD_LOCATION \ --format='value(workloadIdentityConfig.workloadPool)'Sostituisci quanto segue:
CLUSTER_NAMEcon il nome del cluster.GOOGLE_CLOUD_LOCATIONcon il nome della Google Cloud località che gestisce il cluster
L'output include il nome del pool di identità del cluster. Salva questo valore. Ne avrai bisogno successivamente.
Determina il provider di identità per il tuo cluster.
Per trovare il nome del provider di identità del cluster, utilizza Google Cloud CLI:
gcloud container aws clusters describe CLUSTER_NAME \ --location=GOOGLE_CLOUD_LOCATION \ --format='value(workloadIdentityConfig.identityProvider)'Sostituisci quanto segue:
CLUSTER_NAMEGOOGLE_CLOUD_LOCATION
L'output include il nome del provider di identità del cluster. Salva questo valore. Ne avrai bisogno successivamente.
Crea un Google Cloud service account
Per creare un Google Cloud service account (GSA), concedergli le autorizzazioni e aggiungere un'associazione di policy IAM al GSA, segui questi passaggi:
Crea il GSA con Google Cloud CLI:
gcloud iam service-accounts create GSA_NAME --project=PROJECT_IDSostituisci quanto segue:
GSA_NAME: il nome del GSA per la tua applicazione.PROJECT_ID: il progetto del GSA Google Cloud .
Aggiungi un'associazione IAM per consentire al GSA di accedere ai servizi.
gcloud projects add-iam-policy-binding PROJECT_ID \ --member serviceAccount:GSA_NAME@PROJECT_ID.iam.gserviceaccount.com \ --role IAM_ROLESostituisci quanto segue:
GSA_NAME: il nome del GSA per la tua applicazionePROJECT_ID: l'ID progetto per il GSAIAM_ROLE: il ruolo IAM da concedere al GSA
In questo esempio, utilizzeremo il ruolo
roles/compute.viewer, che consente l'accesso in sola lettura ai servizi di Compute:gcloud projects add-iam-policy-binding PROJECT_ID \ --member serviceAccount:GSA_NAME@PROJECT_ID.iam.gserviceaccount.com \ --role roles/compute.viewerConcedi al account di servizio Kubernetes (KSA) le autorizzazioni per rappresentare il GSA. Per farlo, aggiungi un'associazione di policy IAM con il ruolo
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.workloadIdentityUserSostituisci quanto segue:
GSA_NAMEPROJECT_IDNAMESPACE: lo spazio dei nomi Kubernetes per l'applicazioneKSA_NAME: il KSA da utilizzare per l'applicazione
Deployment di un'applicazione di esempio
In questa sezione, eseguirai il deployment di un'applicazione di esempio che accede all'API Compute Engine. Per utilizzare questo esempio, al tuo account di servizio deve essere concesso il ruolo IAM roles/compute.viewer. Per eseguire il deployment dell'applicazione di esempio:
Copia il seguente manifest in un file denominato
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.jsonSostituisci quanto segue:
PROJECT_IDNAMESPACEKSA_NAMEGSA_NAMEIDENTITY_PROVIDERcon il nome del provider di identità per il tuo cluster.
Applica il manifest al cluster
kubectl apply -f workload-identity-sample.yamlVerifica che l'applicazione di esempio funzioni controllando i log del pod:
kubectl logs -f cloud-sdk-example -n NAMESPACESostituisci quanto segue:
NAMESPACE
Se il pod riesce ad accedere all'API Compute di Google Cloud, vedrai un output simile al seguente:
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
Pulizia
Elimina l'applicazione di esempio
kubectl delete -f manifest.yamlRimuovi l'associazione di policy IAM dal account di servizio 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.workloadIdentityUserSostituisci quanto segue:
GSA_NAMEPROJECT_IDNAMESPACEKSA_NAME
Rimuovi l'associazione di policy IAM dal progetto
gcloud projects remove-iam-policy-binding PROJECT_ID \ --member serviceAccount:GSA_NAME@PROJECT_ID.iam.gserviceaccount.com \ --role roles/compute.viewerSostituisci quanto segue:
GSA_NAMEPROJECT_ID
Elimina il account di servizio Google Cloud
gcloud iam service-accounts delete \ GSA_NAME@PROJECT_ID.iam.gserviceaccount.comSostituisci quanto segue:
GSA_NAMEPROJECT_ID