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.
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.
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:
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.
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
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:
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.
Wenden Sie das Manifest auf Ihren Cluster an:
kubectl apply -f workload-identity-sample.yaml
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
Beispielanwendung löschen
kubectl delete -f manifest.yaml
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
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
Google Cloud-Dienstkonto löschen
gcloud iam service-accounts delete \ GSA_NAME@PROJECT_ID.iam.gserviceaccount.com
Dabei gilt:
GSA_NAME
PROJECT_ID