自動調度 Kafka 消費者工作負載的資源

本教學課程說明如何設定 Kafka 自動調整程式,並以 Cloud Run 服務的形式部署。這個自動調度器會對 Kafka 消費者工作負載執行調度邏輯,例如 Cloud Run 工作站集區部署作業。Kafka 自動調度器會從 Kafka 叢集讀取指標,並使用 Cloud Run worker 集區服務的手動調度功能,根據 Kafka 消費者延遲指標調度 Kafka 消費者工作負載。

下圖顯示 Kafka 自動配置器服務如何從 Kafka 叢集讀取指標,自動調整 Kafka 消費者工作站集區的資源配置。

Kafka 自動調度器服務會從 Kafka 提取指標,並自動調度 Kafka 消費者

必要的角色

如要取得部署及執行這項服務所需的權限,請要求管理員授予下列 IAM 角色:

事前準備

如要設定及使用 Kafka 自動調度器,您必須備妥下列資源。

  • Kafka 叢集
  • 已部署的消費者

Kafka 叢集

已部署的 Cloud Run 消費者

  • Kafka 消費者工作負載必須以服務或工作站集區的形式部署至 Cloud Run。必須設定為連線至 Kafka 叢集、主題和用戶群組。如需 Kafka 消費者的範例,請參閱 Cloud Run Kafka Autoscaler Example Consumer
  • 您的消費者工作負載必須與 Kafka 叢集位於相同專案。 Google Cloud

最佳做法

  • 使用直接虛擬私有雲,將 Kafka 消費者連線至虛擬私有雲網路。 直接虛擬私有雲可讓您使用私人 IP 位址連線至 Kafka 叢集,並將流量保留在虛擬私有雲網路中。
  • 為 Kafka 消費者設定有效性健康狀態檢查,檢查消費者是否正在提取事件。健康狀態檢查可確保健康狀態不良的執行個體會自動重新啟動 (即使容器未當機),避免停止處理事件。

建構 Kafka 自動配置器

您可以使用 Cloud Build,從 Kafka 自動調整程式的原始碼建構容器映像檔。

  1. 複製存放區:

    git clone https://github.com/GoogleCloudPlatform/cloud-run-kafka-scaler.git
    
  2. 前往存放區資料夾:

    cd cloud-run-kafka-scaler
    

如要指定輸出圖片名稱,請更新隨附 cloudbuild.yaml 檔案中的 %ARTIFACT_REGISTRY_IMAGE%,例如:us-central1-docker.pkg.dev/my-project/my-repo/my_kafka_autoscaler

gcloud builds submit --tag us-central1-docker.pkg.dev/my-project/my-repo/my_kafka_autoscaler

這個指令會建構容器映像檔,並將其推送至 Artifact Registry。請記下完整圖片路徑 (SCALER_IMAGE_PATH),因為後續步驟會用到。

請注意,產生的映像檔無法在本機上執行。這個映像檔會疊加在 Java 基礎映像檔上。如要進一步瞭解如何重新組裝容器映像以在本機執行,請參閱「設定自動更新基礎映像」。

定義 Kafka 自動調度資源設定

您可以使用密鑰設定 Kafka 自動調整器。自動調整程式會定期重新整理設定,因此您可以推送新的密碼版本來變更設定,不必重新部署自動調整程式。

設定 Kafka 用戶端屬性

部署 Kafka 自動調度器時,您可以將密碼掛接為磁碟區,藉此設定與 Kafka Admin API 的連線。

建立名為 kafka_client_config.txt 的檔案,並加入要新增的任何 Kafka Admin 用戶端設定屬性。bootstrap.servers 屬性為必填欄位:

bootstrap.servers=BOOTSTRAP_SERVER_LIST

BOOTSTRAP_SERVER_LIST 替換為 Kafka 叢集的 HOST:PORT 清單。

設定 Kafka 驗證

如果 Kafka 伺服器需要驗證,請在 kafka_client_config.txt 檔案中加入必要的設定屬性。舉例來說,如要使用 Google OAuth 搭配應用程式預設憑證連線至 Managed Service for Apache Kafka 叢集,這個密鑰應包含下列屬性:

bootstrap.servers=BOOTSTRAP_SERVER_LIST
security.protocol=SASL_SSL
sasl.mechanism=OAUTHBEARER
sasl.login.callback.handler.class=com.google.cloud.hosted.kafka.auth.GcpLoginCallbackHandler
sasl.jaas.config=org.apache.kafka.common.security.oauthbearer.OAuthBearerLoginModule required;

BOOTSTRAP_SERVER_LIST 替換為 Kafka 叢集的 HOST:PORT 清單。

使用應用程式預設憑證搭配 Managed Service for Apache Kafka 叢集時,也必須將 Managed Kafka Client (roles/managedkafka.client) 角色授予 Kafka 自動調整服務帳戶:

gcloud projects add-iam-policy-binding PROJECT_ID \
--member="serviceAccount:SCALER_SERVICE_ACCOUNT@PROJECT_ID.iam.gserviceaccount.com" \
--role="roles/managedkafka.client"

更改下列內容:

  • SCALER_SERVICE_ACCOUNT:Kafka 自動調整服務帳戶的名稱。
  • PROJECT_ID:Kafka 自動調整服務的專案 ID。

如要建立密鑰 (部署時會以磁碟區的形式掛接),請使用 kafka_client_config.txt 檔案:

gcloud secrets create ADMIN_CLIENT_SECRET_NAME --data-file=kafka_client_config.txt

ADMIN_CLIENT_SECRET_NAME 替換為 Kafka 驗證密鑰的名稱。

設定資源調度

Kafka 自動調度器會從 /scaler-config/scaling 磁碟區讀取調度設定。這個磁碟區的內容應以 YAML 格式表示。建議您為這項設定掛接密碼磁碟區。

建立名為 scaling_config.yaml 的檔案,並加入下列設定:

spec:
  scaleTargetRef:
    name: projects/PROJECT_ID/locations/REGION/workerpools/CONSUMER_SERVICE_NAME
 metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: TARGET_CPU_UTILIZATION
        activationThreshold: CPU_ACTIVATION_THRESHOLD
        tolerance: CPU_TOLERANCE
        windowSeconds: CPU_METRIC_WINDOW
  - type: External
    external:
      metric:
        name: consumer_lag
      target:
        type: AverageValue
        averageValue: LAG_THRESHOLD
        activationThreshold: LAG_ACTIVATION_THRESHOLD
        tolerance: LAG_TOLERANCE

更改下列內容:

  • PROJECT_ID:要自動調整的 Kafka 消費者工作負載專案 ID。
  • REGION:要自動調度資源的 Kafka 取用器工作負載區域。
  • CONSUMER_SERVICE_NAME:要自動調度資源的 Kafka 消費者工作負載名稱。
  • TARGET_CPU_UTILIZATION:自動調度計算的目標 CPU 使用率,例如:60
  • LAG_THRESHOLD:觸發自動調度資源的 consumer_lag 指標門檻,例如:1000
  • (選用) CPU_ACTIVATION_THRESHOLD:CPU 的啟動門檻。如果所有指標都處於非啟用狀態,目標消費者就會縮減至零。預設值為 0
  • (選用) CPU_TOLERANCE:如果縮放比例在指定範圍內,系統就不會變更縮放比例。以目標 CPU 使用率的百分比表示。預設值為 0.1
  • (選用) CPU_METRIC_WINDOW:計算平均 CPU 使用率的時間長度 (以秒為單位)。預設值為 120
  • (選用)consumer_lag 指標的啟用門檻。LAG_ACTIVATION_THRESHOLD如果所有指標都處於非啟用狀態,目標消費者就會縮減至零。預設值為 0
  • (選用) LAG_TOLERANCE:如果縮放比例在指定範圍內,系統就不會變更縮放比例。以目標消費者延遲時間的百分比表示。預設值為 0.1

您可以選擇使用 behavior: 區塊設定進階縮放屬性。這個區塊支援許多與 Kubernetes HPA 擴縮政策相同的屬性。

如果您未指定 behavior 區塊,系統會使用下列預設設定:

behavior:
  scaleDown:
    stabilizationWindowSeconds: 300
    policies:
    - type: Percent
      value: 50
      periodSeconds: 30
    selectPolicy: Min
  scaleUp:
    stabilizationWindowSeconds: 0
    policies:
    - type: Percent
      value: 100
      periodSeconds: 15
    - type: Instances
      value: 4
      periodSeconds: 15
    selectPolicy: Max

如要建立將掛接在 deployment 的密碼磁碟區,請將設定複製到名為 scaling_config.yaml 的檔案,然後執行下列指令:

gcloud secrets create SCALING_CONFIG_SECRET_NAME --data-file=scaling_config.yaml

SCALING_CONFIG_SECRET_NAME 替換為縮放密鑰的名稱。

部署 Kafka 自動調度器

完成事前準備後,您就能部署 Kafka 自動調度服務及其支援基礎架構。我們提供 Terraform 模組和殼層指令碼,簡化這個程序。

gcloud

本節將逐步說明手動部署自動配置器所需的每個 gcloud 指令。在大多數情況下,建議您改用 Shell 指令碼或 Terraform 模組。

建立服務帳戶

服務帳戶需求取決於您設定的自動調度資源檢查間隔。您可以設定 Kafka 自動調度器,以彈性間隔執行自動調度檢查:

  • 一分鐘以上:Cloud Scheduler 會在所選間隔觸發自動調度檢查,並發出 POST 要求。
  • 不到一分鐘:Cloud Scheduler 會根據設定的頻率,每分鐘觸發建立多項 Cloud Tasks。

一分鐘以上

Kafka 自動調度器服務帳戶

為 Kafka 自動配置器建立服務帳戶:

gcloud iam service-accounts create SCALER_SERVICE_ACCOUNT

SCALER_SERVICE_ACCOUNT 改為 Kafka 自動調整服務帳戶的名稱。

Kafka 自動調整工具需要下列權限,才能更新 Kafka 消費者執行個體的數量:

  • Kafka 消費端服務帳戶的 iam.serviceaccounts.actAs
  • roles/artifactregistry.reader,其中包含 Kafka 消費者映像檔。
  • run.workerpools.getrun.workerpools.updateCloud Run 管理員角色 (roles/run.admin) 包含這些權限。
  • roles/secretmanager.secretAccessor,以取得擴充和 Kafka 驗證密鑰。
  • roles/monitoring.viewer,必須具備此角色才能讀取 CPU 使用率指標。
  • roles/monitoring.metricWriter,這個角色為選用,但可讓自動調度器發出自訂指標,提升可觀測性。
gcloud iam service-accounts add-iam-policy-binding CONSUMER_SERVICE_ACCOUNT_EMAIL \
    --member="serviceAccount:SCALER_SERVICE_ACCOUNT@PROJECT_ID.iam.gserviceaccount.com" \
    --role="roles/iam.serviceAccountUser"

gcloud iam service-accounts add-iam-policy-binding CONSUMER_IMAGE_REPO \
    --member="serviceAccount:SCALER_SERVICE_ACCOUNT@PROJECT_ID.iam.gserviceaccount.com" \
    --role="roles/artifactregistry.reader" \
    --location=REPO_REGION

gcloud projects add-iam-policy-binding PROJECT_ID \
    --member="serviceAccount:SCALER_SERVICE_ACCOUNT@PROJECT_ID.iam.gserviceaccount.com" \
    --role="roles/run.admin"

gcloud secrets add-iam-policy-binding ADMIN_CLIENT_SECRET_NAME \
  --member="serviceAccount:SCALER_SERVICE_ACCOUNT@PROJECT_ID.iam.gserviceaccount.com" \
  --role="roles/secretmanager.secretAccessor"

gcloud secrets add-iam-policy-binding SCALING_CONFIG_SECRET_NAME \
  --member="serviceAccount:SCALER_SERVICE_ACCOUNT@PROJECT_ID.iam.gserviceaccount.com" \
  --role="roles/secretmanager.secretAccessor"

gcloud projects add-iam-policy-binding PROJECT_ID \
    --member="serviceAccount:SCALER_SERVICE_ACCOUNT@PROJECT_ID.iam.gserviceaccount.com" \
    --role="roles/monitoring.viewer" \
    --condition=None

gcloud projects add-iam-policy-binding PROJECT_ID \
    --member="serviceAccount:SCALER_SERVICE_ACCOUNT@PROJECT_ID.iam.gserviceaccount.com" \
    --role="roles/monitoring.metricWriter" \
    --condition=None

更改下列內容:

  • PROJECT_ID:Kafka 自動配置器服務所在的專案 ID。
  • CONSUMER_SERVICE_ACCOUNT_EMAIL:Kafka 消費者的服務帳戶電子郵件地址。例如:example@PROJECT-ID.iam.gserviceaccount.com
  • SCALER_SERVICE_ACCOUNT:Kafka 自動調整機制的服務帳戶。
  • ADMIN_CLIENT_SECRET_NAMEKafka 驗證密鑰的名稱。
  • SCALING_CONFIG_SECRET_NAME縮放密鑰的名稱。
  • CONSUMER_IMAGE_REPO:存放 Kafka 消費者容器映像檔的存放區 ID 或完整 ID。
  • REPO_REGION:消費者圖片存放區的位置。

不到一分鐘

設定 Cloud Tasks

Cloud Scheduler 只能以一分鐘以上的間隔觸發。如要設定小於一分鐘的間隔,請使用 Cloud Tasks 觸發 Kafka 自動調度程式。設定 Cloud Tasks 時,需要具備下列條件:

  • 建立 Cloud Tasks 佇列,用於自動調度資源檢查工作。
  • 建立服務帳戶,供 Cloud Tasks 用於叫用 Kafka 自動調整功能,並指派 Cloud Run Invoker 角色。
gcloud tasks queues create CLOUD_TASKS_QUEUE_NAME \
--location=REGION
gcloud iam service-accounts create TASKS_SERVICE_ACCOUNT
gcloud run services add-iam-policy-binding SCALER_SERVICE_NAME \
    --member="serviceAccount:TASKS_SERVICE_ACCOUNT@PROJECT_ID.iam.gserviceaccount.com" \
    --role="roles/run.invoker"

更改下列內容:

  • CLOUD_TASKS_QUEUE_NAME:用於觸發自動調度資源檢查的已設定 Cloud Tasks 佇列。
  • TASKS_SERVICE_ACCOUNT:Cloud Tasks 應使用的服務帳戶,用於觸發自動調整規模檢查。
  • SCALER_SERVICE_NAME:Kafka 自動調整服務的名稱。
  • PROJECT_ID:Kafka 自動調整服務的專案 ID。
  • REGION:Kafka 自動調整服務的位置。

設定 Kafka 自動調度器服務帳戶

為 Kafka 自動配置器建立服務帳戶:

gcloud iam service-accounts create SCALER_SERVICE_ACCOUNT

SCALER_SERVICE_ACCOUNT 改為 Kafka 自動調整服務帳戶的名稱。

如要更新 Kafka 消費者執行個體數量,並建立自動調度資源檢查作業,Kafka 自動調度器需要下列權限:

  • Kafka 消費端服務帳戶的 iam.serviceaccounts.actAs
  • roles/artifactregistry.reader,其中包含 Kafka 消費者映像檔
  • run.workerpools.getrun.workerpools.updateCloud Run 管理員角色 (roles/run.admin) 包含這些權限。
  • roles/secretmanager.secretAccessor,用於擴充和 Kafka 驗證的兩個密鑰。
  • roles/monitoring.viewer,必須具備此角色才能讀取 CPU 使用率指標。
  • roles/monitoring.metricWriter,這個角色為選用,但可讓自動調度器發出自訂指標,提升可觀測性。
  • Cloud Tasks 排入佇列者 角色 (roles/cloudtasks.enqueuer)。
gcloud iam service-accounts add-iam-policy-binding CONSUMER_SERVICE_ACCOUNT_EMAIL \
    --member="serviceAccount:SCALER_SERVICE_ACCOUNT@PROJECT_ID.iam.gserviceaccount.com" \
    --role="roles/iam.serviceAccountUser"

gcloud iam service-accounts add-iam-policy-binding CONSUMER_IMAGE_REPO \
    --member="serviceAccount:SCALER_SERVICE_ACCOUNT@PROJECT_ID.iam.gserviceaccount.com" \
    --role="roles/artifactregistry.reader" \
    --location=REPO_REGION

gcloud projects add-iam-policy-binding PROJECT_ID \
    --member="serviceAccount:SCALER_SERVICE_ACCOUNT@PROJECT_ID.iam.gserviceaccount.com" \
    --role="roles/run.admin"

gcloud secrets add-iam-policy-binding ADMIN_CLIENT_SECRET_NAME \
  --member="serviceAccount:SCALER_SERVICE_ACCOUNT@PROJECT_ID.iam.gserviceaccount.com" \
  --role="roles/secretmanager.secretAccessor"

gcloud secrets add-iam-policy-binding SCALING_CONFIG_SECRET_NAME \
  --member="serviceAccount:SCALER_SERVICE_ACCOUNT@PROJECT_ID.iam.gserviceaccount.com" \
  --role="roles/secretmanager.secretAccessor"

gcloud projects add-iam-policy-binding PROJECT_ID \
    --member="serviceAccount:SCALER_SERVICE_ACCOUNT@PROJECT_ID.iam.gserviceaccount.com" \
    --role="roles/monitoring.viewer" \
    --condition=None

gcloud projects add-iam-policy-binding PROJECT_ID \
    --member="serviceAccount:SCALER_SERVICE_ACCOUNT@PROJECT_ID.iam.gserviceaccount.com" \
    --role="roles/monitoring.metricWriter" \
    --condition=None

gcloud tasks queues add-iam-policy-binding CLOUD_TASKS_QUEUE_NAME \
    --member="serviceAccount:SCALER_SERVICE_ACCOUNT@PROJECT_ID.iam.gserviceaccount.com" \
    --role="roles/cloudtasks.enqueuer" \
    --location=REGION

更改下列內容:

  • PROJECT_ID:Kafka 自動配置器服務所在的專案 ID。
  • CONSUMER_SERVICE_ACCOUNT_EMAIL:Kafka 消費者的服務帳戶電子郵件地址。例如:example@PROJECT_ID.iam.gserviceaccount.com
  • SCALER_SERVICE_ACCOUNT:Kafka 自動調整機制的服務帳戶。
  • CONSUMER_IMAGE_REPO:存放 Kafka 消費者容器映像檔的存放區 ID 或完整 ID。
  • ADMIN_CLIENT_SECRET_NAMEKafka 驗證密鑰的名稱。
  • SCALING_CONFIG_SECRET_NAME縮放密鑰的名稱。
  • REPO_REGION:消費者圖片存放區的位置。
  • CLOUD_TASKS_QUEUE_NAME:用於觸發自動調度資源檢查的已設定 Cloud Tasks 佇列。
  • REGION:Kafka 自動調整服務的位置。

設定環境變數

一分鐘以上

Kafka 自動調度器會使用環境變數,指定 Kafka 消費者和目標工作負載的其他層面。為確保安全,建議您將機密資訊設定為密鑰

建立名為 scaler_env_vars.yaml 的 YAML 檔案,並加入下列變數:

KAFKA_TOPIC_ID: KAFKA_TOPIC_ID
CONSUMER_GROUP_ID: CONSUMER_GROUP_ID
CYCLE_SECONDS: CYCLE_SECONDS
OUTPUT_SCALER_METRICS: OUTPUT_SCALER_METRICS

更改下列內容:

  • KAFKA_TOPIC_ID:Kafka 消費者訂閱的主題 ID。
  • CONSUMER_GROUP_ID:目標 Kafka 消費者使用的消費者群組 ID。這些值必須相符,否則自動調度資源會失敗。
  • CYCLE_SECONDS:自動配置器週期,以秒為單位。
  • OUTPUT_SCALER_METRICS:啟用指標的設定。將值設為 true 可啟用自訂指標輸出,設為 false 則停用。

不到一分鐘

Kafka 自動調度器會使用環境變數,指定 Kafka 消費者和目標工作負載的其他層面。為確保安全,建議您將機密資訊設定為密鑰

建立名為 scaler_env_vars.yaml 的 YAML 檔案,並加入下列變數:

KAFKA_TOPIC_ID: KAFKA_TOPIC_ID
CONSUMER_GROUP_ID: CONSUMER_GROUP_ID
CYCLE_SECONDS: CYCLE_SECONDS
OUTPUT_SCALER_METRICS: OUTPUT_SCALER_METRICS
FULLY_QUALIFIED_CLOUD_TASKS_QUEUE_NAME: CLOUD_TASKS_QUEUE_NAME
INVOKER_SERVICE_ACCOUNT_EMAIL: TASKS_SERVICE_ACCOUNT_EMAIL

更改下列內容:

  • KAFKA_TOPIC_ID:Kafka 消費者訂閱的主題 ID。
  • CONSUMER_GROUP_ID:目標 Kafka 消費者使用的消費者群組 ID。這些值必須相符,否則自動調度資源會失敗。
  • CYCLE_SECONDS:自動配置器週期,以秒為單位。
  • OUTPUT_SCALER_METRICS:啟用指標的設定。將值設為 true 可啟用自訂指標輸出,否則請設為 false
  • CLOUD_TASKS_QUEUE_NAME:用於觸發自動調整規模檢查的 Cloud Tasks 佇列完整名稱。格式如下:projects/$PROJECT_ID/locations/$REGION/queues/$CLOUD_TASKS_QUEUE_NAME
  • TASKS_SERVICE_ACCOUNT_EMAIL:Cloud Tasks 應使用的服務帳戶,用於觸發自動調整規模檢查。例如:example@PROJECT_ID.iam.gserviceaccount.com

使用提供的映像檔部署 Kafka 自動調度器,並透過 scaler_env_vars.yaml 檔案和密碼磁碟區掛接,連線至 Kafka VPC:

gcloud run deploy SCALER_SERVICE_NAME \
    --image=SCALER_IMAGE_URI \
    --env-vars-file=scaler_env_vars.yaml \
    --service-account=SCALER_SERVICE_ACCOUNT@PROJECT_ID.iam.gserviceaccount.com \
    --no-allow-unauthenticated \
    --network=KAFKA_VPC_NETWORK \
    --subnet=KAFKA_VPC_SUBNET \
    --update-secrets=/kafka-config/kafka-client-properties=ADMIN_CLIENT_SECRET_NAME:latest \
    --update-secrets=/scaler-config/scaling=SCALING_CONFIG_SECRET_NAME:latest
    --labels=created-by=kafka-autoscaler

更改下列內容:

  • SCALER_IMAGE_URI:Kafka 自動資源調度器映像檔的 URI。
  • SCALER_SERVICE_NAME:Kafka 自動調整服務的名稱。
  • SCALER_SERVICE_ACCOUNT:Kafka 自動配置器服務帳戶的名稱。
  • PROJECT_ID:Kafka 自動調整服務的專案 ID。
  • KAFKA_VPC_NETWORK:已連線至 Kafka 叢集的虛擬私有雲網路。
  • KAFKA_VPC_SUBNET:與 Kafka 叢集連線的 VPC 子網路。
  • ADMIN_CLIENT_SECRET_NAMEKafka 驗證密鑰的名稱。
  • SCALING_CONFIG_SECRET_NAME縮放密鑰的名稱。

設定定期自動調度檢查

在本節中,您將使用 Cloud Scheduler 觸發週期性自動調度檢查:

  • 一分鐘以上:設定 Cloud Scheduler,按照所選間隔觸發
  • 不到一分鐘:設定 Cloud Scheduler 每分鐘觸發一次
建立呼叫端服務帳戶

如要讓 Cloud Scheduler 呼叫 Kafka 自動調整工具,您必須在 Kafka 自動調整工具服務中建立具有叫用者角色 (roles/run.invoker) 的服務帳戶:

gcloud iam service-accounts create SCALER_INVOKER_SERVICE_ACCOUNT
gcloud run services add-iam-policy-binding SCALER_SERVICE_NAME \
  --member="serviceAccount:SCALER_INVOKER_SERVICE_ACCOUNT@PROJECT_ID.iam.gserviceaccount.com" \
  --role="roles/run.invoker"

更改下列內容:

  • SCALER_SERVICE_NAME:Kafka 自動調整服務的名稱。
  • SCALER_INVOKER_SERVICE_ACCOUNT:呼叫端服務帳戶的名稱。
  • PROJECT_ID:Kafka 自動調整服務的專案 ID。
建立 Cloud Scheduler 工作

一分鐘以上

使用選取的自動調度資源檢查間隔建立 Cloud Scheduler 工作:

gcloud scheduler jobs create http kafka-scaling-check \
    --location=REGION \
    --schedule="CRON_SCHEDULE" \
    --time-zone="TIMEZONE" \
    --uri=https://SCALER_SERVICE_NAME-PROJECT_NUMBER.REGION.run.app \
    --oidc-service-account-email=SCALER_INVOKER_SERVICE_ACCOUNT@PROJECT_ID.iam.gserviceaccount.com \
    --http-method=POST

更改下列內容:

  • SCALER_SERVICE_NAME:Kafka 自動調整服務的名稱。
  • SCALER_INVOKER_SERVICE_ACCOUNT:呼叫端服務帳戶的名稱。
  • PROJECT_ID:專案 ID 或 Kafka 自動調整服務。
  • PROJECT_NUMBER:Kafka 自動調整服務的專案編號。
  • REGION:Kafka 自動調整服務的位置。
  • TIMEZONE:時區,例如:America/Los_Angeles
  • CRON_SCHEDULE:以 Crontab 格式選取的排程。例如,每分鐘:"* * * * *"

不到一分鐘

建立每分鐘執行的 Cloud Scheduler 工作:

gcloud scheduler jobs create http kafka-scaling-check \
    --location=REGION \
    --schedule="* * * * *" \
    --time-zone="TIMEZONE" \
    --uri=https://SCALER_SERVICE_NAME-PROJECT_NUMBER.REGION.run.app \
    --oidc-service-account-email=SCALER_INVOKER_SERVICE_ACCOUNT@PROJECT_ID.iam.gserviceaccount.com \
    --http-method=POST

更改下列內容:

  • SCALER_SERVICE_NAME:Kafka 自動調整服務的名稱。
  • SCALER_INVOKER_SERVICE_ACCOUNT:呼叫端服務帳戶的名稱。
  • PROJECT_ID:Kafka 自動調整服務的專案 ID。
  • PROJECT_NUMBER:Kafka 自動調整服務的專案編號。
  • REGION:Kafka 自動調整服務的位置。
  • TIMEZONE:時區,例如:America/Los_Angeles

Terraform

terraform/ 目錄包含可重複使用的 Terraform 模組,可用於佈建 Kafka 自動配置器和相關聯的資源。

這個模組會自動建立下列項目:

  • Kafka 自動調度器 Cloud Run 服務
  • 支援服務帳戶和 IAM 繫結
  • Cloud Tasks 佇列
  • Cloud Scheduler 工作

如需詳細的操作說明、使用範例,以及所有輸入/輸出變數的說明,請參閱 terraform readme

您需要為 Terraform 模組提供必要變數,包括先決條件中的詳細資料,例如專案 ID、區域、消費者 SA 電子郵件地址、密碼名稱、縮放器映像檔路徑和主題 ID。

殼層

自動調度器會提供 setup_kafka_scaler.sh 指令碼,自動建立及設定所有必要資源。

設定環境變數

執行指令碼前,請務必設定所有必要的環境變數:

# Details for already-deployed Kafka consumer
export PROJECT_ID=PROJECT_ID
export REGION=REGION
export CONSUMER_SERVICE_NAME=DEPLOYED_KAFKA_CONSUMER
export CONSUMER_SA_EMAIL=KAFKA_CONSUMER_ACCOUNT_EMAIL # For example, NAME@PROJECT_ID.iam.gserviceaccount.com
export TOPIC_ID=KAFKA_TOPIC_ID
export CONSUMER_GROUP_ID=KAFKA_CONSUMER_GROUP_ID
export NETWORK=VPC_NETWORK
export SUBNET=VPC_SUBNET

# Details for new items to be created during this setup
export CLOUD_TASKS_QUEUE_NAME=CLOUD_TASKS_QUEUE_FOR_SCALING_CHECKS
export TASKS_SERVICE_ACCOUNT=TASKS_SERVICE_ACCOUNT_NAME

export SCALER_SERVICE_NAME=KAFKA_AUTOSCALER_SERVICE_NAME
export SCALER_IMAGE_PATH=KAFKA_AUTOSCALER_IMAGE_URI
export SCALER_CONFIG_SECRET=KAFKA_AUTOSCALER_CONFIG_SECRET_NAME

export CYCLE_SECONDS=SCALER_CHECK_FREQUENCY # For example, 15; this value should be at least 5 seconds.

export OUTPUT_SCALER_METRICS=false # If you want scaling metrics to outputted to Cloud Monitoring set this to true and ensure your scaler service account has permission to write metrics (for example, via roles/monitoring.metricWriter).

更改下列內容:

  • PROJECT_ID:Kafka 自動配置器服務所在的專案 ID。
  • REGION:Kafka 自動調整服務的位置。
  • DEPLOYED_KAFKA_CONSUMER:Kafka 取用器名稱。
  • KAFKA_CONSUMER_ACCOUNT_EMAIL:Kafka 消費者的服務帳戶電子郵件地址。
  • KAFKA_TOPIC_ID:Kafka 消費者訂閱的主題 ID。
  • KAFKA_CONSUMER_GROUP_ID:目標 Kafka 消費者使用的消費者群組 ID。這些值必須相符,否則自動調度資源會失敗。
  • VPC_NETWORK:連線至 Kafka 叢集的虛擬私有雲網路。
  • VPC_SUBNET:與 Kafka 叢集連線的 VPC 子網路。
  • CLOUD_TASKS_QUEUE_FOR_SCALING_CHECKS:用於觸發自動調度資源檢查的已設定 Cloud Tasks 佇列。
  • TASKS_SERVICE_ACCOUNT_NAME:Cloud Tasks 應使用的服務帳戶,用於觸發自動調整規模檢查。
  • KAFKA_AUTOSCALER_SERVICE_NAME:Kafka 自動調整服務的名稱。
  • KAFKA_AUTOSCALER_IMAGE_URI:Kafka 自動資源調度器映像檔的 URI。
  • KAFKA_AUTOSCALER_CONFIG_SECRET_NAME縮放密鑰的名稱。
  • SCALER_CHECK_FREQUENCY:自動配置器週期,以秒為單位。

執行設定指令碼

執行提供的 setup_kafka_scaler.sh 指令碼:

./setup_kafka_scaler.sh

指令碼會執行下列動作:

  • 建立用於觸發自動調度檢查的 Cloud Tasks 佇列。
  • 建立 Kafka 自動配置器服務帳戶,並授予必要權限。
  • 設定及部署 Kafka 自動調度器。
  • 建立 Cloud Scheduler 工作,定期觸發自動調度資源檢查。

setup_kafka_scaler.sh 指令碼執行時,會輸出設定的環境變數。請先確認環境變數正確無誤,再繼續操作。

授予其他權限

如要變更 Kafka 消費者的執行個體計數,Kafka 自動調整服務帳戶必須擁有已部署容器映像檔的檢視權限。舉例來說,如果消費者映像檔是從 Artifact Registry 部署,請執行下列指令:

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:$SCALER_SA_NAME@$PROJECT_ID.iam.gserviceaccount.com" \
  --role="roles/artifactregistry.reader" # Or appropriate role for your registry

確認 Kafka 自動調度資源功能是否正常運作

只要向服務網址 (SCALER_SERVICE_NAME-PROJECT_NUMBER.REGION.run.app) 發出要求,就會觸發 Kafka 自動調度器服務的調度作業。

您可以將 POST 要求傳送至 Kafka 自動調度服務,觸發自動調度計算:

curl -X POST -H "Authorization: Bearer $(gcloud auth print-identity-token)" https://SCALER_SERVICE_NAME-PROJECT_NUMBER.REGION.run.app

更改下列內容:

  • SCALER_SERVICE_NAME:Kafka 自動調整服務的名稱。
  • PROJECT_NUMBER:Kafka 自動調整服務的專案編號。
  • REGION:Kafka 自動調整服務的位置。

POST 要求會觸發自動調度資源計算,並輸出至記錄檔,然後根據建議變更執行個體數量。

Kafka 自動調度服務的記錄應包含 [SCALING] Recommended instances X 等訊息。

如果啟用 OUTPUT_SCALER_METRICS 標記,您也可以在 custom.googleapis.com/cloud-run-kafkascaler 下找到調整器 Cloud Monitoring 指標。

進階資源調度設定

spec:
  metrics:
  behavior:
    scaleDown:
      stabilizationWindowSeconds: [INT]
      policies:
      - type: [Percent, Instances]
        value: [INT]
        periodSeconds: [INT]
      selectPolicy: [Min, Max]
    scaleUp:
      stabilizationWindowSeconds: [INT]
      policies:
      - type: [Percent, Instances]
        value: [INT]
        periodSeconds: [INT]
      selectPolicy: [Min, Max]

以下清單說明部分先前的元素:

  • scaleDown:減少執行個體數量 (縮減) 時的行為。
  • scaleUp:增加執行個體數量 (向上擴展) 時的行為。
  • stabilizationWindowSeconds:最高 (scaleDown) 或最低 (scaleUp)。 在滾動期間內計算的執行個體數量。將值設為 0,表示使用最近一次計算的值。
  • selectPolicy:設定多項政策時要強制執行的結果。
  • Min:最小變化
  • Max:最大變化
  • Percent:每個週期的變更次數,不得超過設定的執行個體總數百分比。
  • Instances:每個週期的變更次數上限為設定的執行個體數量。
  • periodSeconds:政策的強制執行時間長度。

舉例來說,使用預設設定的完整規格如下:

spec:
  scaleTargetRef:
    name: projects/PROJECT-ID/locations/us-central1/workerpools/kafka-consumer-worker
  metrics:
    - type: Resource
      resource:
        name: cpu
        target:
          type: Utilization
          averageUtilization: 60
          activationThreshold: 0
          tolerance: 0.1
          windowSeconds: 120
    - type: External
      external:
        metric:
          name: consumer_lag
        target:
          type: AverageValue
          averageValue: 1000
          activationThreshold: 0
          tolerance: 0.1
  behavior:
    scaleDown:
      stabilizationWindowSeconds: 300
      policies:
        - type: Percent
          value: 50
          periodSeconds: 30
      selectPolicy: Min
    scaleUp:
      stabilizationWindowSeconds: 0
      policies:
        - type: Percent
          value: 100
          periodSeconds: 15
        - type: Instances
          value: 4
          periodSeconds: 15
      selectPolicy: Max