Workload Identity mit Apigee Hybrid aktivieren

In diesem Thema wird das Aktivieren von Workload Identity für Apigee Hybrid erläutert.

Übersicht

Workload Identity ermöglicht Anwendungen, die in GKE ausgeführt werden (Google Kubernetes Engine), auf Google Cloud-Dienste zuzugreifen. Eine Übersicht über Workload Identity finden Sie unter:

Ein Google Cloud IAM-Dienstkonto ist eine Identität, die eine Anwendung zum Senden von Anfragen an Google APIs verwenden kann. Diese Dienstkonten werden im Dokument als GSA (Google Service Accounts, Google-Dienstkonten) bezeichnet. Weitere Informationen zu GSAs finden Sie unter Dienstkonten.

Unabhängig davon verfügt Kubernetes auch über das Konzept von Dienstkonten. Ein Dienstkonto bietet eine Identität für Prozesse, die in einem Pod ausgeführt werden. Kubernetes-Dienstkonten sind Kubernetes-Ressourcen, während Google-Dienstkonten für Google Cloud spezifisch sind. Informationen zu Kubernetes-Dienstkonten finden Sie in der Kubernetes-Dokumentation unter Dienstkonten für Pods konfigurieren.

Mit Apigee Hybrid 1.4 und höher erstellt und verwendet Apigee ein Kubernetes-Dienstkonto für jeden Komponententyp. Wenn Sie Workload Identity aktivieren, können die Hybrid-Komponenten mit den Kubernetes-Dienstkonten interagieren.

Vorbereitung

Bevor Sie Workload Identity für Apigee Hybrid aktivieren können, muss Workload Identity für den GKE-Cluster aktiviert werden, auf dem Apigee ausgeführt wird.

Wenn Sie die Anleitung für Anthos Service Mesh (ASM) befolgt haben, ist Workload Identity bereits für den Cluster aktiviert.

Mit folgendem Befehl können Sie prüfen, ob Workload Identity aktiviert ist:

gcloud container clusters describe $CLUSTER_NAME

Die Ausgabe sollte in etwa so aussehen:

…
…
status: RUNNING
subnetwork: default
workloadIdentityConfig:
  workloadPool: PROJECT_ID.svc.id.goog

Wenn Sie Apigee Hybrid in GKE ausführen, werden standardmäßig private Schlüssel (.json-Dateien) für jedes Dienstkonto erstellt und heruntergeladen. Wenn Sie Workload Identity verwenden, müssen Sie keine privaten Schlüssel für Dienstkonten herunterladen und zu den GKE-Clustern hinzufügen.

Workload Identity für Apigee Hybrid aktivieren

Folgen Sie der Anleitung unter Aktivieren von Workload Identity vorbereiten, um Knotenpools zu aktualisieren und Variablen zu initialisieren, bevor Sie Workload Identity aktivieren.

Folgen Sie dann je nach ausgeführten Schritten einem dieser Abschnitte:

Aktivieren von Workload Identity vorbereiten

Führen Sie die Schritte in diesem Abschnitt aus, bevor Sie den Installationsvorgang starten.

Variablen initialisieren

Initialisieren oder prüfen Sie die folgenden Variablen:

export PROJECT_ID=my-project-id
export ORG_NAME=$PROJECT_ID
export ENV_NAME=my-environment-name
export NAMESPACE=apigee #the namespace where apigee is installed

Legen Sie das Projekt auf das Projekt fest, das Sie ändern möchten:

gcloud config set project $PROJECT_ID

Knotenpools aktualisieren

Prüfen Sie mit dem folgenden Befehl, ob Workload Identity pro Knotenpool aktiviert ist:

gcloud container node-pools update $NODE_POOL_NAME \
  --cluster=$CLUSTER_NAME \
  --workload-metadata=GKE_METADATA

Workload Identity für eine Neuinstallation aktivieren

Folgen Sie dieser Anleitung, wenn Workload Identity während einer neuen Hybrid-Installation aktiviert wird.

  1. Fügen Sie der Datei overrides.yaml unter der Stanza gcp die unten angezeigte fett formatierte Zeile hinzu:
    gcp:
      projectID: "my-project"
      name: "my-project"
      region: "us-west1"
      workloadIdentityEnabled: true
  2. Erstellen Sie Google-Dienstkonten. Dafür stehen zwei Methoden zur Verfügung:
    • Verwenden Sie das create-service-account-Tool, um ein Google-Dienstkonto pro Komponente mit dem folgenden Befehl zu erstellen:
      $APIGEECTL_HOME/tools/create-service-account --env prod --dir $APIGEECTL_HOME/../service-accounts

      Mit diesem Befehl werden die folgenden Dienstkonten erstellt:

      • apigee-logger
      • apigee-metrics
      • apigee-cassandra
      • apigee-udca
      • apigee-synchronizer
      • apigee-mart
      • apigee-watcher
      • apigee-distributed-trace

      In der folgenden Anleitung wird davon ausgegangen, dass Sie das create-service-account-Tool zum Generieren der Dienstkonten verwendet haben.

    • Definieren Sie benutzerdefinierte Namenskonventionen und Dienstkonten pro Umgebung (für fortgeschrittene Nutzer).
  3. Erstellen Sie die Kubernetes-Dienstkonten.

    Für Komponenten auf Organisationsebene:

    • Cassandra
      kubectl create sa -n $NAMESPACE apigee-cassandra-schema-setup-$(apigeectl encode --org $ORG_NAME)-sa \
        && kubectl label sa -n $NAMESPACE -l app=apigee-cassandra,org=$ORG_NAME \
        && kubectl annotate serviceaccount \
        --namespace $NAMESPACE apigee-cassandra-schema-setup-$(apigeectl encode --org $ORG_NAME)-sa iam.gke.io/gcp-service-account=GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      kubectl create sa -n $NAMESPACE apigee-cassandra-user-setup-$(apigeectl encode --org $ORG_NAME)-sa \
        && kubectl label sa -n $NAMESPACE -l app=apigee-cassandra,org=$ORG_NAME \
        && kubectl annotate serviceaccount \
        --namespace $NAMESPACE apigee-cassandra-user-setup-$(apigeectl encode --org $ORG_NAME)-sa iam.gke.io/gcp-service-account=GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
    • MART
      kubectl create sa -n $NAMESPACE apigee-mart-$(apigeectl encode --org $ORG_NAME)-sa \
        && kubectl label sa -n $NAMESPACE -l app=apigee-mart,org=$ORG_NAME \
        && kubectl annotate serviceaccount \
        --namespace $NAMESPACE apigee-mart-$(apigeectl encode --org $ORG_NAME)-sa iam.gke.io/gcp-service-account=GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
    • Apigee Connect
      kubectl create sa -n $NAMESPACE apigee-connect-$(apigeectl encode --org $ORG_NAME)-sa \
        && kubectl label sa -n $NAMESPACE -l app=apigee-connect,org=$ORG_NAME \
        && kubectl annotate serviceaccount \
        --namespace $NAMESPACE apigee-connect-$(apigeectl encode --org $ORG_NAME)-sa iam.gke.io/gcp-service-account=GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      
    • Apigee Watcher
      kubectl create sa -n $NAMESPACE apigee-watcher-$(apigeectl encode --org $ORG_NAME)-sa \
        && kubectl label sa -n $NAMESPACE -l app=apigee-watcher,org=$ORG_NAME \
        && kubectl annotate serviceaccount \
        --namespace $NAMESPACE apigee-watcher-$(apigeectl encode --org $ORG_NAME)-sa iam.gke.io/gcp-service-account=GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
    • Apigee-Messwerte
      kubectl create sa -n $NAMESPACE apigee-metrics-sa \
        && kubectl label sa -n $NAMESPACE -l app=apigee-metrics,org=$ORG_NAME \
        && kubectl annotate serviceaccount \
        --namespace $NAMESPACE apigee-metrics-sa iam.gke.io/gcp-service-account=GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

    Pro Umgebung:

    • Laufzeit
      kubectl create sa -n $NAMESPACE apigee-runtime-$(apigeectl encode --org $ORG_NAME --env $ENV_NAME)-sa \
        && kubectl label sa -n $NAMESPACE -l app=apigee-runtime,org=$ORG_NAME,env=$ENV_NAME \
        && kubectl annotate serviceaccount \
        --namespace $NAMESPACE apigee-runtime-$(apigeectl encode --org $ORG_NAME --env $ENV_NAME)-sa iam.gke.io/gcp-service-account=GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
    • UDCA
      kubectl create sa -n $NAMESPACE apigee-udca-$(apigeectl encode --org $ORG_NAME --env $ENV_NAME)-sa \
        && kubectl label sa -n $NAMESPACE -l app=apigee-udca,org=$ORG_NAME,emv=$ENV_NAME \
        && kubectl annotate serviceaccount \
        --namespace $NAMESPACE apigee-udca-$(apigeectl encode --org $ORG_NAME --env $ENV_NAME)-sa iam.gke.io/gcp-service-account=GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
    • Synchronizer
      kubectl create sa -n $NAMESPACE apigee-synchronizer-$(apigeectl encode --org $ORG_NAME --env $ENV_NAME)-sa \
        && kubectl label sa -n $NAMESPACE -l app=apigee-synchronizer,org=$ORG_NAME,env=$ENV_NAME \
        && kubectl annotate serviceaccount \
        --namespace $NAMESPACE apigee-synchronizer-$(apigeectl encode --org $ORG_NAME --env $ENV_NAME)-sa iam.gke.io/gcp-service-account=GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
  4. Fahren Sie wie gewohnt mit der Installation von Apigee Hybrid fort.

Upgrade einer Installation zur Verwendung von Workload Identity

Folgen Sie dieser Anleitung, um Workload Identity zu einer vorhandenen Hybrid-Installation hinzuzufügen.

Hier sehen Sie ein Beispiel für Google-Dienstkonten (GSA), die für Apigee erstellt wurden:

gcloud iam service-accounts list | grep apigee
apigee-connect   apigee-connect@$PROJECT_ID.iam.gserviceaccount.com    False
apigee-runtime   apigee-runtime@$PROJECT_ID.iam.gserviceaccount.com    False
apigee-metrics   apigee-metrics@$PROJECT_ID.iam.gserviceaccount.com    False
apigee-mart      apigee-mart@$PROJECT_ID.iam.gserviceaccount.com       False
apigee-watcher   apigee-watcher@$PROJECT_ID.iam.gserviceaccount.com    False
apigee-sync      apigee-sync@$PROJECT_ID.iam.gserviceaccount.com       False
apigee-udca      apigee-udca@$PROJECT_ID.iam.gserviceaccount.com       False

Hier sehen Sie ein Beispiel für Kubernetes-Dienstkonten (Kubernetes Service Accounts, KSA), die für Apigee erstellt wurden (sofern Apigee Hybrid 1.4 oder höher installiert ist):

kubectl get sa -n $NAMESPACE
apigee-cassandra-schema-setup-ORG_NAME-cb84b88-sa                1         xxd
apigee-cassandra-user-setup-ORG_NAME-cb84b88-sa                  1         xxd
apigee-connect-agent-ORG_NAME-cb84b88-sa                         1         xxd
apigee-init                                                        1         xxd
apigee-mart-ORG_NAME-cb84b88-sa                                  1         xxd
apigee-metrics-apigee-telemetry                                    1         xxd
apigee-runtime-ORG_NAME-ENV_NAME-1d0dc5e-sa                    1         xxd
apigee-synchronizer-ORG_NAME-ENV_NAME-1d0dc5e-sa               1         xxd
apigee-udca-ORG_NAME-ENV_NAME-1d0dc5e-sa                       1         xxd
apigee-watcher-ORG_NAME-cb84b88                                  1         xxd
  1. Fügen Sie jedem Dienstkonto die Rolle "Workload Identity" hinzu:
    gcloud iam service-accounts add-iam-policy-binding \
      --role roles/iam.workloadIdentityUser \
      --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
      GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
    

    Wenn Sie beispielsweise die Berechtigungen für Apigee Synchronizer festlegen, führen Sie folgenden Befehl aus:

    export KSA_NAME=$(kubectl get sa -n apigee -l app=apigee-synchronizer,env=$ENV_NAME,org=$ORG_NAME --output=jsonpath={.items..metadata.name})
    
    gcloud iam service-accounts add-iam-policy-binding --role roles/iam.workloadIdentityUser --member "serviceAccount:$PROJECT_ID.svc.id.goog[apigee/$KSA_NAME]" apigee-sync@$PROJECT_ID.iam.gserviceaccount.com
    
  2. Annotieren Sie jedes KSA mit den GSA-Details:
    kubectl annotate serviceaccount \
      --namespace $NAMESPACE \
      $KSA_NAME \
     iam.gke.io/gcp-service-account=GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
    

    Wenn Sie beispielsweise die Berechtigungen für Apigee Synchronizer festlegen, führen Sie folgenden Befehl aus:

    export KSA_NAME=$(kubectl get sa -n apigee -l app=apigee-synchronizer,env=$ENV_NAME,org=$ORG_NAME --output=jsonpath={.items..metadata.name})
    
    kubectl annotate serviceaccount --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-sync@$PROJECT_ID.iam.gserviceaccount.com
    
  3. Prüfen Sie, ob die Schritte funktioniert haben:
    gcloud config set project $PROJECT_ID
    
    kubectl run --rm -it --image google/cloud-sdk:slim --serviceaccount $KSA_NAME --namespace $NAMESPACE workload-identity-test -- gcloud auth list
    

    Wenn Sie keine Eingabeaufforderung sehen, drücken Sie die Eingabetaste.

    Wenn die Schritte korrekt ausgeführt wurden, wird eine Antwort wie diese angezeigt:

                       Credentialed Accounts
    ACTIVE  ACCOUNT
    *       GSA@PROJECT_ID.iam.gserviceaccount.com
    
  4. Wenn Sie ein Upgrade von einer früheren Installation durchführen, bereinigen Sie die Secrets, die die privaten Schlüssel des Dienstkontos enthielten:
    kubectl delete secrets -n $NAMESPACE $(k get secrets -n $NAMESPACE | grep svc-account | awk '{print $1}')
    
  5. Prüfen Sie die Logs:
    kubectl logs -n $NAMESPACE -l app=apigee=synchronizer,env=$ENV_NAME,org=$ORG_NAME apigee-synchronizer