Questa guida descrive come configurare l'identità dei carichi di lavoro su GKE su AWS per controllare l'accesso dei carichi di lavoro alle risorse Google Cloud. Include un esempio di come accedere alle risorse Google Cloud dal cluster utilizzando l'identità.
Per informazioni sull'utilizzo delle identità dei carichi di lavoro con gli account AWS IAM per controllare l'accesso alle risorse AWS, consulta Utilizzo di Workload Identity con AWS.
Panoramica
Workload Identity utilizza le autorizzazioni IAM di Google Cloud per controllare l'accesso alle risorse Google Cloud. Con Workload Identity, puoi assegnare ruoli IAM diversi a ciascun carico di lavoro. Questo controllo granulare delle autorizzazioni ti consente di seguire il principio del privilegio minimo. Senza Workload Identity, devi assegnare i ruoli IAM di Google Cloud a GKE sui nodi AWS, concedendo a tutti i carichi di lavoro su quei nodi le stesse autorizzazioni del nodo stesso.
Prerequisiti
Crea un cluster utente con Kubernetes v1.20 o versioni successive.
Se il VPC AWS utilizza un proxy o un firewall, aggiungi i seguenti URL alla lista consentita:
securetoken.googleapis.com
iamcredentials.googleapis.com
sts.googleapis.com
Dalla directory
anthos-aws
, utilizzaanthos-gke
per cambiare contesto al cluster utente.cd anthos-aws env HTTPS_PROXY=http://localhost:8118 \ anthos-gke aws clusters get-credentials CLUSTER_NAME
Sostituisci CLUSTER_NAME con il nome del tuo cluster utente.Abilita i quattro nuovi servizi richiesti per questa funzionalità con i seguenti comandi:
gcloud services enable securetoken.googleapis.com gcloud services enable iam.googleapis.com gcloud services enable iamcredentials.googleapis.com gcloud services enable sts.googleapis.com
Scrivi i nomi del pool WI e dei provider
Ogni progetto Google Cloud crea automaticamente un pool di identità per i carichi di lavoro gestiti con un nome nel formato PROJECT_ID.svc.id.goog
. Allo stesso modo,
Google Cloud crea un provider di identità il cui nome segue il pattern
https://gkehub.googleapis.com/projects/PROJECT_ID/locations/global/memberships/MEMBERSHIP_ID
.
Per ulteriori informazioni sui pool di Workload Identity, consulta Componenti abilitati per il parco risorse.
Scrivi questi nomi dal tuo ID progetto e ID membro come mostrato qui:
export PROJECT_ID=USER_PROJECT_NAME export CLUSTER_MEMBERSHIP_ID=PROJECT_MEMBERSHIP_NAME export IDP="https://gkehub.googleapis.com/projects/${PROJECT_ID}/locations/global/memberships/${CLUSTER_MEMBERSHIP_ID}" export WI_POOL="${PROJECT_ID}.svc.id.goog"
Sostituisci quanto segue:
- USER_PROJECT_NAME con il nome del progetto utente scelto dall'utente
- PROJECT_MEMBERSHIP_NAME con il nome dell'appartenenza del cluster
Crea un'associazione di criteri IAM
Crea un'associazione di criteri per consentire a un account di servizio Kubernetes di assumere l'identità di un account di servizio Google Cloud (GSA).
export K8S_NAMESPACE=KUBERNETES_NAMESPACE export KSA_NAME=KUBERNETES_SA_NAME export GCP_SA_EMAIL="WORKLOAD_IDENTITY_TEST@${PROJECT_ID}.iam.gserviceaccount.com" gcloud iam service-accounts add-iam-policy-binding \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:$WI_POOL[$K8S_NAMESPACE/$KSA_NAME]" $GCP_SA_EMAIL
Sostituisci quanto segue:
- KUBERNETES_NAMESPACE con lo spazio dei nomi Kubernetes in cui è definito l'account di servizio Kubernetes
- WORKLOAD_IDENTITY_TEST con un nome di carico di lavoro a tua scelta
- KUBERNETES_SA_NAME con il nome dell'account di servizio Kubernetes collegato all'applicazione
Crea una mappa di configurazione dell'SDK
Esegui lo script shell di seguito per archiviare i dettagli di Workload Identity in un ConfigMap. Quando un pod monta il ConfigMap, Google Cloud CLI può leggere i dettagli di Workload Identity.
cat << EOF > cfmap.yaml kind: ConfigMap apiVersion: v1 metadata: namespace: ${K8S_NAMESPACE} name: my-cloudsdk-config data: config: | { "type": "external_account", "audience": "identitynamespace:${WI_POOL}:${IDP}", "service_account_impersonation_url": "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/${GCP_SA_EMAIL}: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" } } EOF env HTTPS_PROXY=http://localhost:8118 \ kubectl apply -f cfmap.yaml
Creare un account di servizio Kubernetes
Crea un KSA sul tuo cluster utente con lo stesso nome e lo stesso spazio dei nomi utilizzato nell'associazione IAM.
cat << EOF > k8s-service-account.yaml apiVersion: v1 kind: ServiceAccount metadata: name: ${KSA_NAME} namespace: ${K8S_NAMESPACE} EOF env HTTPS_PROXY=http://localhost:8118 \ kubectl apply -f k8s-service-account.yaml
crea un pod
Quindi, crea un pod con la proiezione del token dell'account di servizio e il ConfigMap creati in precedenza.
Creare il file YAML dei pod di esempio.
cat << EOF > sample-pod.yaml apiVersion: v1 kind: Pod metadata: name: sample-pod namespace: ${K8S_NAMESPACE} spec: serviceAccountName: ${KSA_NAME} containers: - command: - /bin/bash - -c - while :; do echo '.'; sleep 500 ; done image: google/cloud-sdk name: cloud-sdk env: - name: GOOGLE_APPLICATION_CREDENTIALS value: /var/run/secrets/tokens/gcp-ksa/google-application-credentials.json volumeMounts: - name: gcp-ksa mountPath: /var/run/secrets/tokens/gcp-ksa readOnly: true volumes: - name: gcp-ksa projected: defaultMode: 420 sources: - serviceAccountToken: path: token audience: ${WI_POOL} expirationSeconds: 172800 - configMap: name: my-cloudsdk-config optional: false items: - key: "config" path: "google-application-credentials.json" EOF
Applica il codice YAML del pod al tuo cluster.
env HTTPS_PROXY=http://localhost:8118 \ kubectl apply -f sample-pod.yaml
Utilizzo di Google Cloud Workload Identity
Versioni SDK supportate
Per utilizzare la funzionalità Workload Identity di Google Cloud, devi creare il codice con un SDK che la supporti. Per un elenco delle versioni dell'SDK che supportano Google Cloud Workload Identity, consulta Fleet Workload Identity.
Esempio di codice utilizzando Workload Identity
Questa sezione include codice Python di esempio che utilizza l'identità dei carichi di lavoro Google Cloud. L'account di servizio in questo esempio utilizza un'identità con privilegi "Amministratore Cloud Storage" per elencare tutti i bucket Cloud Storage del progetto Google Cloud.
Eseguire una shell all'interno del pod.
env HTTPS_PROXY=http://localhost:8118 \ kubectl exec -it sample-pod -- bash
Esegui uno script per elencare i bucket di archiviazione del progetto.
# execute these commands inside the Pod pip install --upgrade google-cloud-storage cat << EOF > sample-list-bucket.py from google.cloud import storage storage_client = storage.Client() buckets = storage_client.list_buckets() for bucket in buckets: print(bucket.name) EOF env GOOGLE_CLOUD_PROJECT=USER_PROJECT_NAME \ python3 sample-list-bucket.py
Sostituisci USER_PROJECT_NAME con il tuo progetto Google Cloud.
Per ulteriori informazioni
- Fleet Workload Identity
- Federazione delle identità per i carichi di lavoro
- Accedi alle risorse da un provider di identità OIDC (I cluster Kubernetes sono provider di identità OIDC)
- Utilizzo di Workload Identity con AWS