Migre acionadores do Pub/Sub de Events for Cloud Run for Anthos para o Eventarc

Pode migrar acionadores de eventos para que um serviço do Google Kubernetes Engine (GKE) (incluindo serviços de fornecimento do Knative) possa receber eventos do Pub/Sub através do Eventarc. Este guia pressupõe que está a migrar acionadores de eventos existentes e que o seu serviço GKE está a ser executado num cluster GKE. É necessário executar uma migração para cada cluster.

Este caminho de migração evita a perda de eventos e minimiza a respetiva duplicação.

A migração envolve o seguinte:

  1. Para permitir que o Eventarc faça a gestão de recursos no cluster do GKE, ative os destinos do GKE.
  2. Se necessário, ative o Workload Identity para o cluster do GKE que executa o serviço do GKE de destino.
  3. Identifique acionadores de eventos existentes.
  4. Crie um acionador do Eventarc que aponte para o mesmo serviço do GKE que o acionador existente.
  5. Confirme se o acionador do Eventarc está a enviar eventos conforme esperado.
  6. Eliminar o acionador de eventos original e fazer a limpeza após a migração.

Antes de começar

Este guia pressupõe que já tem:

Configure o ambiente de linha de comandos

Para configurar as ferramentas de linha de comandos 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. Inicie sessão com a sua conta:

    gcloud auth login
  3. Defina as predefinições 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 o seguinte:

    • PROJECT_ID: o ID do seu projeto
    • CLUSTER_NAME: o nome do seu cluster
    • CLUSTER_LOCATION: qualquer zona onde o GKE é suportado; por exemplo: us-central1-a.
    • LOCATION: uma localização para o acionador 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 comandos kubectl:

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

    gcloud components update
  7. Ative os destinos do GKE

    Para permitir que o Eventarc faça a gestão de recursos no cluster do GKE, ative os destinos do GKE e associe a conta de serviço do Eventarc às funções necessárias.

    1. Ative os destinos do GKE para o Eventarc:

      gcloud eventarc gke-destinations init
    2. No comando para associar as funções necessárias, introduza y.

      As seguintes funções estão associadas:

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

    Ative a federação de identidades de cargas de trabalho para o GKE num cluster

    Se a Workload Identity Federation para o GKE já estiver ativada no seu cluster, pode ignorar este passo.

    A Workload Identity Federation para o GKE é a forma recomendada de aceder aos Google Cloud serviços a partir de aplicações em execução no GKE devido às suas propriedades de segurança e capacidade de gestão melhoradas. Também é necessário para encaminhar eventos do GKE através do Eventarc.

    Para ativar a federação de identidade da força de trabalho para o GKE num cluster existente, consulte o artigo Usar o Workload Identity.

    Identifique acionadores de eventos existentes

    Antes de migrar quaisquer acionadores de eventos existentes, tem de obter os detalhes do acionador.

    1. Liste os acionadores de eventos existentes para o cluster do GKE:

      gcloud beta events triggers list --namespace EVENTS_NAMESPACE
      

      Substitua EVENTS_NAMESPACE pelo espaço de nomes do seu agente de eventos.

      O resultado é semelhante ao seguinte:

         TRIGGER             EVENT TYPE                                     TARGET
      ✔  trigger-id          google.cloud.pubsub.topic.v1.messagePublished  cloud-run-service-name
      
    2. Precisa do ID do tópico para criar o acionador do Eventarc. Recupere o ID do tópico para o acionador de eventos existente:

      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 acionador de evento existente ou por um identificador totalmente qualificado.

      O resultado é semelhante ao seguinte:

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

    Crie um acionador do Eventarc para substituir o acionador existente

    Antes de criar o acionador do Eventarc, configure uma conta de serviço gerida pelo utilizador e conceda-lhe funções específicas para que o Eventarc possa gerir eventos para destinos do GKE.

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

      TRIGGER_GSA=SERVICE_ACCOUNT_NAME
      gcloud iam service-accounts create $TRIGGER_GSA

      Substitua SERVICE_ACCOUNT_NAME por um nome com entre 6 e 30 carateres. Pode conter carateres alfanuméricos minúsculos e travessões.

    2. Conceda as funções 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 acionador do Eventarc com base na configuração do acionador de eventos existente. Todos os argumentos, incluindo o serviço de destino, o cluster e o ID do tópico, devem corresponder aos do acionador de eventos existente.

      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 acionador do Eventarc e TOPIC_ID pelo ID do tópico do Pub/Sub que obteve anteriormente.

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

    4. Confirme que o acionador foi criado com êxito:

      gcloud eventarc triggers list

      O resultado é semelhante ao seguinte:

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

    Teste a migração e valide o resultado

    Para testar a migração, acione um evento de teste publicando num tópico do Pub/Sub e, em seguida, verifique se existe, pelo menos, um evento entregue para cada um dos acionadores de eventos existentes e acionadores do Eventarc, respetivamente.

    Por exemplo, o resultado após acionar um evento de teste seria duplicado e seria semelhante ao seguinte:

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

    Também pode usar o seguinte cenário para receber orientações em que o recetor de eventos pode apresentar os dados de eventos:

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

      gcloud pubsub topics publish TOPIC_ID \
        --message "Hello, World!"
      
    2. Valide o evento e o respetivo envio bem-sucedido. Por exemplo, consulte os registos do serviço GKE de receção:

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

      A saída dos dois acionadores é semelhante à seguinte, com diferenças apenas em Context Attributes e Extensions. Os dados de mensagens reais, com exceção dos dados subscription, devem ser idênticos para que não sejam necessárias alterações ao recetor 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 de publicação do 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"
          }
        }
      

    Limpe o conteúdo após a migração

    Depois de testar e validar a migração do acionador para o Eventarc, pode eliminar o acionador de eventos original.

    1. Elimine o acionador de evento original:

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

    Migrou um acionador do Knative Serving existente para o Eventarc.

    O que se segue?