Migrer les déclencheurs Pub/Sub depuis Events for Cloud Run for Anthos vers Eventarc

Vous pouvez migrer des déclencheurs d'événements afin qu'un service Google Kubernetes Engine (GKE) (y compris les services de diffusion Knative) puisse recevoir des événements Pub/Sub à l'aide d'Eventarc. Dans ce guide, nous partons du principe que vous migrez des déclencheurs d'événements existants et que votre service GKE s'exécute dans un cluster GKE. Une migration doit être exécutée pour chaque cluster.

Ce chemin de migration permet d'éviter la perte d'événements tout en minimisant leur duplication.

La migration implique les opérations suivantes :

  1. Pour permettre à Eventarc de gérer les ressources du cluster GKE, activez les destinations GKE.
  2. Si nécessaire, activez Workload Identity pour le cluster GKE exécutant votre service GKE cible.
  3. Identifiez les déclencheurs d'événements existants.
  4. Créez un déclencheur Eventarc qui pointe vers le même service GKE que le déclencheur existant.
  5. Vérifiez que le déclencheur Eventarc diffuse les événements comme prévu.
  6. Supprimez le déclencheur d'événements d'origine et nettoyez après la migration.

Avant de commencer

Ce guide suppose que vous disposez des éléments suivants :

Configurer l'environnement de ligne de commande

Pour configurer les outils de ligne de commande gcloud et kubectl, procédez comme suit :

  1. Dans la console Google Cloud, activez Cloud Shell.

    Activer Cloud Shell

    En bas de la fenêtre de la console Google Cloud, une session Cloud Shell démarre et affiche une invite de ligne de commande. Cloud Shell est un environnement shell dans lequel Google Cloud CLI est déjà installé, et dans lequel des valeurs sont déjà définies pour votre projet actuel. L'initialisation de la session peut prendre quelques secondes.

  2. Connectez-vous à votre compte :

    gcloud auth login
  3. Configurez les paramètres par défaut de 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
    

    Remplacez les éléments suivants :

    • PROJECT_ID : ID de votre projet.
    • CLUSTER_NAME : nom du cluster
    • CLUSTER_LOCATION : n'importe quelle zone où GKE est disponible (par exemple : us-central1-a).
    • LOCATION : un emplacement pour le déclencheur Eventarc (par exemple : us-central1).
  4. Activez les API suivantes pour le projet :

    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. Installer l'outil de ligne de commande kubectl :

    gcloud components install kubectl
  6. Mettez à jour les composants de la CLI gcloud installés:

    gcloud components update

Activer les destinations GKE

Pour permettre à Eventarc de gérer les ressources du cluster GKE, activez les destinations GKE et liez le compte de service Eventarc aux rôles requis.

  1. Activez les destinations GKE pour Eventarc :

    gcloud eventarc gke-destinations init
    
  2. Lorsque vous êtes invité à lier les rôles requis, saisissez y.

    Les rôles suivants sont liés :

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

Activer Workload Identity sur un cluster

Si Workload Identity est déjà activé sur votre cluster, vous pouvez ignorer cette étape.

Workload Identity est la solution recommandée pour accéder aux services Google Cloud à partir des applications s'exécutant dans GKE en raison de ses propriétés de sécurité renforcée et de sa facilité de gestion. Il est également nécessaire de transférer les événements GKE à l'aide d'Eventarc.

Pour activer Workload Identity sur un cluster existant, consultez la page Utiliser Workload Identity.

Identifier les déclencheurs d'événements existants

Avant de migrer des déclencheurs d'événements existants, vous devez récupérer les détails du déclencheur.

  1. Répertoriez les déclencheurs d'événements existants pour le cluster GKE:

    gcloud beta events triggers list --namespace EVENTS_NAMESPACE
    

    Replacez EVENTS_NAMESPACE par l'espace de noms de votre agent d'événements.

    Le résultat ressemble à ce qui suit :

       TRIGGER             EVENT TYPE                                     TARGET
    ✔  trigger-id          google.cloud.pubsub.topic.v1.messagePublished  cloud-run-service-name
    
  2. Vous aurez besoin de l'ID du sujet pour créer le déclencheur Eventarc. Récupérez l'ID du sujet pour le déclencheur d'événements existant:

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

    Remplacez TRIGGER_ID par l'ID du déclencheur d'événement existant ou un identifiant complet.

    Le résultat ressemble à ce qui suit :

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

Créer un déclencheur Eventarc pour remplacer le déclencheur existant

Avant de créer le déclencheur Eventarc, configurez un compte de service géré par l'utilisateur et attribuez-lui des rôles spécifiques afin qu'Eventarc puisse gérer les événements pour les destinations GKE.

  1. Créer un compte de service Google Cloud :

    TRIGGER_GSA=SERVICE_ACCOUNT_NAME
    gcloud iam service-accounts create $TRIGGER_GSA

    Remplacez SERVICE_ACCOUNT_NAME par un nom comportant entre 6 et 30 caractères. Il peut contenir des caractères alphanumériques minuscules et des tirets.

  2. Attribuez les rôles pubsub.subscriber et monitoring.metricWriter au compte de service :

    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. Créez un déclencheur Eventarc basé sur la configuration du déclencheur d'événements existant. Tous les arguments, y compris le service de destination, le cluster et l'ID du sujet, doivent correspondre à ceux du déclencheur d'événements existant.

    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
    

    Remplacez EVENTARC_TRIGGER_NAME par le nom du nouveau déclencheur Eventarc et TOPIC_ID par l'ID du sujet Pub/Sub que vous avez récupéré précédemment.

    Cela crée un déclencheur Eventarc pour l'ID de sujet Pub/Sub.

  4. Vérifiez que le déclencheur a bien été créé :

    gcloud eventarc triggers list
    

    Le résultat ressemble à ce qui suit :

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

Tester la migration et vérifier le résultat

Pour tester votre migration, déclenchez un événement de test en publiant dans un sujet Pub/Sub, puis vérifiez qu'au moins un événement est distribué pour chacun des déclencheurs d'événements existants et des déclencheurs Eventarc, respectivement.

Par exemple, le résultat après le déclenchement d'un événement de test est dupliqué et ressemble à ce qui suit:

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

Vous pouvez également utiliser le scénario suivant pour savoir comment le récepteur d'événements peut afficher les données d'événements :

  1. Publiez un message sur le sujet Pub/Sub :

    gcloud pubsub topics publish TOPIC_ID \
      --message "Hello, World!"
    
  2. Vérifiez l'événement et sa distribution. Par exemple, consultez les journaux du service GKE destinataire:

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

    Le résultat des deux déclencheurs est semblable à celui-ci, avec des différences uniquement dans Context Attributes et Extensions. Les données de message réelles, à l'exception des données subscription, doivent être identiques afin qu'aucune modification du récepteur d'événements ne soit requise après la migration vers Eventarc.

    Événement 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"
        }
      }
    

    Événement de diffusion Knative:

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

Nettoyer après la migration

Après avoir testé et vérifié la migration du déclencheur vers Eventarc, vous pouvez supprimer le déclencheur d'événement d'origine.

  1. Supprimez le déclencheur d'événements d'origine:

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

Vous avez migré un déclencheur de diffusion Knative existant vers Eventarc.

Étapes suivantes