Cloud Run for Anthos 이벤트에서 Eventarc로 Pub/Sub 트리거 마이그레이션

Google Kubernetes Engine(GKE) 서비스(Knative serving 서비스 포함)가 Eventarc를 사용하여 Pub/Sub 이벤트를 수신할 수 있도록 이벤트 트리거를 마이그레이션할 수 있습니다. 이 가이드에서는 기존 이벤트 트리거를 마이그레이션하고 GKE 서비스가 GKE 클러스터에서 실행된다고 가정합니다. 마이그레이션은 클러스터에 대해 실행되어야 합니다.

이 마이그레이션 경로는 중복을 최소화하면서 이벤트 손실을 방지합니다.

마이그레이션하려면 다음 작업을 수행합니다.

  1. Eventarc가 GKE 클러스터의 리소스를 관리할 수 있도록 하려면 GKE 대상을 사용 설정합니다.
  2. 필요한 경우 대상 GKE 서비스를 실행하는 GKE 클러스터에 워크로드 아이덴티티를 사용 설정합니다.
  3. 기존 이벤트 트리거를 식별합니다.
  4. 기존 트리거와 동일한 GKE 서비스를 가리키는 Eventarc 트리거를 만듭니다.
  5. Eventarc 트리거가 예상대로 이벤트를 전달하는지 확인합니다.
  6. 원본 이벤트 트리거를 삭제하고 마이그레이션 후 정리를 실행합니다.

시작하기 전에

이 가이드에서는 다음 작업을 이미 완료했다고 가정합니다.

명령줄 환경 설정

gcloudkubectl 명령줄 도구를 설정하려면 다음 안내를 따르세요.

  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. 계정을 사용하여 로그인합니다.

    gcloud auth login
  3. 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

    다음을 바꿉니다.

    • PROJECT_ID: 프로젝트 ID입니다.
    • CLUSTER_NAME: 클러스터 이름
    • CLUSTER_LOCATION을 GKE가 지원되는 영역(예: us-central1-a)으로 바꿉니다.
    • LOCATION을 Eventarc 트리거의 위치(예: us-central1)로 바꿉니다.
  4. 프로젝트에 다음 API를 사용 설정합니다.

    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. kubectl 명령줄 도구를 설치합니다.

    gcloud components install kubectl
  6. 설치된 gcloud CLI 구성요소를 업데이트합니다.

    gcloud components update

GKE 대상 사용 설정

Eventarc가 GKE 클러스터의 리소스를 관리할 수 있도록 하려면 GKE 대상을 사용 설정하고 Eventarc 서비스 계정을 필요한 역할과 결합합니다.

  1. Eventarc에 GKE 대상을 사용 설정합니다.

    gcloud eventarc gke-destinations init
  2. 필요한 역할을 결합하라는 메시지가 표시되면 y를 입력합니다.

    다음 역할이 결합됩니다.

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

클러스터에 GKE용 워크로드 아이덴티티 제휴 사용 설정

클러스터에 이미 GKE용 워크로드 아이덴티티 제휴가 사용 설정된 경우 이 단계를 건너뛸 수 있습니다.

GKE용 워크로드 아이덴티티 제휴는 향상된 보안 속성 및 관리 편의성으로 인해 GKE 내에서 실행되는 애플리케이션에서 Google Cloud 서비스에 액세스하는 데 권장되는 방식입니다. 워크로드 아이덴티티를 사용하려면 Eventarc를 사용하여 GKE 이벤트도 전달해야 합니다.

기존 클러스터에 GKE용 워크로드 아이덴티티 제휴를 사용 설정하려면 워크로드 아이덴티티 사용을 참조하세요.

기존 이벤트 트리거 식별

기존 이벤트 트리거를 마이그레이션하기 전에 트리거 세부정보를 검색해야 합니다.

  1. GKE 클러스터의 기존 이벤트 트리거를 나열합니다.

    gcloud beta events triggers list --namespace EVENTS_NAMESPACE
    

    EVENTS_NAMESPACE를 이벤트 브로커의 네임스페이스로 바꿉니다.

    출력은 다음과 비슷합니다.

       TRIGGER             EVENT TYPE                                     TARGET
    ✔  trigger-id          google.cloud.pubsub.topic.v1.messagePublished  cloud-run-service-name
    
  2. Eventarc 트리거를 만들려면 주제 ID가 필요합니다. 기존 이벤트 트리거의 주제 ID를 검색합니다.

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

    TRIGGER_ID를 기존 이벤트 트리거의 ID나 정규화된 식별자로 바꿉니다.

    출력은 다음과 비슷합니다.

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

기존 트리거를 대체할 Eventarc 트리거 만들기

Eventarc 트리거를 만들기 전에 Eventarc에서 GKE 대상에 대한 이벤트를 관리할 수 있도록 사용자 관리 서비스 계정을 설정하고 특정 역할을 부여합니다.

  1. Google Cloud 서비스 계정(GSA)를 만듭니다.

    TRIGGER_GSA=SERVICE_ACCOUNT_NAME
    gcloud iam service-accounts create $TRIGGER_GSA

    SERVICE_ACCOUNT_NAME을 6~30자(영문 기준) 사이의 이름으로 바꿉니다. 소문자 영숫자 문자와 대시를 포함할 수 있습니다.

  2. 서비스 계정에 pubsub.subscribermonitoring.metricWriter 역할을 부여합니다.

    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. 기존 이벤트 트리거 구성에 따라 새 Eventarc 트리거를 만듭니다. 대상 서비스, 클러스터, 주제 ID를 포함한 모든 인수는 기존 이벤트 트리거의 인수와 일치해야 합니다.

    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

    EVENTARC_TRIGGER_NAME을 새 Eventarc 트리거의 이름으로 바꾸고 TOPIC_ID를 이전에 검색한 Pub/Sub 주제 ID로 바꿉니다.

    이렇게 하면 Pub/Sub 주제 ID에 대한 Eventarc 트리거가 생성됩니다.

  4. 트리거가 성공적으로 생성되었는지 확인하세요.

    gcloud eventarc triggers list

    출력은 다음과 비슷합니다.

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

마이그레이션 테스트 및 출력 확인

마이그레이션을 테스트하려면 Pub/Sub 주제에 게시하여 테스트 이벤트를 트리거한 후 각각의 기존 이벤트 트리거와 Eventarc 트리거에 이벤트가 최소 하나 이상 전달되는지 확인합니다.

예를 들어 테스트 이벤트를 트리거한 후의 출력은 중복되며 다음과 유사합니다.

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

또한 안내 제공을 위해 다음과 같이 이벤트 수신자가 이벤트 데이터를 표시할 수 있는 시나리오를 사용할 수 있습니다.

  1. 메시지를 Pub/Sub 주제에 게시합니다.

    gcloud pubsub topics publish TOPIC_ID \
      --message "Hello, World!"
    
  2. 이벤트와 이벤트의 성공적인 전달 여부를 확인합니다. 예를 들어 수신 GKE 서비스 로그를 확인합니다.

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

    두 트리거의 출력은 다음과 유사하며 Context AttributesExtensions에서만 차이가 있습니다. Eventarc로 마이그레이션한 후 이벤트 수신자 변경이 필요하지 않도록 하려면 subscription 데이터를 제외하고 실제 메시지 데이터가 동일해야 합니다.

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

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

마이그레이션 후 정리

트리거를 Eventarc로 마이그레이션하는 작업을 테스트하고 확인한 후에는 원본 이벤트 트리거를 삭제할 수 있습니다.

  1. 원본 이벤트 트리거를 삭제합니다.

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

기존 Knative serving 트리거를 Eventarc로 마이그레이션했습니다.

다음 단계