Utilizzare Workload Identity con Google Cloud

Workload Identity ti consente di assegnare identità e autorizzazioni distinte e granulari per ogni applicazione nel tuo cluster. Workload Identity è il metodo consigliato per consentire alle applicazioni in esecuzione in GKE su AWS di accedere ai serviziGoogle Cloud . Per ulteriori informazioni, consulta Workload Identity.

Questo argomento descrive come utilizzare l'identità del carico di lavoro per connetterti ai Google Cloud servizi dai tuoi carichi di lavoro.

Configura un Google Cloud account di servizio

In questa sezione crei un Google Cloud account di servizio (GSA) con autorizzazioni limitate per accedere ai servizi Google Cloud .

Ottieni il provider e il pool di identità del workload

Per configurare l'identità del carico di lavoro, devi disporre dei valori per l'URI del provider di identità e per i pool di identità per i carichi di lavoro del tuo cluster.

  1. Determina il pool di identità di carico di lavoro per il tuo cluster:

    Tutti i cluster GKE hanno un provider di identità creato nel pool di identità del workload PROJECT_ID.svc.id.goog. Per ottenere il nome del pool di identità del tuo cluster, utilizza Google Cloud CLI:

    gcloud container aws clusters describe CLUSTER_NAME \
        --location=GOOGLE_CLOUD_LOCATION \
        --format='value(workloadIdentityConfig.workloadPool)'
    

    Sostituisci quanto segue:

    • CLUSTER_NAME con il nome del cluster.
    • GOOGLE_CLOUD_LOCATION con 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.

  2. Determina il provider di identità per il tuo cluster.

    Per trovare il nome del provider di identità del tuo cluster, utilizza Google Cloud CLI:

    gcloud container aws clusters describe CLUSTER_NAME \
        --location=GOOGLE_CLOUD_LOCATION \
        --format='value(workloadIdentityConfig.identityProvider)'
    

    Sostituisci quanto segue:

    • CLUSTER_NAME
    • GOOGLE_CLOUD_LOCATION

    L'output include il nome del provider di identità del cluster. Salva questo valore. Ne avrai bisogno successivamente.

Crea un Google Cloud account di servizio

Per creare un Google Cloud account di servizio (GSA), concedergli le autorizzazioni e aggiungere un'associazione di norme IAM al GSA, svolgi i seguenti passaggi:

  1. Crea il gruppo di sicurezza gestito con Google Cloud CLI:

    gcloud iam service-accounts create GSA_NAME --project=PROJECT_ID
    

    Sostituisci quanto segue:

    • GSA_NAME: il nome del GSA per la tua applicazione.
    • PROJECT_ID: il progetto Google Cloud della GSA.
  2. 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_ROLE
    

    Sostituisci quanto segue:

    • GSA_NAME: il nome del GSA per la tua applicazione
    • PROJECT_ID: l'ID progetto per il GSA
    • IAM_ROLE: il ruolo IAM da concedere al GSA

    In questo esempio, utilizzeremo il ruolo roles/compute.viewer, che consente l'accesso di sola lettura ai servizi di calcolo:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member serviceAccount:GSA_NAME@PROJECT_ID.iam.gserviceaccount.com \
        --role roles/compute.viewer
    
  3. Concedi le autorizzazioni per il tuo account di servizio Kubernetes (KSA) per rubare l'identità del GSA. A questo scopo, aggiungi un'associazione della 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.workloadIdentityUser
    

    Sostituisci quanto segue:

    • GSA_NAME
    • PROJECT_ID
    • NAMESPACE: lo spazio dei nomi Kubernetes per l'applicazione
    • KSA_NAME: il KSA da utilizzare per l'applicazione

Deployment di un'applicazione di esempio

In questa sezione, esegui 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:

  1. 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.json
    

    Sostituisci quanto segue:

    • PROJECT_ID
    • NAMESPACE
    • KSA_NAME
    • GSA_NAME
    • IDENTITY_PROVIDER con il nome del provider di identità per il cluster.
  2. Applica il manifest al cluster

    kubectl apply -f workload-identity-sample.yaml
    
  3. Verifica che l'applicazione di esempio funzioni, controlla i log del pod:

    kubectl logs -f cloud-sdk-example -n NAMESPACE
    

    Sostituisci quanto segue:

    • NAMESPACE

    Se il pod riesce ad accedere all'API di calcolo 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

  1. Elimina l'applicazione di esempio

    kubectl delete -f manifest.yaml
    
  2. Rimuovi l'associazione del criterio IAM dall'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.workloadIdentityUser
    

    Sostituisci quanto segue:

    • GSA_NAME
    • PROJECT_ID
    • NAMESPACE
    • KSA_NAME
  3. Rimuovi l'associazione del criterio IAM dal progetto

    gcloud projects remove-iam-policy-binding PROJECT_ID \
        --member serviceAccount:GSA_NAME@PROJECT_ID.iam.gserviceaccount.com \
        --role roles/compute.viewer
    

    Sostituisci quanto segue:

    • GSA_NAME
    • PROJECT_ID
  4. Elimina l'account di servizio Google Cloud

    gcloud iam service-accounts delete \
       GSA_NAME@PROJECT_ID.iam.gserviceaccount.com
    

    Sostituisci quanto segue:

    • GSA_NAME
    • PROJECT_ID

Passaggi successivi