Migrar gatilhos do Pub/Sub de eventos do Cloud Run for Anthos para o Eventarc

É possível migrar gatilhos de evento para que um serviço do Google Kubernetes Engine (GKE), incluindo serviços do Knative serving, possa receber eventos do Pub/Sub usando o Eventarc. Neste guia, consideramos que você está migrando gatilhos de evento atuais e que seu serviço do GKE é executado em um cluster do GKE. Uma migração precisa ser executada para cada cluster.

Esse caminho de migração evita a perda de eventos e minimiza a duplicação deles.

A migração envolve o seguinte:

  1. Permitir que o Eventarc gerencie recursos no cluster do GKE, ative os destinos do GKE.
  2. Se necessário, ativar a Identidade da carga de trabalho para o cluster do GKE que executa o serviço de destino do GKE.
  3. Identificar os gatilhos de evento atuais.
  4. Criar um gatilho do Eventarc que aponte para o mesmo serviço do GKE que o gatilho atual.
  5. Confirmar se o gatilho do Eventarc está entregando eventos conforme esperado.
  6. Excluir o gatilho de evento original e fazer a limpeza após a migração.

Antes de começar

Veja o que é necessário para seguir este guia:

Configurar o ambiente de linha de comando

Para configurar as ferramentas de linha de comando gcloud e kubectl:

  1. No Console do Google Cloud, ative o Cloud Shell.

    Ativar o Cloud Shell

    Na parte inferior do Console do Google Cloud, uma sessão do Cloud Shell é iniciada e exibe um prompt de linha de comando. O Cloud Shell é um ambiente shell com a CLI do Google Cloud já instalada e com valores já definidos para o projeto atual. A inicialização da sessão pode levar alguns segundos.

  2. Faça login usando sua conta:

    gcloud auth login
  3. Defina as configurações padrão para a CLI gcloud:

    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
    

    Substitua:

    • PROJECT_ID: ID do projeto;
    • CLUSTER_NAME: o nome do cluster
    • CLUSTER_LOCATION qualquer zona com suporte para o GKE. Por exemplo: us-central1-a.
    • LOCATION um local para o gatilho do Eventarc. Por exemplo: us-central1.
  4. Ative as seguintes APIs para o projeto:

    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. Instale a ferramenta de linha de comando kubectl:

    gcloud components install kubectl
  6. Atualize os componentes da CLI gcloud instalados:

    gcloud components update

Ativar destinos do GKE

Para permitir que o Eventarc gerencie recursos no cluster do GKE, ative os destinos do GKE e vincule a conta de serviço do Eventarc aos papéis necessários.

  1. Ative os destinos do GKE para o Eventarc:

    gcloud eventarc gke-destinations init
    
  2. No prompt para vincular os papéis necessários, digite y.

    Os papéis a seguir estão vinculados:

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

Ativar a Identidade da carga de trabalho em um cluster

Se a Identidade da carga de trabalho já estiver ativada no cluster, pule esta etapa.

A Identidade da carga de trabalho é a forma recomendada para acessar os serviços do Google Cloud pelos aplicativos em execução no GKE, devido às propriedades de segurança e maleabilidade da ferramenta. Ela também é necessária para encaminhar eventos do GKE usando o Eventarc.

Para ativar a Identidade da carga de trabalho em um cluster atual, consulte Como usar a Identidade da carga de trabalho.

Identificar os gatilhos de evento atuais

Antes de migrar qualquer gatilho de evento atual, recupere os detalhes dele.

  1. Liste os gatilhos de evento atuais do cluster do GKE:

    gcloud beta events triggers list --namespace EVENTS_NAMESPACE
    

    Substitua EVENTS_NAMESPACE pelo namespace do agente de eventos.

    A saída será assim:

       TRIGGER             EVENT TYPE                                     TARGET
    ✔  trigger-id          google.cloud.pubsub.topic.v1.messagePublished  cloud-run-service-name
    
  2. Você vai precisar do ID do tópico para criar o gatilho do Eventarc. Recupere o ID do tópico do gatilho de evento atual:

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

    Substitua TRIGGER_ID pelo ID do gatilho de evento atual ou por um identificador totalmente qualificado.

    O resultado será assim:

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

Criar um gatilho do Eventarc para substituir o gatilho atual

Antes de criar o gatilho do Eventarc, configure uma conta de serviço gerenciada pelo usuário e conceda a ela papéis específicos para que o Eventarc possa gerenciar eventos de destinos do GKE.

  1. Crie uma conta de serviço do Google Cloud (GSA):

    TRIGGER_GSA=SERVICE_ACCOUNT_NAME
    gcloud iam service-accounts create $TRIGGER_GSA

    Substitua SERVICE_ACCOUNT_NAME por um nome que tenha de 6 a 30 caracteres. Ele pode conter caracteres alfanuméricos minúsculos e traços.

  2. Conceda os papéis pubsub.subscriber e monitoring.metricWriter à conta de serviço:

    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. Crie um novo gatilho do Eventarc com base na configuração do gatilho de evento atual. Todos os argumentos, incluindo o serviço de destino, o cluster e o ID do tópico, precisam corresponder aos do gatilho de evento atual.

    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
    

    Substitua EVENTARC_TRIGGER_NAME por um nome para o novo gatilho do Eventarc e TOPIC_ID pelo ID do tópico do Pub/Sub recuperado anteriormente.

    Essa ação cria um gatilho do Eventarc para o ID do tópico do Pub/Sub.

  4. Confirme se o gatilho foi criado:

    gcloud eventarc triggers list
    

    A saída será assim:

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

Testar a migração e verificar a saída

Para testar a migração, publique um evento de teste em um tópico do Pub/Sub e verifique se há pelo menos um evento entregue para cada um dos gatilhos de evento atuais e gatilhos do Eventarc, respectivamente.

Por exemplo, a saída após o acionamento de um evento de teste seria copiada e ficaria assim:

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

Também é possível usar o seguinte cenário para uma orientação em que o receptor de eventos pode exibir os dados do evento:

  1. Publique uma mensagem no tópico do Pub/Sub:

    gcloud pubsub topics publish TOPIC_ID \
      --message "Hello, World!"
    
  2. Verifique o evento e a entrega dele. Por exemplo, observe os registros do serviço do GKE recebido:

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

    A saída dos dois gatilhos é semelhante à seguinte, com diferenças apenas em Context Attributes e Extensions. Os dados reais da mensagem, exceto os dados subscription, precisam ser idênticos para que não seja necessário alterar o receptor de eventos após a migração para o Eventarc.

    Evento do 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 do 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"
        }
      }
    

Fazer a limpeza após a migração

Depois de testar e verificar a migração do gatilho para o Eventarc, é possível excluir o gatilho de evento original.

  1. Exclua o gatilho de evento original:

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

Você migrou um gatilho do Knative serving para o Eventarc.

A seguir