É 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:
- Permitir que o Eventarc gerencie recursos no cluster do GKE, ative os destinos do GKE.
- Se necessário, ativar a Identidade da carga de trabalho para o cluster do GKE que executa o serviço de destino do GKE.
- Identificar os gatilhos de evento atuais.
- Criar um gatilho do Eventarc que aponte para o mesmo serviço do GKE que o gatilho atual.
- Confirmar se o gatilho do Eventarc está entregando eventos conforme esperado.
- 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
:
In the Google Cloud console, 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.
Faça login usando sua conta:
gcloud auth login
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:
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
Instale a ferramenta de linha de comando
kubectl
:gcloud components install kubectl
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.
Ative os destinos do GKE para o Eventarc:
gcloud eventarc gke-destinations init
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 Federação de Identidade da Carga de Trabalho para GKE em um cluster registrado
Se a Federação de Identidade da Carga de Trabalho para GKE já estiver ativada no cluster, pule esta etapa.
A Federação de Identidade da Carga de Trabalho para o GKE é a maneira recomendada de acessar os serviços do Google Cloud em aplicativos em execução no GKE devido às propriedades de segurança e capacidade de gerenciamento aprimoradas. Ela também é necessária para encaminhar eventos do GKE usando o Eventarc.
Para ativar a Federação de identidade da carga de trabalho para o GKE 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.
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
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.
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.Conceda os papéis
pubsub.subscriber
emonitoring.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"
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.
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:
Publique uma mensagem no tópico do Pub/Sub:
gcloud pubsub topics publish TOPIC_ID \ --message "Hello, World!"
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
eExtensions
. Os dados reais da mensagem, exceto os dadossubscription
, 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.
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.