Workload Identity mit Google Cloud verwenden

Mit Workload Identity können Sie jeder Anwendung in Ihrem Cluster separate, detaillierte Identitäten und Autorisierungen zuweisen. Workload Identity ist die empfohlene Methode für Anwendungen, die in GKE on AWS ausgeführt werden, um aufGoogle Cloud -Dienste zuzugreifen. Weitere Informationen finden Sie unter Workload Identity.

In diesem Thema wird beschrieben, wie Sie mit Workload Identity von Ihren Arbeitslasten aus eine Verbindung zuGoogle Cloud -Diensten herstellen.

Google Cloud -Dienstkonto konfigurieren

In diesem Abschnitt erstellen Sie ein Google Cloud Dienstkonto (GSA) mit eingeschränkten Berechtigungen für den Zugriff auf Google Cloud Dienste.

Workload Identity-Pool und -Anbieter abrufen

Zum Konfigurieren von Workload Identity benötigen Sie die Werte für den URI des Identitätsanbieters des Clusters und Workload Identity-Pools.

  1. Workload Identity-Pool für Ihren Cluster ermitteln

    Alle GKE-Cluster haben einen Identitätsanbieter, der im Workload Identity-Pool PROJECT_ID.svc.id.goog erstellt wird. Verwenden Sie das Google Cloud CLI, um den Namen des Identitätspools Ihres Clusters abzurufen:

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

    Dabei gilt:

    • CLUSTER_NAME durch den Namen Ihres Clusters.
    • GOOGLE_CLOUD_LOCATION durch den Namen des Google CloudStandorts, der den Cluster verwaltet

    Die Ausgabe enthält den Namen des Identitätspools Ihres Clusters. Speichern Sie diesen Wert. Sie benötigen diese Informationen später.

  2. Identitätsanbieter für den Cluster ermitteln

    Verwenden Sie das Google Cloud CLI, um den Namen des Identitätsanbieters Ihres Clusters zu ermitteln:

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

    Dabei gilt:

    • CLUSTER_NAME
    • GOOGLE_CLOUD_LOCATION

    Die Ausgabe enthält den Namen des Identitätsanbieters Ihres Clusters. Speichern Sie diesen Wert. Sie benötigen diese Informationen später.

Dienstkonto Google Cloud erstellen

Führen Sie die folgenden Schritte aus, um ein Google Cloud Dienstkonto (GSA) zu erstellen, ihm Berechtigungen zu erteilen und dem GSA eine IAM-Richtlinienbindung hinzuzufügen:

  1. Erstellen Sie das GSA mit dem Google Cloud CLI:

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

    Dabei gilt:

    • GSA_NAME ist der Name des GSA für Ihre Anwendung.
    • PROJECT_ID ist das Google Cloud Projekt des GSA.
  2. Fügen Sie eine IAM-Bindung hinzu, damit das GSA auf Dienste zugreifen kann.

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member serviceAccount:GSA_NAME@PROJECT_ID.iam.gserviceaccount.com \
        --role IAM_ROLE
    

    Dabei gilt:

    • GSA_NAME ist der Name des GSA für Ihre Anwendung.
    • PROJECT_ID ist die Projekt-ID für das GSA.
    • IAM_ROLE ist die IAM-Rolle, die dem GSA zugewiesen werden soll.

    In diesem Beispiel verwenden wir die Rolle roles/compute.viewer, die Lesezugriff auf Compute-Dienste ermöglicht:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member serviceAccount:GSA_NAME@PROJECT_ID.iam.gserviceaccount.com \
        --role roles/compute.viewer
    
  3. Gewähren Sie dem Kubernetes-Dienstkonto (KSA) Berechtigungen, um die Identität des GSA zu übernehmen. Fügen Sie dazu eine IAM-Richtlinienbindung mit der Rolle roles/iam.workloadIdentityUser hinzu:

    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
    

    Dabei gilt:

    • GSA_NAME
    • PROJECT_ID
    • NAMESPACE durch den Kubernetes-Namespace für die Anwendung ersetzen.
    • KSA_NAME durch das für die Anwendung zu verwendende KSA ersetzen.

Beispielanwendung bereitstellen

In diesem Abschnitt stellen Sie eine Beispielanwendung bereit, die auf die Compute Engine API zugreift. Damit Sie dieses Beispiel verwenden können, muss Ihrem Dienstkonto die IAM-Rolle roles/compute.viewer zugewiesen sein. So stellen Sie die Beispielanwendung bereit:

  1. Kopieren Sie das folgende Manifest in eine Datei mit dem Namen 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
    

    Dabei gilt:

    • PROJECT_ID
    • NAMESPACE
    • KSA_NAME
    • GSA_NAME
    • IDENTITY_PROVIDER durch den Namen des Identitätsanbieters für Ihren Cluster.
  2. Wenden Sie das Manifest auf Ihren Cluster an:

    kubectl apply -f workload-identity-sample.yaml
    
  3. Prüfen Sie, ob die Beispielanwendung funktioniert; prüfen Sie dazu die Logs des Pods:

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

    Dabei gilt:

    • NAMESPACE

    Wenn der Pod erfolgreich auf die Google Cloud Compute API zugreift, sehen Sie eine Ausgabe, die in etwa so aussieht:

    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
    

Bereinigen

  1. Beispielanwendung löschen

    kubectl delete -f manifest.yaml
    
  2. IAM-Richtlinienbindung aus dem Google Cloud-Dienstkonto entfernen

    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
    

    Dabei gilt:

    • GSA_NAME
    • PROJECT_ID
    • NAMESPACE
    • KSA_NAME
  3. IAM-Richtlinienbindung aus dem Projekt entfernen

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

    Dabei gilt:

    • GSA_NAME
    • PROJECT_ID
  4. Google Cloud-Dienstkonto löschen

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

    Dabei gilt:

    • GSA_NAME
    • PROJECT_ID

Nächste Schritte