Migrar activadores de Pub/Sub de eventos para Cloud Run for Anthos a Eventarc

Puedes migrar activadores de eventos para que un servicio de Google Kubernetes Engine (GKE) (incluidos los servicios de Knative Serving) pueda recibir eventos de Pub/Sub mediante Eventarc. En esta guía se da por hecho que vas a migrar activadores de eventos y que tu servicio de GKE se ejecuta en un clúster de GKE. Es necesario ejecutar una migración para cada clúster.

Con esta ruta de migración, no se pierden eventos y se minimiza la duplicación.

La migración implica lo siguiente:

  1. Para permitir que Eventarc gestione recursos en el clúster de GKE, habilita los destinos de GKE.
  2. Si es necesario, habilita Workload Identity en el clúster de GKE que ejecuta el servicio de GKE de destino.
  3. Identifique los activadores de eventos que ya tenga.
  4. Crea un activador de Eventarc que apunte al mismo servicio de GKE que el activador actual.
  5. Confirma que el activador de Eventarc está enviando eventos según lo previsto.
  6. Elimina el activador de eventos original y limpia los datos después de la migración.

Antes de empezar

En esta guía se da por hecho que ya has hecho lo siguiente:

Configurar el entorno de la línea de comandos

Para configurar las herramientas de línea de comandos gcloud y kubectl, sigue estos pasos:

  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. Inicia sesión con tu cuenta:

    gcloud auth login
  3. Define la configuración predeterminada 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

    Haz los cambios siguientes:

    • PROJECT_ID: tu ID de proyecto
    • CLUSTER_NAME: el nombre de tu clúster
    • CLUSTER_LOCATION: cualquier zona en la que se admita GKE. Por ejemplo, us-central1-a.
    • LOCATION: una ubicación para el activador de Eventarc. Por ejemplo, us-central1.
  4. Habilita las siguientes APIs en el proyecto:

    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. Instala la herramienta de línea de comandos kubectl:

    gcloud components install kubectl
  6. Actualiza los componentes instalados de gcloud CLI:

    gcloud components update
  7. Habilitar destinos de GKE

    Para permitir que Eventarc gestione recursos en el clúster de GKE, habilita los destinos de GKE y vincula la cuenta de servicio de Eventarc con los roles necesarios.

    1. Habilita los destinos de GKE para Eventarc:

      gcloud eventarc gke-destinations init
    2. Cuando se te pida que enlaces los roles necesarios, introduce y.

      Se han vinculado los siguientes roles:

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

    Habilitar Workload Identity Federation para GKE en un clúster

    Si Workload Identity Federation for GKE ya está habilitado en tu clúster, puedes saltarte este paso.

    Workload Identity Federation for GKE es la forma recomendada de acceder a los Google Cloud servicios desde las aplicaciones que se ejecutan en GKE, ya que ofrece propiedades de seguridad y gestión mejoradas. También es necesario para reenviar eventos de GKE mediante Eventarc.

    Para habilitar Workload Identity Federation for GKE en un clúster, consulta el artículo Usar Workload Identity.

    Identificar activadores de eventos

    Antes de migrar los activadores de eventos que ya tengas, debes obtener los detalles de los activadores.

    1. Lista los activadores de eventos del clúster de GKE:

      gcloud beta events triggers list --namespace EVENTS_NAMESPACE
      

      Sustituye EVENTS_NAMESPACE por el espacio de nombres de tu intermediario de eventos.

      El resultado debería ser similar al siguiente:

         TRIGGER             EVENT TYPE                                     TARGET
      ✔  trigger-id          google.cloud.pubsub.topic.v1.messagePublished  cloud-run-service-name
      
    2. Necesitarás el ID del tema para crear el activador de Eventarc. Recupera el ID del tema del activador de eventos:

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

      Sustituye TRIGGER_ID por el ID del activador de evento que ya tengas o por un identificador completo.

      El resultado debería ser similar al siguiente:

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

    Crear un activador de Eventarc para sustituir el activador actual

    Antes de crear el activador de Eventarc, configura una cuenta de servicio gestionada por el usuario y concédele roles específicos para que Eventarc pueda gestionar eventos de destinos de GKE.

    1. Crea una Google Cloud cuenta de servicio (GSA):

      TRIGGER_GSA=SERVICE_ACCOUNT_NAME
      gcloud iam service-accounts create $TRIGGER_GSA

      Sustituye SERVICE_ACCOUNT_NAME por un nombre que tenga entre 6 y 30 caracteres. Puede contener caracteres alfanuméricos en minúscula y guiones.

    2. Asigna los roles pubsub.subscriber y monitoring.metricWriter a la cuenta de servicio:

      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 nuevo activador de Eventarc basado en la configuración del activador de eventos. Todos los argumentos, incluidos el servicio de destino, el clúster y el ID del tema, deben coincidir con los del activador de eventos.

      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

      Sustituye EVENTARC_TRIGGER_NAME por el nombre del nuevo activador de Eventarc y TOPIC_ID por el ID del tema de Pub/Sub que has obtenido anteriormente.

      De esta forma, se crea un activador de Eventarc para el ID del tema de Pub/Sub.

    4. Confirma que el activador se ha creado correctamente:

      gcloud eventarc triggers list

      El resultado debería ser similar al siguiente:

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

    Probar la migración y verificar el resultado

    Para probar la migración, activa un evento de prueba publicando en un tema de Pub/Sub y, a continuación, comprueba que se haya enviado al menos un evento a cada uno de los activadores de eventos y activadores de Eventarc.

    Por ejemplo, el resultado después de activar un evento de prueba se duplicaría y sería similar al siguiente:

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

    También puede usar la siguiente situación como guía para que el receptor de eventos pueda mostrar los datos de eventos:

    1. Publica un mensaje en el tema de Pub/Sub:

      gcloud pubsub topics publish TOPIC_ID \
        --message "Hello, World!"
      
    2. Verifica el evento y que se ha enviado correctamente. Por ejemplo, consulta los registros del servicio de GKE receptor:

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

      La salida de los dos activadores es similar a la siguiente, con diferencias solo en Context Attributes y Extensions. Los datos de los mensajes, a excepción de los datos subscription, deben ser idénticos para que no sea necesario hacer ningún cambio en el receptor de eventos después de migrar a Eventarc.

      Evento de 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 de servicio de 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"
          }
        }
      

    Limpiar después de la migración

    Después de probar y verificar la migración del activador a Eventarc, puedes eliminar el activador de eventos original.

    1. Elimina el activador de eventos original:

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

    Has migrado un activador de servicio de Knative a Eventarc.

    Siguientes pasos