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 Azure ausgeführt werden, um aufGoogle Cloud -Dienste zuzugreifen. Weitere Informationen finden Sie unter Workload Identity.
In diesem Thema wird beschrieben, wie Sie Workload Identity verwenden, um von Ihren Arbeitslasten aus eine Verbindung zuGoogle Cloud -Diensten herzustellen.
IAM-Berechtigungen konfigurieren
In diesem Abschnitt gewähren Sie einem Kubernetes-Dienstkonto Berechtigungen für den Zugriff aufGoogle Cloud -Dienste, indem Sie ihm IAM-Rollen zuweisen.
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
Für alle GKE-Cluster wird ein Identitätsanbieter im Workload Identity-Pool
PROJECT_ID.svc.id.googerstellt. Verwenden Sie das Google Cloud CLI, um den Namen des Identitätspools Ihres Clusters abzurufen:gcloud container azure clusters describe CLUSTER_NAME \ --location=GOOGLE_CLOUD_LOCATION \ --format='value(workloadIdentityConfig.workloadPool)'Dabei gilt:
CLUSTER_NAMEdurch den Namen Ihres Clusters.GOOGLE_CLOUD_LOCATIONdurch den Namen des Google Cloud-Standorts, der Ihren 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 azure clusters describe CLUSTER_NAME \ --location=GOOGLE_CLOUD_LOCATION \ --format='value(workloadIdentityConfig.identityProvider)'Dabei gilt:
CLUSTER_NAMEGOOGLE_CLOUD_LOCATION
Die Ausgabe enthält den Namen des Identitätsanbieters Ihres Clusters. Speichern Sie diesen Wert. Sie benötigen diese Informationen später.
IAM-Rollen Ihrem Kubernetes-Dienstkonto zuweisen
Weisen Sie dem Kubernetes-ServiceAccount die IAM-Rolle für das Projekt zu:
gcloud projects add-iam-policy-binding PROJECT_ID \
--member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KUBERNETES_SERVICEACCOUNT" \
--role=IAM_ROLE \
--condition=None
Ersetzen Sie Folgendes:
PROJECT_ID: Ihre Google Cloud Projekt-IDPROJECT_NUMBER: Ihre Google Cloud ProjektnummerNAMESPACE: der Kubernetes-Namespace für die AnwendungKUBERNETES_SERVICEACCOUNT: das für die Anwendung zu verwendende Kubernetes-ServiceAccountIAM_ROLE: Die IAM-Rolle, die dem Kubernetes-Dienstkonto zugewiesen werden soll.
In diesem Beispiel verwenden wir die Rolle roles/compute.viewer, die schreibgeschützten Zugriff auf Compute-Dienste ermöglicht:
gcloud projects add-iam-policy-binding PROJECT_ID \
--member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KUBERNETES_SERVICEACCOUNT" \
--role=roles/compute.viewer \
--condition=None
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 Kubernetes-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: KUBERNETES_SERVICEACCOUNT 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", "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: KUBERNETES_SERVICEACCOUNT 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.jsonDabei gilt:
PROJECT_IDNAMESPACEKUBERNETES_SERVICEACCOUNTIDENTITY_PROVIDERdurch den Namen des Identitätsanbieters für Ihren Cluster.
Wenden Sie das Manifest auf Ihren Cluster an:
kubectl apply -f workload-identity-sample.yamlPrüfen Sie, ob die Beispielanwendung funktioniert; prüfen Sie dazu die Logs des Pods:
kubectl logs -f cloud-sdk-example -n NAMESPACEDabei 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.yamlIAM-Richtlinienbindung aus dem Projekt entfernen
gcloud projects remove-iam-policy-binding PROJECT_ID \ --member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KUBERNETES_SERVICEACCOUNT" \ --role=roles/compute.viewer \ --condition=NoneErsetzen Sie Folgendes:
PROJECT_IDPROJECT_NUMBERNAMESPACEKUBERNETES_SERVICEACCOUNT