Pub/Sub-Trigger von Ereignissen für Cloud Run for Anthos zu Eventarc migrieren

Sie können Ereignistrigger migrieren, sodass ein GKE-Dienst (Google Kubernetes Engine) (einschließlich Knative-Serving-Dienste) Pub/Sub-Ereignisse mithilfe von Eventarc empfangen kann. In dieser Anleitung wird davon ausgegangen, dass Sie vorhandene Ereignis-Trigger migrieren und Ihr GKE-Dienst in einem GKE-Cluster ausgeführt wird. Für jeden Cluster muss eine Migration ausgeführt werden.

Durch diesen Migrationspfad vermeiden Sie den Verlust von Ereignissen und minimieren gleichzeitig deren Duplizierung.

Die Migration umfasst Folgendes:

  1. Damit Eventarc Ressourcen im GKE-Cluster verwalten kann, aktivieren Sie GKE-Ziele.
  2. Aktivieren Sie bei Bedarf Workload Identity für den GKE-Cluster, auf dem der GKE-Zieldienst ausgeführt wird.
  3. Ermitteln Sie vorhandene Ereignistrigger.
  4. Erstellen Sie einen Eventarc-Trigger, der auf denselben GKE-Dienst wie der vorhandene Trigger verweist.
  5. Prüfen Sie, ob der Eventarc-Trigger Ereignisse wie erwartet sendet.
  6. Löschen Sie den ursprünglichen Ereignistrigger und bereinigen Sie ihn nach der Migration.

Hinweis

In diesem Leitfaden wird Folgendes vorausgesetzt:

Befehlszeilenumgebung einrichten

So richten Sie die gcloud- und kubectl-Befehlszeilentools ein:

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. Melden Sie sich mit Ihrem -Konto an:

    gcloud auth login
  3. Standardeinstellungen für die gcloud CLI festlegen

    gcloud config set project PROJECT_ID
    gcloud config set run/cluster CLUSTER_NAME
    gcloud config set run/cluster_location CLUSTER_LOCATION
    gcloud config set run/platform gke
    gcloud config set eventarc/location LOCATION

    Ersetzen Sie Folgendes:

    • PROJECT_ID: Ihre Projekt-ID.
    • CLUSTER_NAME: der Name Ihres Clusters
    • CLUSTER_LOCATION: jede beliebige Zone, in der GKE unterstützt wird. Beispiel: us-central1-a
    • LOCATION: ein Standort für den Eventarc-Trigger. Beispiel: us-central1
  4. Aktivieren Sie die folgenden APIs für das Projekt:

    gcloud services enable cloudapis.googleapis.com
    gcloud services enable cloudbuild.googleapis.com
    gcloud services enable cloudresourcemanager.googleapis.com
    gcloud services enable container.googleapis.com
    gcloud services enable containerregistry.googleapis.com
    gcloud services enable eventarc.googleapis.com
  5. Installieren Sie das kubectl-Befehlszeilentool:

    gcloud components install kubectl
  6. Aktualisieren Sie die installierten gcloud CLI-Komponenten:

    gcloud components update

GKE-Ziele aktivieren

Damit Eventarc Ressourcen im GKE-Cluster verwalten kann, aktivieren Sie GKE-Ziele und binden Sie das Eventarc-Dienstkonto an die erforderlichen Rollen.

  1. Aktivieren Sie GKE-Ziele für Eventarc:

    gcloud eventarc gke-destinations init
  2. Geben Sie bei der Aufforderung, die erforderlichen Rollen zu binden, y ein.

    Die folgenden Rollen sind gebunden:

    • roles/compute.viewer
    • roles/container.developer
    • roles/iam.serviceAccountAdmin

Workload Identity-Föderation für GKE in einem Cluster aktivieren

Wenn die Workload Identity Federation for GKE bereits auf Ihrem Cluster aktiviert ist, können Sie diesen Schritt überspringen.

Für das Aufrufen von Google Cloud-Diensten aus Anwendungen in GKE wird Workload Identity Federation for GKE empfohlen, da dieses Feature bessere Sicherheitsmerkmale bietet und leichter zu verwalten ist. Außerdem ist es erforderlich, GKE-Ereignisse mithilfe von Eventarc weiterzuleiten.

Informationen zum Aktivieren der Workload Identity Federation for GKE in einem vorhandenen Cluster finden Sie unter Workload Identity verwenden.

Vorhandene Ereignistrigger identifizieren

Bevor Sie vorhandene Ereignistrigger migrieren, müssen Sie die Triggerdetails abrufen.

  1. Listen Sie die vorhandenen Ereignistrigger für den GKE-Cluster auf:

    gcloud beta events triggers list --namespace EVENTS_NAMESPACE
    

    Ersetzen Sie EVENTS_NAMESPACE durch den Namespace des Ereignis-Brokers.

    Die Ausgabe sieht in etwa so aus:

       TRIGGER             EVENT TYPE                                     TARGET
    ✔  trigger-id          google.cloud.pubsub.topic.v1.messagePublished  cloud-run-service-name
    
  2. Sie benötigen die Themen-ID, um den Eventarc-Trigger zu erstellen. Rufen Sie die Themen-ID für den vorhandenen Ereignistrigger ab:

    gcloud beta events triggers describe TRIGGER_ID \
      --platform gke --namespace EVENTS_NAMESPACE \
      --format="flattened(serialized_source.spec.topic,serialized_trigger.spec.filter.attributes.type,serialized_trigger.spec.subscriber.ref.name,serialized_trigger.spec.subscriber.ref.namespace)"
    

    Ersetzen Sie TRIGGER_ID durch die ID des vorhandenen Ereignistrigger oder eine vollständig qualifizierte Kennzeichnung.

    Die Ausgabe sieht in etwa so aus:

    topic:     topic-id
    type:      google.cloud.pubsub.topic.v1.messagePublished
    name:      cloud-run-service-name
    namespace: events
    

Eventarc-Trigger erstellen, um den vorhandenen Trigger zu ersetzen

Richten Sie ein vom Nutzer verwaltetes Dienstkonto ein und weisen Sie ihm bestimmte Rollen zu, damit Eventarc Ereignisse für GKE-Ziele verwalten kann., bevor Sie den Eventarc-Trigger erstellen.

  1. Google Cloud-Dienstkonto (GSA) erstellen:

    TRIGGER_GSA=SERVICE_ACCOUNT_NAME
    gcloud iam service-accounts create $TRIGGER_GSA

    Ersetzen Sie SERVICE_ACCOUNT_NAME durch einen Namen mit 6 bis 30 Zeichen. Er kann alphanumerische Zeichen in Kleinschreibung sowie Bindestriche enthalten.

  2. Weisen Sie dem Dienstkonto die Rollen pubsub.subscriber und monitoring.metricWriter zu:

    PROJECT_ID=$(gcloud config get-value project)
    
    gcloud projects add-iam-policy-binding $PROJECT_ID \
      --member "serviceAccount:$TRIGGER_GSA@$PROJECT_ID.iam.gserviceaccount.com" \
      --role "roles/pubsub.subscriber"
    
    gcloud projects add-iam-policy-binding $PROJECT_ID \
      --member "serviceAccount:$TRIGGER_GSA@$PROJECT_ID.iam.gserviceaccount.com" \
      --role "roles/monitoring.metricWriter"
  3. Erstellen Sie einen neuen Eventarc-Trigger basierend auf der Konfiguration des vorhandenen Ereignis-Triggers. Alle Argumente, einschließlich des Zieldienstes, des Clusters und der Themen-ID, müssen mit den Argumenten des vorhandenen Ereignistrigger übereinstimmen.

    gcloud eventarc triggers create EVENTARC_TRIGGER_NAME \
      --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \
      --location LOCATION \
      --destination-gke-service=DESTINATION_SERVICE \
      --destination-gke-cluster=CLUSTER_NAME  \
      --destination-gke-location=CLUSTER_LOCATION  \
      --destination-gke-namespace=EVENTS_NAMESPACE  \
      --destination-gke-path=/ \
      --service-account=$TRIGGER_GSA@$PROJECT_ID.iam.gserviceaccount.com \
      --transport-topic=projects/PROJECT_ID/topics/TOPIC_ID

    Ersetzen Sie EVENTARC_TRIGGER_NAME durch einen Namen für den neuen Eventarc-Trigger und TOPIC_ID durch die zuvor abgerufene Pub/Sub-Themen-ID.

    Dadurch wird ein Eventarc-Trigger für die Pub/Sub-Themen-ID erstellt.

  4. Prüfen Sie, ob der Trigger korrekt erstellt wurde.

    gcloud eventarc triggers list

    Die Ausgabe sieht in etwa so aus:

    NAME                  TYPE                                           DESTINATION_RUN_SERVICE  DESTINATION_RUN_PATH  ACTIVE
    eventarc-trigger-name google.cloud.pubsub.topic.v1.messagePublished                                                 Yes
    

Migration testen und Ausgabe prüfen

Zum Testen Ihrer Migration lösen Sie ein Testereignis aus. Veröffentlichen Sie dazu in einem Pub/Sub-Thema und prüfen Sie dann, ob für jeden vorhandenen Ereignistrigger bzw. Eventarc-Trigger mindestens ein Ereignis gesendet wurde.

Die Ausgabe nach dem Auslösen eines Testereignisses würde beispielsweise dupliziert und in etwa so aussehen:

  Hello, World! ID: 2896291125947199
  Hello, World! ID: 2896291125947199

Sie können auch das folgende Szenario verwenden, wenn der Ereignisempfänger die Ereignisdaten anzeigen kann:

  1. Veröffentlichen Sie eine Nachricht im Pub/Sub-Thema:

    gcloud pubsub topics publish TOPIC_ID \
      --message "Hello, World!"
    
  2. Prüfen Sie das Ereignis und die erfolgreiche Übermittlung. Sehen Sie sich beispielsweise die Logs des empfangenden GKE-Dienstes an:

    kubectl logs \
      --selector serving.knative.dev/service=DESTINATION_SERVICE \
      -c user-container \
      -n EVENTS_NAMESPACE \
      --tail=100
    

    Die Ausgabe der beiden Trigger ähnelt der folgenden, mit den Unterschieden nur in Context Attributes und Extensions. Die tatsächlichen Nachrichtendaten (mit Ausnahme der Daten subscription) sollten identisch sein, damit nach der Migration zu Eventarc keine Änderungen am Ereignisempfänger erforderlich sind.

    Eventarc-Ereignis:

    ☁️  cloudevents.Event
    Validation: valid
    Context Attributes,
      specversion: 1.0
      type: google.cloud.pubsub.topic.v1.messagePublished
      source: //pubsub.googleapis.com/projects/project-id/topics/topic-name
      id: 2759155988927083
      time: 2021-07-22T17:47:19.964Z
      datacontenttype: application/json
    Data,
      {
        "subscription": "projects/project-id/subscriptions/eventarc-us-central1-eventarc-trigger-name-sub-567",
        "message": {
          "data": "V29ybGQ=",
          "messageId": "2759155988927083",
          "publishTime": "2021-07-22T17:47:19.964Z"
        }
      }
    

    Knative-Serving-Ereignis:

    ☁️  cloudevents.Event
    Validation: valid
    Context Attributes,
      specversion: 1.0
      type: google.cloud.pubsub.topic.v1.messagePublished
      source: //pubsub.googleapis.com/projects/project-id/topics/topic-name
      id: 2759155988927083
      time: 2021-07-22T17:47:19.964Z
      dataschema: https://raw.githubusercontent.com/googleapis/google-cloudevents/master/proto/google/events/cloud/pubsub/v1/data.proto
      datacontenttype: application/json
    Extensions,
      knativearrivaltime: 2021-07-22T17:47:20.723302362Z
      knsourcetrigger: link0.09767362059083662
      traceparent: 00-f3cc6d754d361a0e49e83e5973fa3565-b4a20ef4ecffe96b-00
    Data,
      {
        "subscription": "cre-src_events_source-for-trigger-name_5ffa9638-8cab-4010-900a-2edb275d9eaf",
        "message": {
          "messageId": "2759155988927083",
          "data": "V29ybGQ=",
          "publishTime": "2021-07-22T17:47:19.964Z"
        }
      }
    

Nach der Migration bereinigen

Nachdem Sie die Migration des Triggers zu Eventarc getestet und geprüft haben, können Sie den ursprünglichen Ereignis-Trigger löschen.

  1. Löschen Sie den ursprünglichen Ereignistrigger:

    gcloud beta events triggers delete TRIGGER_NAME \
      --platform gke \
      --namespace EVENTS_NAMESPACE \
      --quiet

Sie haben einen vorhandenen Knative-Serving-Trigger zu Eventarc migriert.

Nächste Schritte