Migrazione dei trigger Pub/Sub da Events for Cloud Run for Anthos a Eventarc

Puoi eseguire la migrazione dei trigger di eventi in modo che un servizio Google Kubernetes Engine (GKE) (inclusi i servizi Knative) possa ricevere eventi Pub/Sub utilizzando Eventarc. Questa guida presuppone che tu stia eseguendo la migrazione di trigger di eventi esistenti e che il tuo servizio GKE sia in esecuzione in un cluster GKE. È necessario eseguire una migrazione per ogni cluster.

Questo percorso di migrazione evita la perdita di eventi e ne riduce al minimo la duplicazione.

La migrazione prevede quanto segue:

  1. Per consentire a Eventarc di gestire le risorse nel cluster GKE, abilita le destinazioni GKE.
  2. Se necessario, abilita Workload Identity per il cluster GKE che esegue il servizio GKE di destinazione.
  3. Identifica i trigger di eventi esistenti.
  4. Crea un trigger Eventarc che punti allo stesso servizio GKE del trigger esistente.
  5. Verifica che il trigger Eventarc stia inviando gli eventi come previsto.
  6. Elimina il trigger evento originale ed esegui la pulizia dopo la migrazione.

Prima di iniziare

Questa guida presuppone che tu disponga già di:

Configurazione dell'ambiente a riga di comando

Per configurare gli strumenti a riga di comando gcloud e kubectl:

  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. Accedi utilizzando il tuo account:

    gcloud auth login
  3. Imposta le impostazioni predefinite per gcloud CLI:

    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

    Sostituisci quanto segue:

    • PROJECT_ID: il tuo ID progetto
    • CLUSTER_NAME: il nome del tuo cluster
    • CLUSTER_LOCATION: qualsiasi zona in cui è supportato GKE, ad esempio us-central1-a.
    • LOCATION: una posizione per il trigger Eventarc, ad esempio us-central1.
  4. Abilita le seguenti API per il progetto:

    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. Installa lo strumento a riga di comando kubectl:

    gcloud components install kubectl
  6. Aggiorna i componenti di gcloud CLI installati:

    gcloud components update
  7. Abilita le destinazioni GKE

    Per consentire a Eventarc di gestire le risorse nel cluster GKE, attiva le destinazioni GKE e associa il account di servizio Eventarc ai ruoli richiesti.

    1. Abilita le destinazioni GKE per Eventarc:

      gcloud eventarc gke-destinations init
    2. Al prompt per associare i ruoli richiesti, inserisci y.

      Sono associati i seguenti ruoli:

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

    Abilita la federazione delle identità per i carichi di lavoro per GKE su un cluster

    Se Workload Identity Federation for GKE è già abilitato sul tuo cluster, puoi saltare questo passaggio.

    Workload Identity Federation for GKE è il metodo consigliato per accedere ai servizi Google Cloud dalle applicazioni in esecuzione in GKE grazie al miglioramento delle sue proprietà di sicurezza e della sua gestibilità. È necessario anche per inoltrare gli eventi GKE utilizzando Eventarc.

    Per abilitare Workload Identity Federation for GKE in un cluster esistente, consulta Utilizzo di Workload Identity.

    Identificare i trigger di eventi esistenti

    Prima di eseguire la migrazione di eventuali trigger di eventi esistenti, devi recuperare i dettagli del trigger.

    1. Elenca i trigger di eventi esistenti per il cluster GKE:

      gcloud beta events triggers list --namespace EVENTS_NAMESPACE
      

      Sostituisci EVENTS_NAMESPACE con lo spazio dei nomi del broker di eventi.

      L'output è simile al seguente:

         TRIGGER             EVENT TYPE                                     TARGET
      ✔  trigger-id          google.cloud.pubsub.topic.v1.messagePublished  cloud-run-service-name
      
    2. Per creare il trigger Eventarc, avrai bisogno dell'ID argomento. Recupera l'ID argomento per l'attivatore di eventi esistente:

      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)"
      

      Sostituisci TRIGGER_ID con l'ID del trigger evento esistente o con un identificatore completo.

      L'output è simile al seguente:

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

    Crea un trigger Eventarc per sostituire il trigger esistente

    Prima di creare il trigger Eventarc, configura un account di servizio gestito dall'utente e concedigli ruoli specifici in modo che Eventarc possa gestire gli eventi per le destinazioni GKE.

    1. Crea un Google Cloud service account (GSA):

      TRIGGER_GSA=SERVICE_ACCOUNT_NAME
      gcloud iam service-accounts create $TRIGGER_GSA

      Sostituisci SERVICE_ACCOUNT_NAME con un nome compreso tra 6 e 30 caratteri. Può contenere caratteri alfanumerici minuscoli e trattini.

    2. Concedi i ruoli pubsub.subscriber e monitoring.metricWriter al account di servizio:

      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. Crea un nuovo trigger Eventarc in base alla configurazione del trigger di eventi esistente. Tutti gli argomenti, inclusi il servizio di destinazione, il cluster e l'ID argomento, devono corrispondere a quelli del trigger evento esistente.

      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

      Sostituisci EVENTARC_TRIGGER_NAME con un nome per il nuovo trigger Eventarc e TOPIC_ID con l'ID argomento Pub/Sub che hai recuperato in precedenza.

      Viene creato un trigger Eventarc per l'ID argomento Pub/Sub.

    4. Verifica che il trigger sia stato creato correttamente:

      gcloud eventarc triggers list

      L'output è simile al seguente:

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

    Testare la migrazione e verificare l'output

    Per testare la migrazione, attiva un evento di test pubblicando un argomento Pub/Sub, quindi verifica che sia stato distribuito almeno un evento per ciascuno dei trigger di eventi e dei trigger Eventarc esistenti.

    Ad esempio, l'output dopo l'attivazione di un evento di test verrà duplicato e sarà simile al seguente:

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

    Puoi anche utilizzare lo scenario seguente come guida in cui il destinatario dell'evento può visualizzare i dati dell'evento:

    1. Pubblica un messaggio nell'argomento Pub/Sub:

      gcloud pubsub topics publish TOPIC_ID \
        --message "Hello, World!"
      
    2. Verifica l'evento e la sua pubblicazione riuscita. Ad esempio, esamina i log del servizio GKE di ricezione:

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

      L'output dei due trigger è simile al seguente, con differenze solo in Context Attributes e Extensions. I dati effettivi del messaggio, ad eccezione dei dati subscription, devono essere identici in modo che non siano necessarie modifiche al ricevitore di eventi dopo la migrazione a Eventarc.

      Evento Eventarc:

      ☁️  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"
          }
        }
      

      Evento Knative serving:

      ☁️  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"
          }
        }
      

    Pulizia dopo la migrazione

    Dopo aver testato e verificato la migrazione del trigger a Eventarc, puoi eliminare il trigger di eventi originale.

    1. Elimina il trigger di eventi originale:

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

    Hai eseguito la migrazione di un trigger Knative serving esistente a Eventarc.

    Passaggi successivi