Menskalakan otomatis kumpulan worker dengan metrik eksternal

Halaman ini menjelaskan cara menskalakan worker pool Cloud Run secara otomatis menggunakan metrik berbasis peristiwa eksternal. Cloud Run External Metrics Autoscaling (CREMA) memungkinkan fungsi ini dengan memanfaatkan Kubernetes-based Event Driven Autoscaling (KEDA) untuk menskalakan workload berdasarkan sumber peristiwa eksternal.

Untuk mengetahui scaler yang didukung dan kompatibilitasnya dengan Cloud Run, lihat Cloud Run External Metrics Autoscaling (CREMA) dalam dokumentasi Google Cloud GitHub.

Tentang layanan autoscaler

Untuk menskalakan otomatis kumpulan worker, deploy layanan autoscaler CREMA ke Cloud Run. Layanan ini melakukan tindakan berikut:

  1. Melakukan polling pada sumber peristiwa eksternal, seperti topik Apache Kafka atau GitHub Runner Scaler.

  2. Menghitung jumlah instance yang diperlukan berdasarkan konfigurasi YAML Anda.

  3. Memperbarui jumlah instance kumpulan worker secara otomatis.

Sebelum memulai

  1. Pastikan Anda telah menyiapkan project baru untuk Cloud Run, seperti yang dijelaskan di halaman setup.

  2. Aktifkan Artifact Registry, Cloud Build, Cloud Run Admin API, Secret Manager, dan Parameter Manager API:

    gcloud services enable artifactregistry.googleapis.com \
        cloudbuild.googleapis.com \
        run.googleapis.com \
        secretmanager.googleapis.com \
        parametermanager.googleapis.com
    
  3. Konfigurasikan workload berbasis peristiwa atau permintaan, seperti GitHub Runners atau Apache Kafka. Untuk memverifikasi bahwa sumber workload Anda didukung, lihat daftar kompatibilitas CREMA di dokumentasi Google Cloud GitHub.

  4. Tinjau kalkulator harga untuk memperkirakan biaya. Anda akan dikenai biaya untuk layanan penskalaan Cloud Run berdasarkan seberapa sering Anda memicu penskalaan.

Peran yang diperlukan

Untuk mendapatkan izin yang Anda perlukan untuk menskalakan worker pool secara otomatis, minta administrator untuk memberi Anda peran IAM berikut pada project Anda:

Untuk mengetahui informasi selengkapnya tentang pemberian peran, lihat Mengelola akses ke project, folder, dan organisasi.

Anda mungkin juga bisa mendapatkan izin yang diperlukan melalui peran khusus atau peran bawaan lainnya.

Membuat akun layanan kustom

Buat akun layanan kustom dengan izin minimum yang diperlukan untuk menggunakan resource yang disediakan yang diperlukan untuk workload Anda. Untuk menyiapkan akun layanan, lakukan hal berikut:

gcloud iam service-accounts create CREMA_SERVICE_ACCOUNT \
  --display-name="CREMA Service Account"

Ganti CREMA_SERVICE_ACCOUNT dengan nama untuk akun layanan kustom Anda, misalnya crema-service-account. Perintah ini membuat akun layanan yang mengikuti format, crema-service-account@example-project.iam.gserviceaccount.com.

Membuat file konfigurasi CREMA

Untuk menentukan logika penskalaan, buat file konfigurasi YAML di direktori root Anda. File ini menginstruksikan layanan CREMA tentang sumber eksternal mana yang harus dipantau, cara melakukan autentikasi dengan resource, dan worker pool mana yang harus diskalakan.

Contoh YAML

Contoh berikut menunjukkan file konfigurasi untuk menskalakan worker pool Cloud Run (example-workerpool) menggunakan metrik GitHub Runner. Alat ini menggunakan secret Secret Manager bernama github_runner_token untuk melakukan autentikasi dengan GitHub guna membaca metrik.

  apiVersion: crema/v1
  kind: CremaConfig
  metadata:
    name: gh-demo
  spec:
    triggerAuthentications:
      - metadata:
          name: github-trigger-auth
        spec:
          gcpSecretManager:
            secrets:
              - parameter: personalAccessToken
                id: github_runner_token
                version: latest
    scaledObjects:
      - spec:
          scaleTargetRef:
            name: projects/example-project/locations/us-central1/workerpools/example-workerpool
          triggers:
            - type: github-runner
              name: example-runner
              metadata:
                owner: repo-owner
                runnerScope: repo
                repos: repo-name
                targetWorkflowQueueLength: 1
              authenticationRef:
                name: github-trigger-auth
          advanced:
            horizontalPodAutoscalerConfig:
              behavior:
                scaleDown:
                  stabilizationWindowSeconds: 10
                  policies:
                    - type: Pods
                      value: 100
                      periodSeconds: 10
                scaleUp:
                  stabilizationWindowSeconds: 10
                  policies:
                    - type: Pods
                      value: 2
                      periodSeconds: 10
        pollingInterval: 10

Konfigurasi YAML menggunakan parameter tingkat tinggi berikut:

  • triggerAuthentications: menentukan cara CREMA mengautentikasi layanan eksternal, seperti menggunakan token yang disimpan di Secret Manager.

  • scaledObjects: menentukan pemetaan antara worker pool Cloud Run Anda dan resource metrik eksternal. Parameter ini mencakup:

    • scaleTargetRef: layanan Cloud Run atau worker pool yang akan diskalakan.

    • triggers: metrik eksternal tertentu yang digunakan untuk penskalaan. Jika sumber metrik eksternal Anda memerlukan autentikasi, tetapkan kolom authenticationRef untuk menentukan salah satu objek TriggerAuthentications untuk kredensial.

  • pollingInterval: mengontrol interval (dalam detik) saat CREMA memperbarui metriknya. Jika Anda menghapus parameter ini, CREMA tidak akan melakukan polling secara otomatis, dan Anda harus memicu pemeriksaan penskalaan secara manual menggunakan permintaan POST ke layanan.

Untuk mengetahui informasi selengkapnya tentang cara menentukan metrik konfigurasi dasar dan lanjutan, lihat Referensi konfigurasi di dokumentasi GitHub Google Cloud .

Untuk mengetahui daftar lengkap definisi konfigurasi bagi penskala yang kompatibel, lihat Penskala dalam dokumentasi KEDA.

Menyimpan konfigurasi CREMA di Parameter Manager

Untuk menyimpan versi parameter untuk layanan autoscaler CREMA Anda, ikuti langkah-langkah berikut:

  1. Buat parameter di Parameter Manager:

    gcloud parametermanager parameters create PARAMETER_ID --location=global  --parameter-format=YAML
    

    Ganti PARAMETER_ID dengan nama parameter Anda.

  2. Upload file YAML lokal Anda sebagai versi parameter baru:

    gcloud parametermanager parameters versions create PARAMETER_VERSION \
      --location=global \
      --parameter=PARAMETER_ID \
      --payload-data-from-file=LOCAL_YAML_CONFIG_FILE
    

    Ganti kode berikut:

    • PARAMETER_VERSION: ID yang ingin Anda tetapkan ke versi parameter, misalnya, 1.
    • LOCAL_YAML_CONFIG_FILE: jalur ke file konfigurasi YAML Anda.

Untuk mengetahui informasi selengkapnya, lihat Membuat parameter.

Memberikan izin tambahan ke akun layanan CREMA Anda

Untuk menskalakan worker pool yang Anda tentukan dalam konfigurasi YAML, berikan izin berikut pada akun layanan kustom:

  1. Beri akun layanan CREMA Anda izin untuk membaca dari Parameter Manager:

    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member="serviceAccount:CREMA_SERVICE_ACCOUNT_NAME \
      --role="roles/parametermanager.parameterViewer"
    

    Ganti kode berikut:

    • PROJECT_ID: ID project Google Cloud Anda.

    • CREMA_SERVICE_ACCOUNT_NAME: nama akun layanan CREMA Anda.

  2. Berikan peran roles/run.developer kepada akun layanan CREMA Anda di worker pool. Hal ini memungkinkan layanan CREMA mengubah jumlah instance kumpulan worker Anda sebagai respons terhadap perubahan metrik:

    WORKER_POOL_NAME=WORKER_POOL_NAME
    WORKER_POOL_REGION=WORKER_POOL_REGION
    gcloud run worker-pools add-iam-policy-binding $WORKER_POOL_NAME \
      --region=$WORKER_POOL_REGION \
      --member="serviceAccount:CREMA_SERVICE_ACCOUNT_NAME" \
      --role="roles/run.developer"
    

    Ganti kode berikut:

    • WORKER_POOL_NAME: nama worker pool.
    • WORKER_POOL_REGION: region worker pool Anda.
  3. Beri izin akun layanan CREMA Anda untuk menulis metrik:

     gcloud projects add-iam-policy-binding PROJECT_ID \
       --member="serviceAccount:CREMA_SERVICE_ACCOUNT_NAME" \
       --role="roles/monitoring.metricWriter"
    
  4. Berikan peran pengguna akun layanan kepada akun layanan CREMA Anda:

    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member="serviceAccount:CREMA_SERVICE_ACCOUNT_NAME" \
      --role="roles/iam.serviceAccountUser"
    

Men-deploy layanan untuk menskalakan workload Anda

Untuk men-deploy layanan guna menskalakan worker pool, jalankan perintah berikut dengan image container bawaan:

gcloud run deploy SERVICE_NAME\
  --image=us-central1-docker.pkg.dev/cloud-run-oss-images/crema-v1/autoscaler:1.0 \
  --region=SERVICE_REGION \
  --service-account="CREMA_SERVICE_ACCOUNT_NAME" \
  --no-allow-unauthenticated \
  --no-cpu-throttling \
  --base-image=us-central1-docker.pkg.dev/serverless-runtimes/google-24/runtimes/java25 \
  --labels=created-by=crema \
  --set-env-vars="CREMA_CONFIG=projects/PROJECT_ID/locations/PARAMETER_REGION/parameters/PARAMETER_ID/versions/PARAMETER_VERSION,OUTPUT_SCALER_METRICS=True"

Ganti kode berikut:

  • SERVICE_NAME: nama layanan autoscaler Anda.

  • SERVICE_REGION: region layanan Anda.

  • CREMA_SERVICE_ACCOUNT_NAME: nama akun layanan CREMA Anda.

  • PROJECT_ID: ID project Google Cloud Anda.

  • PARAMETER_REGION, PARAMETER_ID, dan PARAMETER_VERSION: nilai yang Anda simpan di Parameter Manager.

Anda juga dapat men-deploy layanan CREMA menggunakan image container kustom yang Anda buat dari kode sumber dengan Cloud Build.

Menguji layanan CREMA Anda

Untuk memverifikasi bahwa layanan penskalaan otomatis Anda berfungsi dengan benar, periksa tab Logs layanan Cloud Run.

Anda akan melihat log berikut di log layanan Anda setiap kali metrik diperbarui:

Setiap pesan log diberi label dengan komponen yang memunculkannya.

[INFO] [METRIC-PROVIDER] Starting metric collection cycle
[INFO] [METRIC-PROVIDER] Successfully fetched scaled object metrics ...
[INFO] [METRIC-PROVIDER] Sending scale request ...
[INFO] [SCALER] Received ScaleRequest ...
[INFO] [SCALER] Current instances ...
[INFO] [SCALER] Recommended instances ...

Langkah berikutnya