In dieser Anleitung wird beschrieben, wie Sie Workload Identity in GKE on AWS konfigurieren, um den Arbeitslastzugriff auf GCP-Ressourcen zu steuern. Sie enthält ein Beispiel für den Zugriff auf Google Cloud -Ressourcen von Ihrem Cluster über die Identität.
Informationen zur Verwendung von Workload Identities mit AWS IAM-Konten, um den Zugriff auf AWS-Ressourcen zu steuern, finden Sie unter Workload Identity mit AWS verwenden.
Übersicht
Workload Identity verwendet Google Cloud IAM-Berechtigungen, um den Zugriff aufGoogle Cloud Ressourcen zu steuern. Mit Workload Identity können Sie jeder Arbeitslast unterschiedliche IAM-Rollen zuweisen. Eine solche detaillierte Steuerung der Berechtigungen bietet die Möglichkeit, das Prinzip der geringsten Berechtigung anzuwenden. Ohne Workload Identity müssen Sie Ihren GKE on AWS-Knoten Google Cloud IAM-Rollen zuweisen. Dadurch erhalten alle Arbeitslasten auf dem Knoten die gleichen Berechtigungen wie der Knoten selbst.
Vorbereitung
Erstellen Sie einen Nutzercluster mit Kubernetes-Version 1.20 oder höher.
Wenn Ihre AWS-VPC einen Proxy oder eine Firewall verwendet, setzen Sie die folgenden URLs auf die Zulassungsliste:
securetoken.googleapis.com
iamcredentials.googleapis.com
sts.googleapis.com
Verwenden Sie im
anthos-aws
-Verzeichnisanthos-gke
, um den Kontext zu Ihrem Nutzercluster zu wechseln. Ersetzen Sie CLUSTER_NAME durch den Namen Ihres Nutzerclusters.cd anthos-aws env HTTPS_PROXY=http://localhost:8118 \ anthos-gke aws clusters get-credentials CLUSTER_NAME
Aktivieren Sie die vier neuen für dieses Feature erforderlichen Dienste mit den folgenden Befehlen:
gcloud services enable securetoken.googleapis.com gcloud services enable iam.googleapis.com gcloud services enable iamcredentials.googleapis.com gcloud services enable sts.googleapis.com
WI-Pool- und Anbieternamen zusammenstellen
Jedes Google Cloud -Projekt erstellt automatisch einen verwalteten Workload Identity-Pool mit einem Namen im Format PROJECT_ID.svc.id.goog
. Ähnlich erstelltGoogle Cloud einen Identitätsanbieter, dessen Name dem Muster https://gkehub.googleapis.com/projects/PROJECT_ID/locations/global/memberships/MEMBERSHIP_ID
folgt.
Weitere Informationen zu Workload Identity-Pools finden Sie unter Flottenfähige Komponenten.
Stellen Sie die Namen aus der Projekt-ID und der Mitgliedschafts-ID so zusammen:
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"
Ersetzen Sie Folgendes:
- USER_PROJECT_NAME durch den ausgewählten Nutzerprojektnamen des Nutzers
- PROJECT_MEMBERSHIP_NAME durch den Mitgliedschaftsnamen des Clusters
IAM-Richtlinienbindung erstellen
Erstellen Sie eine Richtlinienbindung, damit ein Kubernetes-Dienstkonto (KSA) die Identität eines Google Cloud -Dienstkontos (GSA) übernehmen kann.
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
Ersetzen Sie Folgendes:
- KUBERNETES_NAMESPACE durch den Kubernetes-Namespace, in dem das Kubernetes-Dienstkonto definiert ist
- WORKLOAD_IDENTITY_TEST durch einen Arbeitslastnamen Ihrer Wahl
- KUBERNETES_SA_NAME durch den Namen des Kubernetes-Dienstkontos, das der Anwendung zugeordnet ist
SDK-ConfigMap erstellen
Führen Sie das Shell-Skript unten aus, um die Informationen zur Workload Identity in einer ConfigMap zu speichern. Wenn ein Pod die ConfigMap bereitstellt, kann Google Cloud CLI die Details zur Workload Identity lesen.
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
Kubernetes-Dienstkonto erstellen
Erstellen Sie in Ihrem Nutzercluster ein KSA mit dem in der IAM-Bindung verwendeten Namen und Namespace.
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
Pod erstellen
Erstellen Sie als Nächstes einen Pod mit der oben erstellten Dienstkonto-Tokenprojektion und ConfigMap.
Erstellen Sie die YAML-Beispieldatei des Pods.
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
Wenden Sie die YAML-Datei des Pods auf Ihren Cluster an.
env HTTPS_PROXY=http://localhost:8118 \ kubectl apply -f sample-pod.yaml
Google Cloud Workload Identity verwenden
Unterstützte SDK-Versionen
Damit Sie die Google Cloud Workload Identity-Funktion verwenden können, müssen Sie den Code mit einem SDK erstellen, das diese Funktion unterstützt. Eine Liste der SDK-Versionen, dieGoogle Cloud Workload Identity unterstützen, finden Sie unter Workload Identity der Flotte.
Beispielcode mit Workload Identity
Dieser Abschnitt enthält Python-Beispielcode, der Google Cloud Workload Identity verwendet. Das Dienstkonto in diesem Beispiel verwendet eine Identität mit der Berechtigung Cloud Storage-Administrator, um alle Cloud Storage-Buckets des Google Cloud -Projekts aufzulisten.
Führen Sie eine Shell im Pod aus.
env HTTPS_PROXY=http://localhost:8118 \ kubectl exec -it sample-pod -- bash
Führen Sie ein Skript aus, um die Storage-Buckets des Projekts aufzulisten.
# 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
Ersetzen Sie USER_PROJECT_NAME durch Ihr Google Cloud Projekt.
Weitere Informationen
- Workload Identity der Flotte
- Workload Identity-Föderation
- Über einen OIDC-Identitätsanbieter auf Ressourcen zugreifen (Kubernetes-Cluster sind OIDC-Identitätsanbieter)
- Workload Identity mit AWS verwenden