Workload Identity mit Apigee Hybrid aktivieren

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

Überblick

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.

Google-Dienstkonten in Apigee Hybrid ohne Workload Identity

Ohne Verwendung von Workload Identity müssen Sie die Google-Dienstkonten mit jeder Komponente in Ihrer overrides.yaml-Datei entweder mit einem Verweis auf eine Zertifikatsdatei oder mit einem Kubernetes-Secret verknüpfen. Beispiel:

Bei diesen Verfahren verwendete Umgebungsvariablen

Bei diesen Verfahren werden die folgenden Umgebungsvariablen verwendet. Legen Sie diese entweder in der Befehls-Shell fest oder ersetzen Sie sie in den Codebeispielen durch die tatsächlichen Werte:

  • APIGEECTL_HOME: Das Verzeichnis, in dem Sie apigeectl installiert haben.
  • CLUSTER_LOCATION: Die Region oder Zone des Clusters, z. B.: us-west1.
  • ENV_NAME: Der Name der Apigee-Umgebung.
  • NAMESPACE: Der Kubernetes-Namespace, den Sie für Apigee Hybrid verwenden. Normalerweise apigee.
  • HYBRID_FILES: Ihr Hybriddateiverzeichnis, z. B. hybrid-base-directory/hybrid-files.
  • ORG_NAME: Der Name Ihrer Apigee-Organisation.
  • PROJECT_ID: Die ID Ihres Google Cloud-Projekts.

Überprüfen Sie die Umgebungsvariablen:

echo $PROJECT_ID
echo $ORG_NAME
echo $ENV_NAME
echo $NAMESPACE
echo $CLUSTER_LOCATION
echo $APIGEECTL_HOME
echo $HYBRID_FILES

Initialisieren Sie alle erforderlichen Variablen:

export PROJECT_ID=my-project-id
export ORG_NAME=$PROJECT_ID
export ENV_NAME=my-environment-name
export NAMESPACE=apigee
export CLUSTER_LOCATION=my-cluster-location
export APIGEECTL_HOME=hybrid-base-directory/apigeectl
export HYBRID_FILES=hybrid-base-directory/hybrid-files

Workload Identity und Dienstkontoschlüsseldateien

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.

Wenn Sie Dienstkontoschlüsseldateien im Rahmen Ihrer Apigee Hybrid-Installation heruntergeladen haben, können Sie sie nach dem Aktivieren von Workload Identity löschen. In den meisten Installationen befinden sie sich im Verzeichnis hybrid-base-directory/hybrid-files/service-accounts/.

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.

  1. Legen Sie das Projekt auf das Projekt fest, das Sie ändern möchten:
    gcloud config set project $PROJECT_ID
  2. Rufen Sie mit dem folgenden Befehl die gcloud-Anmeldedaten des Clusters ab, auf dem Sie Workload Identity aktivieren:
    gcloud container clusters get-credentials ${CLUSTER_NAME} \
      --region ${CLUSTER_LOCATION} \
      --project ${PROJECT_ID}
  3. Prüfen Sie mit dem folgenden Befehl, ob Workload Identity für den GKE-Cluster aktiviert ist, auf dem Apigee ausgeführt wird:
    gcloud container clusters describe $CLUSTER_NAME --region $CLUSTER_LOCATION --project $PROJECT_ID

    Die Ausgabe sollte in etwa so aussehen:

    
      
      status: RUNNING
      subnetwork: default
      workloadIdentityConfig:
        workloadPool: my-project-id.svc.id.goog

    Aktivieren Sie bei Bedarf Workload Identity im Cluster. Dieser Vorgang kann bis zu 30 Minuten dauern:

      gcloud container clusters update $CLUSTER_NAME \
      --workload-pool=$PROJECT_ID.svc.id.goog \
      --project $PROJECT_ID \
      --region $CLUSTER_LOCATION

    Weitere Informationen finden Sie unter Workload Identity aktivieren.

  4. Workload Identity muss in jedem Knotenpool aktiviert sein.
    1. Listen Sie die Knotenpools mit dem folgenden Befehl auf:
      gcloud container node-pools list \
        --cluster $CLUSTER_NAME \
        --region $CLUSTER_LOCATION \
        --project $PROJECT_ID

      Die Ausgabe sollte in etwa so aussehen:

        NAME            MACHINE_TYPE   DISK_SIZE_GB  NODE_VERSION
        apigee-runtime  e2-standard-4  100           1.23.12-gke.100
        apigee-data     e2-standard-4  100           1.23.12-gke.100
    2. 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 \
        --region $CLUSTER_LOCATION \
        --project $PROJECT_ID \
        --workload-metadata=GKE_METADATA

      Dabei ist NODE_POOL_NAME der Name jedes Knotenpools.

Google-Dienstkonten bestätigen oder erstellen

Google-Dienstkonten werden für viele Apigee Hybrid-Komponenten während der Installation erstellt. Mit diesem Verfahren können Sie die Google-Dienstkonten prüfen und gegebenenfalls erstellen.

  1. Prüfen Sie die Namen der Google-Dienstkonten für Ihr Projekt mit dem folgenden Befehl:
    gcloud iam service-accounts list --project $PROJECT_ID

    Die Ausgabe sollte in etwa so aussehen:

    Prod

    Für Nicht-Produktionsumgebungen:

    DISPLAY NAME         EMAIL                                                      DISABLED
    apigee-cassandra     apigee-cassandra@my_project_id.iam.gserviceaccount.com     False
    apigee-logger        apigee-logger@my_project_id.iam.gserviceaccount.com        False
    apigee-mart          apigee-mart@my_project_id.iam.gserviceaccount.com          False
    apigee-metrics       apigee-metrics@my_project_id.iam.gserviceaccount.com       False
    apigee-runtime       apigee-runtime@my_project_id.iam.gserviceaccount.com       False
    apigee-synchronizer  apigee-synchronizer@my_project_id.iam.gserviceaccount.com  False
    apigee-udca          apigee-udca@my_project_id.iam.gserviceaccount.com          False
    apigee-watcher       apigee-watcher@my_project_id.iam.gserviceaccount.com       False
    

    Non-prod

    Für Nicht-Produktionsumgebungen:

    DISPLAY NAME         EMAIL                                                      DISABLED
    apigee-non-prod      apigee-non-prod@my_project_id.iam.gserviceaccount.com      False
    

    Wenn Sie die Google-Dienstkonten für Ihr Projekt erstellen müssen, können Sie eine der folgenden Methoden verwenden:

    • Verwenden Sie das mit Apigee verfügbare create-service-account-Tool im Verzeichnis apigeectl/tools/. Mit diesem Tool können Sie alle Dienstkonten mit einem einzigen Befehl oder einzeln erstellen.
    • Verwenden Sie den Befehl gcloud iam service-accounts create, um die Dienstkonten einzeln zu erstellen und den Befehl gcloud projects add-iam-policy-binding, um jedem Dienstkonto die entsprechenden Rollen zuzuweisen. Bei dieser Methode müssen Sie zwar jedes Dienstkonto einzeln erstellen, Sie vermeiden aber das Herunterladen von Schlüsseldateien.

    create-service-account

    Verwenden Sie den folgenden Befehl, um ein Google-Dienstkonto pro Komponente zu erstellen:

    Prod

    Für Nicht-Produktionsumgebungen:

    $APIGEECTL_HOME/tools/create-service-account --env prod --dir $APIGEECTL_HOME/../service-accounts

    Mit diesem Befehl werden die folgenden Dienstkonten erstellt:

    • apigee-cassandra
    • apigee-logger
    • apigee-mart
    • apigee-metrics
    • apigee-runtime
    • apigee-synchronizer
    • apigee-udca
    • apigee-watcher

    Non-prod

    Für Nicht-Produktionsumgebungen:

    $APIGEECTL_HOME/tools/create-service-account --env non-prod --dir $APIGEECTL_HOME/../service-accounts

    Dieser Befehl erstellt das einzelne Dienstkonto apigee-non-prod mit allen zugewiesenen Rollen, die zum Verwalten aller Apigee-Komponenten erforderlich sind.

    gcloud

    Erstellen Sie die folgenden Dienstkonten und weisen Sie ihnen Rollen zu.

    1. Dienstkonto: apigee-cassandra, Rolle: roles/storage.objectAdmin

      Erstellen Sie das Konto:

      gcloud iam service-accounts create apigee-cassandra \
        --display-name="apigee-cassandra" \
        --project $PROJECT_ID
                  

      Weisen Sie die Rolle zu:

      gcloud projects add-iam-policy-binding $PROJECT_ID \
        --member="serviceAccount:apigee-cassandra@$PROJECT_ID.iam.gserviceaccount.com" \
        --role="roles/storage.objectAdmin"
                  
    2. Dienstkonto: apigee-logger, Rolle: roles/logging.logWriter

      Erstellen Sie das Konto:

      gcloud iam service-accounts create apigee-logger \
        --display-name="apigee-logger" \
        --project $PROJECT_ID
                  

      Weisen Sie die Rolle zu:

      gcloud projects add-iam-policy-binding $PROJECT_ID \
        --member="serviceAccount:apigee-logger@$PROJECT_ID.iam.gserviceaccount.com" \
        --role="roles/logging.logWriter"
                  
    3. Dienstkonto: apigee-mart, Rolle: roles/apigeeconnect.Agent

      Erstellen Sie das Konto:

      gcloud iam service-accounts create apigee-mart \
        --display-name="apigee-mart" \
        --project $PROJECT_ID
                  

      Weisen Sie die Rolle zu:

      gcloud projects add-iam-policy-binding $PROJECT_ID \
        --member="serviceAccount:apigee-mart@$PROJECT_ID.iam.gserviceaccount.com" \
        --role="roles/apigeeconnect.Agent"
                  
    4. Dienstkonto: apigee-metrics, Rolle: roles/monitoring.metricWriter

      Erstellen Sie das Konto:

      gcloud iam service-accounts create apigee-metrics \
        --display-name="apigee-metrics" \
        --project $PROJECT_ID
                  

      Weisen Sie die Rolle zu:

      gcloud projects add-iam-policy-binding $PROJECT_ID \
        --member="serviceAccount:apigee-metrics@$PROJECT_ID.iam.gserviceaccount.com" \
        --role="roles/monitoring.metricWriter"
                  
    5. Dienstkonto: apigee-runtime, Rolle: Keine Rolle zugewiesen.

      Erstellen Sie das Konto:

      gcloud iam service-accounts create apigee-runtime \
        --display-name="apigee-runtime" \
        --project $PROJECT_ID
                  
    6. Dienstkonto: apigee-synchronizer, Rolle: roles/apigee.synchronizerManager

      Erstellen Sie das Konto:

      gcloud iam service-accounts create apigee-synchronizer \
        --display-name="apigee-synchronizer" \
        --project $PROJECT_ID
                  

      Weisen Sie die Rolle zu:

      gcloud projects add-iam-policy-binding $PROJECT_ID \
        --member="serviceAccount:apigee-synchronizer@$PROJECT_ID.iam.gserviceaccount.com" \
        --role="roles/apigee.synchronizerManager"
                  
    7. Dienstkonto: apigee-udca, Rolle: roles/apigee.analyticsAgent

      Erstellen Sie das Konto:

      gcloud iam service-accounts create apigee-udca \
        --display-name="apigee-udca" \
        --project $PROJECT_ID
                  

      Weisen Sie die Rolle zu:

      gcloud projects add-iam-policy-binding $PROJECT_ID \
        --member="serviceAccount:apigee-udca@$PROJECT_ID.iam.gserviceaccount.com" \
        --role="roles/apigee.analyticsAgent"
                  
    8. Dienstkonto: apigee-watcher, Rolle: roles/apigee.runtimeAgent

      Erstellen Sie das Konto:

      gcloud iam service-accounts create apigee-watcher \
        --display-name="apigee-watcher" \
        --project $PROJECT_ID
                  

      Weisen Sie die Rolle zu:

      gcloud projects add-iam-policy-binding $PROJECT_ID \
        --member="serviceAccount:apigee-watcher@$PROJECT_ID.iam.gserviceaccount.com" \
        --role="roles/apigee.runtimeAgent"
                  

FestlegenworkloadIdentityEnabled: true und Dienstkonten erstellen

apigeectl erstellt Kubernetes-Dienstkonten für jede Apigee Hybrid-Komponente, wenn Sie workloadIdentityEnabled: true in Ihrer Überschreibungsdatei festlegen und die Änderungen übernehmen.

  1. Fügen Sie der Datei overrides.yaml unter der Stanza gcp die unten angezeigte fett formatierte Zeile hinzu. Dadurch wird Workload Identity für Ihre Installation aktiviert und apigeectl ausgelöst, um die Kubernetes-Dienstkonten zu erstellen, wenn Sie die Konfiguration anwenden:
    gcp:
      projectID: "my-project-id"
      name: "my-project-id"
      region: "analytics-region"
      workloadIdentityEnabled: true
  2. Fügen Sie der Datei overrides.yaml unter der Stanza cassandra die unten angezeigten fett formatierten Zeilen hinzu: Dadurch wird das Erstellen des Kubernetes-Dienstkontos apigee-cassandra-backup ausgelöst:
    cassandra:
      ...
      backup:
        enabled: true
  3. Übernehmen Sie die Änderungen mit apigeectl mit dem Flag --restore:
    $APIGEECTL_HOME/apigeectl apply -f overrides/overrides.yaml --restore
  4. Prüfen Sie die Dienstkonten mit folgendem Befehl:
    kubectl get sa -n $NAMESPACE

    Ihre Ausgabe sollte in etwa so aussehen: Die Kubernetes-Dienstkonten in Fettschrift sind die, die Sie mit Ihren Google-Dienstkonten annotieren müssen:

    NAME                                                         SECRETS   AGE
    apigee-cassandra-backup                                      1         11m
    apigee-cassandra-restore                                     1         11m
    apigee-cassandra-schema-setup-my-project-id-123abcd-sa       1         11m
    apigee-cassandra-schema-val-my-project-id-123abcd            1         11m
    apigee-cassandra-user-setup-my-project-id-123abcd-sa         1         11m
    apigee-connect-agent-my-project-id-123abcd-sa                1         11m
    apigee-datastore-default-sa                                  1         11m
    apigee-ingressgateway                                        1         11m
    apigee-ingressgateway-my-project-id-123abcd                  1         11m
    apigee-ingressgateway-manager                                1         11m
    apigee-init                                                  1         11m
    apigee-mart-my-project-id-123abcd-sa                         1         11m
    apigee-metrics-sa                                            1         11m
    apigee-mint-task-scheduler-my-project-id-123abcd-sa          1         11m
    apigee-redis-default-sa                                      1         11m
    apigee-redis-envoy-default-sa                                1         11m
    apigee-runtime-my-project-id-env-name-234bcde-sa             1         11m
    apigee-synchronizer-my-project-id-env-name-234bcde-sa        1         11m
    apigee-udca-my-project-id-123abcd-sa                         1         11m
    apigee-udca-my-project-id-env-name-234bcde-sa                1         11m
    apigee-watcher-my-project-id-123abcd-sa                      1         11m
    default                                                      1         11m
        

Kubernetes-Dienstkonten mit den Google-Dienstkonten annotieren

Annotieren Sie für jede Apigee-Komponente die entsprechenden Kubernetes-Dienstkonten mit dem Google-Dienstkonto für die Komponente.

Komponenten auf Organisationsebene

Sie haben jeweils nur eine Instanz jedes Kubernetes-Dienstkontos für Ihre Apigee-Organisation.

Komponente Kubernetes-Dienstkonto Google-Dienstkonto
Cassandra apigee-cassandra-backup apigee-cassandra
apigee-cassandra-restore apigee-cassandra
apigee-cassandra-schema-setup-my-project-id-num-id1-sa apigee-cassandra
apigee-cassandra-schema-val-my-project-id-num-id1 apigee-cassandra
apigee-cassandra-user-setup-my-project-id-num-id1-sa apigee-cassandra
apigee-datastore-default-sa apigee-cassandra
Apigee Connect apigee-connect-agent-my-project-id-num-id1-sa apigee-mart
MART apigee-mart-my-project-id-num-id1-sa apigee-mart
Messwerte apigee-metrics-sa apigee-metrics
UDCA (Organisationsebene) apigee-udca-my-project-id-num-id1-sa apigee-udca
Watcher apigee-watcher-my-project-id-num-id1-sa apigee-watcher

Komponenten auf Umgebungsebene

Sie haben jeweils eine Instanz jedes Kubernetes-Dienstkontos für jede Apigee-Umgebung.

Komponente Kubernetes-Dienstkonto Google-Dienstkonto
Apigee-Laufzeit apigee-runtime-my-project-id-env-name-num-id2-sa apigee-runtime
Synchronizer apigee-synchronizer-my-project-id-env-name-num-id2-sa apigee-synchronizer
UDCA (Umgebungsebene) apigee-udca-my-project-id-env-name-num-id2-sa apigee-udca

In den folgenden Befehlen werden die vom Befehl kubectl get sa -n $NAMESPACE zurückgegebenen Kubernetes-Dienstkontonamen verwendet. Beispiel: apigee-cassandra-schema-val-hybrid-example-project-123abcd.

Bei diesem Verfahren führen Sie für jedes Kubernetes-Dienstkonto die folgenden Schritte aus:

  • Binden Sie das Kubernetes-Dienstkonto und das primäre Google-Dienstkonto an die IAM-Rolle roles/iam.workloadIdentityUser.
  • Annotieren Sie das Kubernetes-Dienstkonto mit dem Google-Dienstkonto.
  1. Binden Sie die Rollen und annotieren Sie die Dienstkonten.

    Komponenten auf Organisationsebene

    Annotieren Sie Kubernetes-Dienstkonten für die Komponenten auf Organisationsebene. Sie müssen dies für jede Komponente in Ihrer Apigee-Organisation einmal tun.

    • Cassandra

      Die Cassandra-Komponente umfasst sechs Kubernetes-Dienstkonten:

      • apigee-cassandra-backup
      • apigee-cassandra-restore
      • apigee-cassandra-schema-setup
      • apigee-cassandra-schema-val (val = Validierung)
      • apigee-cassandra-user-setup
      • apigee-datastore-default

      Prod

      apigee-cassandra-backup

      1. Definieren Sie die Umgebungsvariablen KSA_NAME und GSA_NAME:
        GSA_NAME="apigee-cassandra"
        KSA_NAME="apigee-cassandra-backup"
      2. Binden Sie die IAM-Rolle:
        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
      3. Annotieren Sie das Dienstkonto:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      apigee-cassandra-restore

      1. Definieren Sie die Umgebungsvariable KSA_NAME neu:

        KSA_NAME="apigee-cassandra-restore"
      2. Binden Sie die IAM-Rolle:
        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
      3. Annotieren Sie das Dienstkonto:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      apigee-cassandra-schema-setup-service-account-name

      1. Definieren Sie die Umgebungsvariable KSA_NAME neu:

        KSA_NAME="apigee-cassandra-schema-setup-service-account-name"

        Binden Sie die IAM-Rolle:

        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
      2. Annotieren Sie das Dienstkonto:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      apigee-cassandra-schema-val-service-account-name

      1. Definieren Sie die Umgebungsvariable KSA_NAME neu:

        KSA_NAME="apigee-cassandra-schema-val-service-account-name"
      2. Binden Sie die IAM-Rolle:
        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
      3. Annotieren Sie das Dienstkonto:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      apigee-cassandra-user-setup-service-account-name

      1. Definieren Sie die Umgebungsvariable KSA_NAME neu:

        KSA_NAME="apigee-cassandra-user-setup-service-account-name"
      2. Binden Sie die IAM-Rolle:
        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
      3. Annotieren Sie das Dienstkonto:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      apigee-datastore-default-sa

      1. Definieren Sie die Umgebungsvariable KSA_NAME neu:

        KSA_NAME="apigee-datastore-default-sa"
      2. Binden Sie die IAM-Rolle:
        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
      3. Annotieren Sie das Dienstkonto:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      Non-prod

      apigee-cassandra-backup

      1. Definieren Sie die Umgebungsvariablen KSA_NAME und GSA_NAME:
        GSA_NAME="apigee-non-prod"
        KSA_NAME="apigee-connect-agent-service-account-name"
      2. Binden Sie die IAM-Rolle:
        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
      3. Annotieren Sie das Dienstkonto:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com

      apigee-cassandra-restore

      1. Definieren Sie die Umgebungsvariable KSA_NAME neu:

        KSA_NAME="apigee-cassandra-restore"
      2. Binden Sie die IAM-Rolle:
        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
      3. Annotieren Sie das Dienstkonto:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com

      apigee-cassandra-schema-setup-service-account-name

      1. Definieren Sie die Umgebungsvariable KSA_NAME neu:

        KSA_NAME="apigee-cassandra-schema-setup-service-account-name"
      2. Binden Sie die IAM-Rolle:
        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
      3. Annotieren Sie das Dienstkonto:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com

      apigee-cassandra-schema-val-service-account-name

      1. Definieren Sie die Umgebungsvariable KSA_NAME neu:

        KSA_NAME="apigee-cassandra-schema-val-service-account-name"
      2. Binden Sie die IAM-Rolle:
        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
      3. Annotieren Sie das Dienstkonto:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com

      apigee-cassandra-user-setup-service-account-name

      1. Definieren Sie die Umgebungsvariable KSA_NAME neu:

        KSA_NAME="apigee-cassandra-user-setup-service-account-name"
      2. Binden Sie die IAM-Rolle:
        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
      3. Annotieren Sie das Dienstkonto:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com

      apigee-datastore-default-sa

      1. Definieren Sie die Umgebungsvariable KSA_NAME neu:

        KSA_NAME="apigee-datastore-default-sa"
      2. Binden Sie die IAM-Rolle:
        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
      3. Annotieren Sie das Dienstkonto:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com
    • Apigee Connect

      Prod

      1. Definieren Sie die Umgebungsvariablen KSA_NAME und GSA_NAME:
        GSA_NAME="apigee-mart"
        KSA_NAME="apigee-connect-agent-service-account-name"
      2. Binden Sie die IAM-Rolle:
        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
      3. Annotieren Sie das Dienstkonto:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      Non-prod

      1. Definieren Sie die Umgebungsvariable KSA_NAME:

        KSA_NAME="apigee-connect-agent-service-account-name"
      2. Binden Sie die IAM-Rolle:
        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
      3. Annotieren Sie das Dienstkonto:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com
    • MART

      Prod

      1. Definieren Sie die Umgebungsvariablen KSA_NAME und GSA_NAME:

        GSA_NAME="apigee-mart"
        KSA_NAME="apigee-mart-service-account-name"
      2. Binden Sie die IAM-Rolle:
        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
      3. Annotieren Sie das Dienstkonto:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      Non-prod

      1. Definieren Sie die Umgebungsvariable KSA_NAME:

        KSA_NAME="apigee-mart-service-account-name"
      2. Binden Sie die IAM-Rolle:
        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
      3. Annotieren Sie das Dienstkonto:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com
    • Apigee-Messwerte

      Prod

      1. Definieren Sie die Umgebungsvariablen KSA_NAME und GSA_NAME:

        GSA_NAME="apigee-metrics"
        KSA_NAME="apigee-metrics-sa"
      2. Binden Sie die IAM-Rolle:
        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
      3. Annotieren Sie das Dienstkonto:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      Non-prod

      1. Definieren Sie die Umgebungsvariable KSA_NAME:

        KSA_NAME="apigee-metrics-sa"
      2. Binden Sie die IAM-Rolle:
        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
      3. Annotieren Sie das Dienstkonto:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com
    • UDCA (Organisationsebene)

      Prod

      1. Definieren Sie die Umgebungsvariablen KSA_NAME und GSA_NAME:

        GSA_NAME="apigee-udca"
        KSA_NAME="apigee-udca-org-level-service-account-name"
      2. Binden Sie die IAM-Rolle:
        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
      3. Annotieren Sie das Dienstkonto:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      Non-prod

      1. Definieren Sie die KSA_NAME-Umgebungsvariablen:

        KSA_NAME="apigee-udca-org-level-service-account-name"
      2. Binden Sie die IAM-Rolle:
          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
      3. Annotieren Sie das Dienstkonto:
          kubectl annotate serviceaccount \
            --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com
    • Apigee Watcher

      Prod

      1. Definieren Sie die Umgebungsvariablen KSA_NAME und GSA_NAME:

        GSA_NAME="apigee-watcher"
        KSA_NAME="apigee-watcher-service-account-name"
      2. Binden Sie die IAM-Rolle:
        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
      3. Annotieren Sie das Dienstkonto:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      Non-prod

      1. Definieren Sie die Umgebungsvariable KSA_NAME:

        KSA_NAME="apigee-watcher-service-account-name"
      2. Binden Sie die IAM-Rolle:
        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
      3. Annotieren Sie das Dienstkonto:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com

    Pro Umgebung:

    • Laufzeit

      Prod

      1. Definieren Sie die Umgebungsvariablen KSA_NAME und GSA_NAME:

        GSA_NAME="apigee-runtime"
        KSA_NAME="apigee-runtime-service-account-name"
      2. Binden Sie die IAM-Rolle:
        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
      3. Annotieren Sie das Dienstkonto:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      Non-prod

      1. Definieren Sie die Umgebungsvariable KSA_NAME:

        KSA_NAME="apigee-runtime-service-account-name"
      2. Binden Sie die IAM-Rolle:
        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
      3. Annotieren Sie das Dienstkonto:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com
    • Synchronizer

      Prod

      1. Definieren Sie die Umgebungsvariablen KSA_NAME und GSA_NAME:

        GSA_NAME="apigee-synchronizer"
        KSA_NAME="apigee-synchronizer-service-account-name"
      2. Binden Sie die IAM-Rolle:
        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
      3. Annotieren Sie das Dienstkonto:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      Non-prod

      1. Definieren Sie die Umgebungsvariable KSA_NAME:

        KSA_NAME="apigee-synchronizer-service-account-name"
      2. Binden Sie die IAM-Rolle:
        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
      3. Annotieren Sie das Dienstkonto:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com
    • UDCA (Umgebungsebene)

      Prod

      1. Definieren Sie die Umgebungsvariablen KSA_NAME und GSA_NAME:

        GSA_NAME="apigee-udca"
        KSA_NAME="apigee-udca-env-level-service-account-name"
      2. Binden Sie die IAM-Rolle:
        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
      3. Annotieren Sie das Dienstkonto:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      Non-prod

      1. Definieren Sie die Umgebungsvariable KSA_NAME:

        KSA_NAME="apigee-udca-env-level-service-account-name"
      2. Binden Sie die IAM-Rolle:
        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
      3. Annotieren Sie das Dienstkonto:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com
  2. Prüfen Sie, ob die Schritte funktioniert haben:
    gcloud config set project $PROJECT_ID
    

    Wählen Sie ein Kubernetes-Dienstkonto zum Testen aus, z. B. apigee-cassandra-backup.

    KSA_NAME="kubernetes-service-account-name"
    
    kubectl run --rm -it --image google/cloud-sdk:slim \
      --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
  3. 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}')
    
  4. Prüfen Sie die Logs:
    kubectl logs -n $NAMESPACE -l app=apigee=synchronizer,env=$ENV_NAME,org=$ORG_NAME apigee-synchronizer
    

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 --filter "apigee"
DISPLAY NAME       EMAIL                                                  DISABLED
apigee-cassandra   apigee-cassandra@PROJECT_ID.iam.gserviceaccount.com    False
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:

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 \
      --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