Menskalakan otomatis workload konsumen Kafka

Tutorial ini menunjukkan cara mengonfigurasi dan men-deploy penskala otomatis Kafka sebagai layanan Cloud Run. Autoscaler ini melakukan logika penskalaan untuk beban kerja konsumen Kafka, seperti deployment kumpulan pekerja Cloud Run. Penskala otomatis Kafka membaca metrik dari cluster Kafka Anda, dan menggunakan penskalaan manual untuk pool worker atau layanan Cloud Run untuk menskalakan beban kerja konsumen Kafka berdasarkan metrik jeda konsumen Kafka.

Diagram berikut menunjukkan cara layanan penskalaan otomatis Kafka membaca metrik dari cluster Kafka untuk menskalakan otomatis kumpulan worker konsumen Kafka.

Layanan penskalaan otomatis Kafka menarik metrik dari Kafka, dan melakukan penskalaan otomatis pada konsumen Kafka

Peran yang diperlukan

Untuk mendapatkan izin yang Anda perlukan untuk men-deploy dan menjalankan layanan ini, minta administrator Anda untuk memberi Anda peran IAM berikut:

Sebelum memulai

Untuk mengonfigurasi dan menggunakan penskala otomatis Kafka, Anda memerlukan resource berikut.

  • Cluster Kafka
  • Konsumen yang di-deploy

Cluster Kafka

Konsumen Cloud Run yang di-deploy

  • Workload konsumen Kafka harus di-deploy ke Cloud Run sebagai layanan atau kumpulan pekerja. Harus dikonfigurasi untuk terhubung ke cluster, topik, dan grup konsumen Kafka Anda. Untuk contoh konsumen Kafka, lihat Cloud Run Kafka Autoscaler Example Consumer.
  • Beban kerja konsumen Anda harus berada di Google Cloud project yang sama dengan cluster Kafka Anda.

Praktik terbaik

  • Hubungkan konsumen Kafka Anda ke jaringan VPC menggunakan VPC Langsung. VPC Langsung memungkinkan Anda terhubung ke cluster Kafka menggunakan alamat IP pribadi, dan juga memungkinkan Anda mempertahankan traffic di jaringan VPC.
  • Konfigurasi pemeriksaan keaktifan untuk konsumen Kafka Anda yang memeriksa apakah konsumen menarik peristiwa atau tidak. Health check membantu memastikan bahwa instance yang tidak responsif akan otomatis dimulai ulang jika berhenti memproses peristiwa, meskipun jika penampung tidak mengalami error.

Membangun penskala otomatis Kafka

Anda dapat menggunakan Cloud Build untuk membangun image container penskala otomatis Kafka dari kode sumbernya.

  1. Meng-cloning repository

    git clone https://github.com/GoogleCloudPlatform/cloud-run-kafka-scaler.git
    
  2. Buka folder repositori:

    cd cloud-run-kafka-scaler
    

Untuk menentukan nama gambar output, perbarui %ARTIFACT_REGISTRY_IMAGE% dalam file cloudbuild.yaml yang disertakan, misalnya: 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

Perintah ini akan membangun image container dan mengirimkannya ke Artifact Registry. Catat jalur gambar lengkap (SCALER_IMAGE_PATH) karena Anda akan memerlukannya nanti.

Perhatikan bahwa gambar yang dihasilkan tidak akan berjalan secara lokal. Image ini dimaksudkan untuk ditumpuk di atas image dasar Java. Untuk mengetahui informasi selengkapnya, termasuk cara menyusun ulang image container untuk dijalankan secara lokal, lihat Mengonfigurasi pembaruan image dasar otomatis.

Tentukan konfigurasi penskalaan otomatis Kafka

Anda dapat mengonfigurasi penskalaan otomatis Kafka menggunakan secret. Autoscaler memuat ulang konfigurasinya secara berkala, yang berarti Anda dapat mengirimkan versi secret baru untuk mengubah konfigurasi tanpa perlu men-deploy ulang autoscaler.

Mengonfigurasi properti klien Kafka

Anda dapat mengonfigurasi koneksi ke Kafka Admin API dengan memasang secret sebagai volume saat men-deploy penskala otomatis Kafka.

Buat file bernama kafka_client_config.txt dan sertakan properti konfigurasi klien Admin Kafka yang ingin Anda tambahkan. Properti bootstrap.servers wajib diisi:

bootstrap.servers=BOOTSTRAP_SERVER_LIST

Ganti BOOTSTRAP_SERVER_LIST dengan daftar HOST:PORT untuk cluster Kafka.

Mengonfigurasi autentikasi Kafka

Jika server Kafka Anda memerlukan autentikasi, sertakan properti konfigurasi yang diperlukan dalam file kafka_client_config.txt. Misalnya, untuk terhubung ke cluster Managed Service for Apache Kafka dengan menggunakan kredensial default aplikasi dengan Google OAuth, rahasia ini harus menyertakan properti berikut:

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;

Ganti BOOTSTRAP_SERVER_LIST dengan daftar HOST:PORT untuk cluster Kafka.

Penggunaan kredensial default aplikasi dengan cluster Managed Service for Apache Kafka juga memerlukan pemberian peran Managed Kafka Client (roles/managedkafka.client) kepada akun layanan penskalaan otomatis Kafka:

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

Ganti kode berikut:

  • SCALER_SERVICE_ACCOUNT: nama akun layanan Kafka autoscaler.
  • PROJECT_ID: ID project untuk layanan autoscaler Kafka.

Untuk membuat secret, yang akan dipasang sebagai volume saat deployment, gunakan file kafka_client_config.txt:

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

Ganti ADMIN_CLIENT_SECRET_NAME dengan nama secret autentikasi Kafka.

Mengonfigurasi penskalaan

Penskala otomatis Kafka membaca konfigurasi penskalaannya dari volume /scaler-config/scaling. Isi volume ini harus diformat sebagai YAML. Sebaiknya pasang volume rahasia untuk konfigurasi ini.

Buat file bernama scaling_config.yaml dengan konfigurasi berikut:

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

Ganti kode berikut:

  • PROJECT_ID: project ID workload konsumen Kafka yang akan di-autoscaling.
  • REGION: region workload konsumen Kafka yang akan di-autoscaling.
  • CONSUMER_SERVICE_NAME: nama workload konsumen Kafka yang akan diskalakan otomatis.
  • TARGET_CPU_UTILIZATION: target penggunaan CPU untuk perhitungan penskalaan otomatis, misalnya: 60.
  • LAG_THRESHOLD: nilai minimum untuk metrik consumer_lag guna memicu penskalaan otomatis, misalnya: 1000.
  • (Opsional) CPU_ACTIVATION_THRESHOLD: nilai minimum aktivasi untuk CPU. Jika semua metrik tidak aktif, konsumen target akan diskalakan menjadi nol. Setelan defaultnya adalah 0.
  • (Opsional) CPU_TOLERANCE: nilai minimum yang mencegah perubahan penskalaan jika berada dalam rentang yang ditentukan. Dinyatakan sebagai persentase dari target pemakaian CPU. Setelan defaultnya adalah 0.1.
  • (Opsional) CPU_METRIC_WINDOW: jangka waktu, dalam detik, yang digunakan untuk menghitung pemakaian CPU rata-rata. Setelan defaultnya adalah 120.
  • (Opsional) LAG_ACTIVATION_THRESHOLD: nilai minimum aktivasi untuk metrik consumer_lag. Jika semua metrik tidak aktif, konsumen target akan diskalakan menjadi nol. Setelan defaultnya adalah 0.
  • (Opsional) LAG_TOLERANCE: nilai minimum yang mencegah perubahan penskalaan jika berada dalam rentang yang ditentukan. Dinyatakan sebagai persentase jeda konsumen target. Setelan defaultnya adalah 0.1.

Secara opsional, Anda dapat mengonfigurasi properti penskalaan lanjutan menggunakan blok behavior:. Blok ini mendukung banyak properti yang sama dengan kebijakan penskalaan HPA Kubernetes.

Jika Anda tidak menentukan blok behavior, konfigurasi default berikut akan digunakan:

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

Untuk membuat volume secret, yang akan dipasang di deployment, salin konfigurasi ke dalam file bernama scaling_config.yaml, lalu jalankan perintah berikut:

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

Ganti SCALING_CONFIG_SECRET_NAME dengan nama scaling secret.

Men-deploy penskala otomatis Kafka

Setelah menyelesaikan prasyarat, Anda dapat men-deploy layanan penskalaan otomatis Kafka dan infrastruktur pendukungnya. Modul Terraform dan skrip shell disediakan untuk menyederhanakan proses ini.

gcloud

Bagian ini menjelaskan setiap perintah gcloud yang diperlukan untuk men-deploy penskala otomatis secara manual. Untuk sebagian besar kasus, sebaiknya gunakan skrip shell atau modul Terraform.

Membuat akun layanan

Persyaratan akun layanan bergantung pada interval pemeriksaan penskalaan otomatis yang Anda konfigurasi. Anda dapat mengonfigurasi penskala otomatis Kafka untuk melakukan pemeriksaan penskalaan otomatis pada interval yang fleksibel:

  • Satu menit atau lebih: Cloud Scheduler memicu pemeriksaan penskalaan otomatis dengan permintaan POST pada interval yang dipilih.
  • Kurang dari satu menit: Cloud Scheduler memicu pembuatan beberapa Cloud Tasks setiap menit, berdasarkan frekuensi yang dikonfigurasi.

Satu menit atau lebih

Akun layanan penskala otomatis Kafka

Buat akun layanan untuk penskala otomatis Kafka:

gcloud iam service-accounts create SCALER_SERVICE_ACCOUNT

Ganti SCALER_SERVICE_ACCOUNT dengan nama akun layanan penskala otomatis Kafka.

Autoscaler Kafka memerlukan izin berikut untuk memperbarui jumlah instance konsumen Kafka:

  • iam.serviceaccounts.actAs untuk akun layanan konsumen Kafka.
  • roles/artifactregistry.reader untuk repositori yang berisi image konsumen Kafka.
  • run.workerpools.get dan run.workerpools.update. Izin ini disertakan dalam peran Admin Cloud Run (roles/run.admin).
  • roles/secretmanager.secretAccessor untuk secret autentikasi Kafka dan penskalaan.
  • roles/monitoring.viewer untuk project konsumen Kafka. Peran ini diperlukan untuk membaca metrik pemanfaatan CPU.
  • roles/monitoring.metricWriter untuk project konsumen Kafka. Peran ini bersifat opsional, tetapi memungkinkan autoscaler memancarkan metrik kustom untuk kemampuan observasi yang lebih baik.
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

Ganti kode berikut:

  • PROJECT_ID: project ID tempat layanan penskala otomatis Kafka berada.
  • CONSUMER_SERVICE_ACCOUNT_EMAIL: email akun layanan untuk konsumen Kafka. Contohnya, example@PROJECT-ID.iam.gserviceaccount.com.
  • SCALER_SERVICE_ACCOUNT: akun layanan untuk autoscaler Kafka.
  • ADMIN_CLIENT_SECRET_NAME: nama secret autentikasi Kafka.
  • SCALING_CONFIG_SECRET_NAME: nama secret penskalaan.
  • CONSUMER_IMAGE_REPO: ID atau ID yang memenuhi syarat sepenuhnya untuk repositori dengan image container untuk konsumen Kafka.
  • REPO_REGION: lokasi repositori image konsumen.

Kurang dari satu menit

Menyiapkan Cloud Tasks

Cloud Scheduler hanya dapat memicu pada interval satu menit atau lebih. Untuk interval yang kurang dari satu menit, gunakan Cloud Tasks untuk memicu penskala otomatis Kafka. Penyiapan Cloud Tasks memerlukan hal berikut:

  • Membuat antrean Cloud Tasks untuk tugas pemeriksaan penskalaan otomatis.
  • Membuat akun layanan yang digunakan Cloud Tasks untuk memanggil penskala otomatis Kafka dengan peran 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"

Ganti kode berikut:

  • CLOUD_TASKS_QUEUE_NAME: antrean Cloud Tasks yang dikonfigurasi untuk memicu pemeriksaan penskalaan otomatis.
  • TASKS_SERVICE_ACCOUNT: akun layanan yang harus digunakan Cloud Tasks untuk memicu pemeriksaan penskalaan otomatis.
  • SCALER_SERVICE_NAME: nama layanan penskala otomatis Kafka Anda.
  • PROJECT_ID: ID project untuk layanan autoscaler Kafka.
  • REGION: lokasi layanan autoscaler Kafka.

Menyiapkan akun layanan penskala otomatis Kafka

Buat akun layanan untuk penskala otomatis Kafka:

gcloud iam service-accounts create SCALER_SERVICE_ACCOUNT

Ganti SCALER_SERVICE_ACCOUNT dengan nama akun layanan penskala otomatis Kafka.

Untuk memperbarui jumlah instance konsumen Kafka, dan membuat tugas untuk pemeriksaan penskalaan otomatis, penskalaan otomatis Kafka memerlukan izin berikut:

  • iam.serviceaccounts.actAs untuk akun layanan konsumen Kafka.
  • roles/artifactregistry.reader untuk repositori yang berisi image konsumen Kafka
  • run.workerpools.get dan run.workerpools.update. Izin ini disertakan dalam peran Admin Cloud Run (roles/run.admin).
  • roles/secretmanager.secretAccessor untuk kedua secret tersebut untuk penskalaan dan autentikasi Kafka.
  • roles/monitoring.viewer untuk project konsumen Kafka. Peran ini diperlukan untuk membaca metrik pemanfaatan CPU.
  • roles/monitoring.metricWriter untuk project konsumen Kafka. Peran ini bersifat opsional, tetapi memungkinkan autoscaler memancarkan metrik kustom untuk kemampuan observasi yang lebih baik.
  • Peran Cloud Tasks Enqueuer (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

Ganti kode berikut:

  • PROJECT_ID: project ID tempat layanan penskala otomatis Kafka berada.
  • CONSUMER_SERVICE_ACCOUNT_EMAIL: email akun layanan untuk konsumen Kafka. Contohnya, example@PROJECT_ID.iam.gserviceaccount.com.
  • SCALER_SERVICE_ACCOUNT: akun layanan untuk autoscaler Kafka.
  • CONSUMER_IMAGE_REPO: ID atau ID yang sepenuhnya memenuhi syarat untuk repositori dengan image container untuk konsumen Kafka.
  • ADMIN_CLIENT_SECRET_NAME: nama secret autentikasi Kafka.
  • SCALING_CONFIG_SECRET_NAME: nama secret penskalaan.
  • REPO_REGION: lokasi repositori image konsumen.
  • CLOUD_TASKS_QUEUE_NAME: antrean Cloud Tasks yang dikonfigurasi untuk memicu pemeriksaan penskalaan otomatis.
  • REGION: lokasi layanan autoscaler Kafka.

Mengonfigurasi variabel lingkungan

Satu menit atau lebih

Autoscaler Kafka menggunakan variabel lingkungan untuk menentukan konsumen Kafka dan aspek lain dari beban kerja target. Untuk keamanan, sebaiknya konfigurasikan informasi sensitif sebagai secret.

Buat file YAML bernama scaler_env_vars.yaml dengan variabel berikut:

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

Ganti kode berikut:

  • KAFKA_TOPIC_ID: ID topik yang menjadi langganan konsumen Kafka.
  • CONSUMER_GROUP_ID: ID grup konsumen yang digunakan oleh konsumen Kafka target. Nilai ini harus cocok, atau penskalaan otomatis akan gagal.
  • CYCLE_SECONDS: periode siklus penskalaan otomatis, dalam detik.
  • OUTPUT_SCALER_METRICS: setelan untuk mengaktifkan metrik. Tetapkan nilai ke true untuk mengaktifkan output metrik kustom, atau ke false jika tidak.

Kurang dari satu menit

Autoscaler Kafka menggunakan variabel lingkungan untuk menentukan konsumen Kafka dan aspek lain dari beban kerja target. Untuk keamanan, sebaiknya konfigurasikan informasi sensitif sebagai secret.

Buat file YAML bernama scaler_env_vars.yaml dengan variabel berikut:

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

Ganti kode berikut:

  • KAFKA_TOPIC_ID: ID topik yang menjadi langganan konsumen Kafka.
  • CONSUMER_GROUP_ID: ID grup konsumen yang digunakan oleh konsumen Kafka target. Nilai ini harus cocok, atau penskalaan otomatis akan gagal.
  • CYCLE_SECONDS: periode siklus penskalaan otomatis, dalam detik.
  • OUTPUT_SCALER_METRICS: setelan untuk mengaktifkan metrik. Tetapkan nilai ke true untuk mengaktifkan output metrik kustom, atau false jika tidak.
  • CLOUD_TASKS_QUEUE_NAME: nama lengkap antrean Cloud Tasks untuk memicu pemeriksaan penskalaan otomatis. Formatnya adalah sebagai berikut: projects/$PROJECT_ID/locations/$REGION/queues/$CLOUD_TASKS_QUEUE_NAME.
  • TASKS_SERVICE_ACCOUNT_EMAIL: akun layanan yang harus digunakan Cloud Tasks untuk memicu pemeriksaan penskalaan otomatis. Contohnya, example@PROJECT_ID.iam.gserviceaccount.com.

Deploy penskala otomatis Kafka menggunakan image yang disediakan, dan hubungkan ke VPC Kafka dengan pemasangan volume rahasia dan file scaler_env_vars.yaml:

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

Ganti kode berikut:

  • SCALER_IMAGE_URI: URI untuk image autoscaler Kafka.
  • SCALER_SERVICE_NAME: nama layanan penskala otomatis Kafka Anda.
  • SCALER_SERVICE_ACCOUNT: nama akun layanan Kafka Autoscaler.
  • PROJECT_ID: ID project untuk layanan autoscaler Kafka.
  • KAFKA_VPC_NETWORK: jaringan VPC yang terhubung ke cluster Kafka.
  • KAFKA_VPC_SUBNET: subnet VPC yang terhubung ke cluster Kafka.
  • ADMIN_CLIENT_SECRET_NAME: nama secret autentikasi Kafka.
  • SCALING_CONFIG_SECRET_NAME: nama secret penskalaan.

Menyiapkan pemeriksaan penskalaan otomatis berkala

Di bagian ini, Anda akan menggunakan Cloud Scheduler untuk memicu pemeriksaan penskalaan otomatis berkala:

  • Satu menit atau lebih: Konfigurasi Cloud Scheduler untuk memicu pada interval yang dipilih
  • Kurang dari satu menit: Mengonfigurasi Cloud Scheduler untuk memicu setiap menit
Buat akun layanan pemanggil

Untuk mengizinkan Cloud Scheduler memanggil penskala otomatis Kafka, Anda harus membuat akun layanan dengan peran Pemanggil (roles/run.invoker) di layanan penskala otomatis Kafka:

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"

Ganti kode berikut:

  • SCALER_SERVICE_NAME: nama layanan penskala otomatis Kafka Anda.
  • SCALER_INVOKER_SERVICE_ACCOUNT: nama akun layanan pemanggil.
  • PROJECT_ID: ID project untuk layanan autoscaler Kafka.
Buat tugas Cloud Scheduler

Satu menit atau lebih

Buat tugas Cloud Scheduler dengan interval pemeriksaan penskalaan otomatis yang dipilih:

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

Ganti kode berikut:

  • SCALER_SERVICE_NAME: nama layanan penskala otomatis Kafka Anda.
  • SCALER_INVOKER_SERVICE_ACCOUNT: nama akun layanan pemanggil.
  • PROJECT_ID: ID project atau layanan autoscaler Kafka.
  • PROJECT_NUMBER: nomor project untuk layanan autoscaler Kafka.
  • REGION: lokasi layanan autoscaler Kafka.
  • TIMEZONE: zona waktu, misalnya: America/Los_Angeles.
  • CRON_SCHEDULE: jadwal yang dipilih dalam format Crontab. Misalnya, untuk setiap menit: "* * * * *".

Kurang dari satu menit

Buat tugas Cloud Scheduler yang dijalankan setiap menit:

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

Ganti kode berikut:

  • SCALER_SERVICE_NAME: nama layanan penskala otomatis Kafka Anda.
  • SCALER_INVOKER_SERVICE_ACCOUNT: nama akun layanan pemanggil.
  • PROJECT_ID: project ID layanan autoscaler Kafka.
  • PROJECT_NUMBER: nomor project untuk layanan autoscaler Kafka.
  • REGION: lokasi layanan autoscaler Kafka.
  • TIMEZONE: zona waktu, misalnya: America/Los_Angeles.

terraform

Direktori terraform/ berisi modul Terraform yang dapat digunakan kembali untuk menyediakan penskala otomatis Kafka dan resource terkaitnya.

Modul ini mengotomatiskan pembuatan:

  • Layanan Cloud Run penskala otomatis Kafka
  • Mendukung akun layanan dan binding IAM
  • Antrean Cloud Tasks
  • Tugas Cloud Scheduler

Untuk mengetahui petunjuk mendetail, contoh penggunaan, dan deskripsi semua variabel input/output, lihat terraform readme.

Anda perlu memberikan variabel yang diperlukan ke modul Terraform, termasuk detail dari prasyarat, seperti ID project, region, email SA konsumen, nama rahasia, jalur image penskala, dan ID topik.

shell

Skrip setup_kafka_scaler.sh disediakan dengan penskala otomatis untuk membuat dan mengonfigurasi semua resource yang diperlukan secara otomatis.

Menetapkan variabel lingkungan

Sebelum menjalankan skrip, pastikan Anda telah menetapkan semua variabel lingkungan yang diperlukan:

# 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).

Ganti kode berikut:

  • PROJECT_ID: project ID tempat layanan penskala otomatis Kafka berada.
  • REGION: lokasi layanan autoscaler Kafka.
  • DEPLOYED_KAFKA_CONSUMER: nama konsumen Kafka.
  • KAFKA_CONSUMER_ACCOUNT_EMAIL: email akun layanan untuk konsumen Kafka.
  • KAFKA_TOPIC_ID: ID topik yang menjadi langganan konsumen Kafka.
  • KAFKA_CONSUMER_GROUP_ID: ID grup konsumen yang digunakan oleh konsumen Kafka target. Nilai ini harus cocok, atau penskalaan otomatis akan gagal.
  • VPC_NETWORK: jaringan VPC yang terhubung ke cluster Kafka.
  • VPC_SUBNET: subnet VPC yang terhubung ke cluster Kafka.
  • CLOUD_TASKS_QUEUE_FOR_SCALING_CHECKS: antrean Cloud Tasks yang dikonfigurasi untuk memicu pemeriksaan penskalaan otomatis.
  • TASKS_SERVICE_ACCOUNT_NAME: akun layanan yang harus digunakan Cloud Tasks untuk memicu pemeriksaan penskalaan otomatis.
  • KAFKA_AUTOSCALER_SERVICE_NAME: nama layanan penskala otomatis Kafka Anda.
  • KAFKA_AUTOSCALER_IMAGE_URI: URI untuk image autoscaler Kafka.
  • KAFKA_AUTOSCALER_CONFIG_SECRET_NAME: nama secret penskalaan.
  • SCALER_CHECK_FREQUENCY: periode siklus penskalaan otomatis, dalam detik.

Jalankan skrip penyiapan

Jalankan skrip setup_kafka_scaler.sh yang disediakan:

./setup_kafka_scaler.sh

Skrip akan melakukan tindakan berikut:

  • Membuat antrean Cloud Tasks yang digunakan untuk memicu pemeriksaan penskalaan otomatis.
  • Membuat akun layanan penskala otomatis Kafka, dan memberikan izin yang diperlukan.
  • Mengonfigurasi dan men-deploy penskala otomatis Kafka.
  • Membuat tugas Cloud Scheduler yang secara berkala memicu pemeriksaan penskalaan otomatis.

Saat skrip setup_kafka_scaler.sh berjalan, skrip akan menampilkan variabel lingkungan yang dikonfigurasi. Pastikan variabel lingkungan sudah benar sebelum Anda melanjutkan.

Memberikan izin tambahan

Untuk mengubah jumlah instance konsumen Kafka, akun layanan penskalaan otomatis Kafka harus memiliki izin lihat pada image container yang di-deploy. Misalnya, jika image konsumen di-deploy dari Artifact Registry, jalankan perintah berikut:

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

Memverifikasi bahwa penskalaan otomatis Kafka berfungsi

Penskalaan layanan penskalaan otomatis Kafka dipicu dengan permintaan ke URL layanan (SCALER_SERVICE_NAME-PROJECT_NUMBER.REGION.run.app).

Anda dapat mengirim permintaan POST ke layanan penskalaan otomatis Kafka untuk memicu penghitungan penskalaan otomatis:

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

Ganti kode berikut:

  • SCALER_SERVICE_NAME: nama layanan penskala otomatis Kafka Anda.
  • PROJECT_NUMBER: nomor project untuk layanan autoscaler Kafka.
  • REGION: lokasi layanan autoscaler Kafka.

Permintaan POST memicu penghitungan penskalaan otomatis, output ke logging, dan mengubah jumlah instance berdasarkan rekomendasi.

Log layanan penskalaan otomatis Kafka Anda harus menyertakan pesan seperti [SCALING] Recommended instances X.

Jika flag OUTPUT_SCALER_METRICS diaktifkan, Anda juga dapat menemukan metrik Cloud Monitoring penskala di bagian custom.googleapis.com/cloud-run-kafkascaler.

Konfigurasi penskalaan lanjutan

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]

Daftar berikut menjelaskan beberapa elemen sebelumnya:

  • scaleDown: perilaku saat mengurangi jumlah instance (penurunan skala).
  • scaleUp: perilaku saat meningkatkan jumlah instance (menskalakan).
  • stabilizationWindowSeconds: tertinggi (scaleDown) atau terendah (scaleUp). jumlah instance yang dihitung selama periode berjalan. Menetapkan nilai ke 0 berarti nilai yang dihitung terbaru akan digunakan.
  • selectPolicy: hasil yang akan diterapkan saat beberapa kebijakan dikonfigurasi.
  • Min: perubahan terkecil
  • Max: perubahan terbesar
  • Percent: perubahan per periode dibatasi hingga persentase total instance yang dikonfigurasi.
  • Instances: perubahan per periode dibatasi hingga jumlah instance yang dikonfigurasi.
  • periodSeconds: jangka waktu kebijakan diterapkan.

Misalnya, spesifikasi lengkap, menggunakan konfigurasi default, akan terlihat seperti berikut:

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