Scalare automaticamente i carichi di lavoro dei consumer Kafka

Questo tutorial mostra come configurare ed eseguire il deployment di uno strumento di scalabilità automatica Kafka come servizio Cloud Run. Questo autoscaler esegue la logica di scalabilità per un carico di lavoro consumer Kafka, ad esempio un deployment di un pool di worker Cloud Run. Il gestore della scalabilità automatica di Kafka legge le metriche dal cluster Kafka e utilizza la scalabilità manuale per un pool di worker o un servizio Cloud Run per scalare un carico di lavoro consumer Kafka in base alla metrica del ritardo del consumer Kafka.

Il seguente diagramma mostra come un servizio di scalabilità automatica di Kafka legge le metriche da un cluster Kafka per scalare automaticamente un pool di worker consumer Kafka.

Un servizio di scalabilità automatica di Kafka estrae le metriche da Kafka e scala automaticamente un consumer Kafka

Ruoli obbligatori

Per ottenere le autorizzazioni necessarie per eseguire il deployment e l'esecuzione di questo servizio, chiedi all'amministratore di concederti i seguenti ruoli IAM:

Prima di iniziare

Per configurare e utilizzare lo strumento di scalabilità automatica di Kafka, devi disporre delle seguenti risorse.

  • Cluster Kafka
  • Consumer di cui è stato eseguito il deployment

Cluster Kafka

Consumer Cloud Run di cui è stato eseguito il deployment

  • Un carico di lavoro consumer Kafka deve essere distribuito su Cloud Run come servizio o pool di worker. Deve essere configurato per connettersi al cluster, all'argomento e al gruppo di consumatori Kafka. Per un esempio di consumer Kafka, vedi Cloud Run Kafka Autoscaler Example Consumer.
  • Il carico di lavoro consumer deve trovarsi nello stesso progetto Google Cloud del cluster Kafka.

Best practice

  • Connetti i tuoi consumer Kafka alla tua rete VPC utilizzando VPC diretto. VPC diretto consente di connettersi al cluster Kafka utilizzando indirizzi IP privati e di mantenere il traffico sulla rete VPC.
  • Configura un controllo di integrità di attività per i consumer Kafka che verifichi se il consumer sta recuperando eventi. Il controllo di integrità contribuisce a garantire che le istanze in stato non integro vengano riavviate automaticamente se smettono di elaborare gli eventi, anche se il container non si arresta in modo anomalo.

Crea il gestore della scalabilità automatica Kafka

Puoi utilizzare Cloud Build per creare un'immagine container di Kafka Autoscaler dal relativo codice sorgente.

  1. Clona il repository:

    git clone https://github.com/GoogleCloudPlatform/cloud-run-kafka-scaler.git
    
  2. Vai alla cartella del repository:

    cd cloud-run-kafka-scaler
    

Per specificare il nome dell'immagine di output, aggiorna %ARTIFACT_REGISTRY_IMAGE% nel file cloudbuild.yaml incluso, ad esempio: 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

Questo comando crea l'immagine container ed esegue il push su Artifact Registry. Registra il percorso completo dell'immagine (SCALER_IMAGE_PATH) perché ti servirà in un secondo momento.

Tieni presente che l'immagine risultante non verrà eseguita localmente. È progettata per essere sovrapposta a un'immagine di base Java. Per ulteriori informazioni, inclusa la procedura per riassemblare l'immagine del container per l'esecuzione in locale, consulta Configurare gli aggiornamenti automatici dell'immagine di base.

Definisci la configurazione dello strumento di scalabilità automatica di Kafka

Puoi configurare lo strumento di scalabilità automatica di Kafka utilizzando i secret. Il gestore della scalabilità automatica aggiorna periodicamente la sua configurazione, il che significa che puoi eseguire il push di nuove versioni del secret per modificare la configurazione senza dover eseguire nuovamente il deployment del gestore della scalabilità automatica.

Configurare le proprietà del client Kafka

Puoi configurare la connessione all'API Kafka Admin montando un secret come volume quando esegui il deployment del gestore della scalabilità automatica Kafka.

Crea un file denominato kafka_client_config.txt e includi le proprietà di configurazione del client amministratore di Kafka che vuoi aggiungere. La proprietà bootstrap.servers è obbligatoria:

bootstrap.servers=BOOTSTRAP_SERVER_LIST

Sostituisci BOOTSTRAP_SERVER_LIST con l'elenco HOST:PORT per il cluster Kafka.

Configura l'autenticazione Kafka

Se il server Kafka richiede l'autenticazione, includi le proprietà di configurazione necessarie nel file kafka_client_config.txt. Ad esempio, per connettersi a un cluster Managed Service per Apache Kafka utilizzando le credenziali predefinite dell'applicazione con Google OAuth, questo secret deve includere le seguenti proprietà:

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;

Sostituisci BOOTSTRAP_SERVER_LIST con l'elenco HOST:PORT per il cluster Kafka.

L'utilizzo delle credenziali predefinite dell'applicazione con un cluster Managed Service per Apache Kafka richiede anche la concessione del ruolo Client Kafka gestito (roles/managedkafka.client) aaccount di serviziont di Kafka Autoscaler:

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

Sostituisci quanto segue:

  • SCALER_SERVICE_ACCOUNT: il nome del account di servizio del gestore della scalabilità automatica di Kafka.
  • PROJECT_ID: l'ID progetto per il servizio di scalabilità automatica di Kafka.

Per creare il secret, che verrà montato come volume al momento del deployment, utilizza il file kafka_client_config.txt:

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

Sostituisci ADMIN_CLIENT_SECRET_NAME con il nome del secret di autenticazione Kafka.

Configura scalabilità

Il gestore della scalabilità automatica di Kafka legge la configurazione di scalabilità dal volume /scaler-config/scaling. I contenuti di questo volume devono essere formattati come YAML. Ti consigliamo di montare un volume secret per questa configurazione.

Crea un file denominato scaling_config.yaml con la seguente configurazione:

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

Sostituisci quanto segue:

  • PROJECT_ID: l'ID progetto del workload consumer Kafka di cui eseguire lo scale automatico.
  • REGION: la regione del carico di lavoro del consumer Kafka di cui eseguire lo scale automatico.
  • CONSUMER_SERVICE_NAME: il nome del carico di lavoro consumer Kafka di cui eseguire lo scale automatico.
  • TARGET_CPU_UTILIZATION: l'utilizzo CPU target per i calcoli di scalabilità automatica, ad esempio: 60.
  • LAG_THRESHOLD: la soglia per la metrica consumer_lag per attivare la scalabilità automatica, ad esempio: 1000.
  • (Facoltativo) CPU_ACTIVATION_THRESHOLD: la soglia di attivazione della CPU. Quando tutte le metriche sono inattive, il consumatore target viene scalato a zero. Il valore predefinito è 0.
  • (Facoltativo) CPU_TOLERANCE: una soglia che impedisce le modifiche di scalabilità se rientra nell'intervallo specificato. Espresso come percentuale dell'utilizzo della CPU target. Il valore predefinito è 0.1.
  • (Facoltativo) CPU_METRIC_WINDOW: un periodo di tempo, in secondi, su cui viene calcolato l'utilizzo medio della CPU. Il valore predefinito è 120.
  • (Facoltativo) LAG_ACTIVATION_THRESHOLD: la soglia di attivazione per la metrica consumer_lag. Quando tutte le metriche sono inattive, il consumatore target viene scalato a zero. Il valore predefinito è 0.
  • (Facoltativo) LAG_TOLERANCE: una soglia che impedisce le modifiche di scalabilità se rientra nell'intervallo specificato. Espresso come percentuale del ritardo del consumatore target. Il valore predefinito è 0.1.

Se vuoi, puoi configurare le proprietà di scalabilità avanzate utilizzando un blocco behavior:. Questo blocco supporta molte delle stesse proprietà dei criteri di scalabilità HPA di Kubernetes.

Se non specifichi un blocco behavior, viene utilizzata la seguente configurazione predefinita:

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

Per creare il volume secret, che verrà montato in deployment, copia la configurazione in un file denominato scaling_config.yaml e poi esegui il comando seguente:

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

Sostituisci SCALING_CONFIG_SECRET_NAME con il nome del secret di scalabilità.

Esegui il deployment del gestore della scalabilità automatica di Kafka

Dopo aver completato i prerequisiti, puoi eseguire il deployment del servizio di scalabilità automatica di Kafka e della relativa infrastruttura di supporto. Per semplificare questo processo, vengono forniti un modulo Terraform e uno script shell.

gcloud

Questa sezione descrive in dettaglio ogni comando gcloud necessario per eseguire il deployment manuale del gestore della scalabilità automatica. Nella maggior parte dei casi, ti consigliamo di utilizzare lo script shell o il modulo Terraform.

Crea un account di servizio

I requisiti dell'account di servizio dipendono dall'intervallo di controllo della scalabilità automatica che hai configurato. Puoi configurare il gestore della scalabilità automatica di Kafka in modo che esegua i controlli di scalabilità automatica a intervalli flessibili:

  • Un minuto o più: Cloud Scheduler attiva il controllo della scalabilità automatica con una richiesta POST all'intervallo selezionato.
  • Meno di un minuto: Cloud Scheduler attiva la creazione di più Cloud Tasks ogni minuto, in base alla frequenza configurata.

Uno o più minuti

Account di servizio dello strumento di scalabilità automatica di Kafka

Crea un account di servizio per lo strumento di scalabilità automatica di Kafka:

gcloud iam service-accounts create SCALER_SERVICE_ACCOUNT

Sostituisci SCALER_SERVICE_ACCOUNT con il nome del account di servizio di Kafka Autoscaler.

Il gestore della scalabilità automatica di Kafka ha bisogno delle seguenti autorizzazioni per aggiornare il numero di istanze consumer Kafka:

  • iam.serviceaccounts.actAs per il account di servizio consumer Kafka.
  • roles/artifactregistry.reader per il repository che contiene l'immagine consumer Kafka.
  • run.workerpools.get e run.workerpools.update. Queste autorizzazioni sono incluse nel ruolo Amministratore di Cloud Run (roles/run.admin).
  • roles/secretmanager.secretAccessor per i secret di scalabilità e autenticazione Kafka.
  • roles/monitoring.viewer per il progetto consumer Kafka. Questo ruolo è necessario per leggere le metriche di utilizzo della CPU.
  • roles/monitoring.metricWriter per il progetto consumer Kafka. Questo ruolo è facoltativo, ma consente al gestore della scalabilità automatica di emettere metriche personalizzate per una migliore osservabilità.
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

Sostituisci quanto segue:

  • PROJECT_ID: l'ID progetto in cui si trova il servizio di scalabilità automatica di Kafka.
  • CONSUMER_SERVICE_ACCOUNT_EMAIL: l'indirizzo email dell'account di servizio per il consumer Kafka. Ad esempio, example@PROJECT-ID.iam.gserviceaccount.com.
  • SCALER_SERVICE_ACCOUNT: l'account di servizio per il gestore della scalabilità automatica di Kafka.
  • ADMIN_CLIENT_SECRET_NAME: il nome del secret di autenticazione Kafka.
  • SCALING_CONFIG_SECRET_NAME: il nome del secret di scalabilità.
  • CONSUMER_IMAGE_REPO: l'ID o l'identificatore completo del repository con l'immagine del container per il consumer Kafka.
  • REPO_REGION: la posizione del repository di immagini consumer.

Meno di un minuto

Configura Cloud Tasks

Cloud Scheduler può attivarsi solo a intervalli di un minuto o più. Per intervalli inferiori a un minuto, utilizza Cloud Tasks per attivare il gestore della scalabilità automatica di Kafka. Per configurare Cloud Tasks sono necessari i seguenti elementi:

  • Creazione della coda di Cloud Tasks per le attività di controllo della scalabilità automatica.
  • Creazione del account di servizio utilizzato da Cloud Tasks per richiamare lo strumento di scalabilità automatica Kafka con il ruolo 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"

Sostituisci quanto segue:

  • CLOUD_TASKS_QUEUE_NAME: la coda Cloud Tasks configurata per attivare i controlli di scalabilità automatica.
  • TASKS_SERVICE_ACCOUNT: il account di servizio che Cloud Tasks deve utilizzare per attivare i controlli di scalabilità automatica.
  • SCALER_SERVICE_NAME: il nome del servizio di scalabilità automatica di Kafka.
  • PROJECT_ID: l'ID progetto per il servizio di scalabilità automatica di Kafka.
  • REGION: la posizione del servizio di scalabilità automatica di Kafka.

Configura il account di servizio dello strumento di scalabilità automatica di Kafka

Crea un account di servizio per lo strumento di scalabilità automatica di Kafka:

gcloud iam service-accounts create SCALER_SERVICE_ACCOUNT

Sostituisci SCALER_SERVICE_ACCOUNT con il nome del account di servizio di Kafka Autoscaler.

Per aggiornare il numero di istanze consumer Kafka e creare attività per i controlli di scalabilità automatica, il gestore della scalabilità automatica Kafka ha bisogno delle seguenti autorizzazioni:

  • iam.serviceaccounts.actAs per il account di servizio consumer Kafka.
  • roles/artifactregistry.reader per il repository che contiene l'immagine consumer Kafka
  • run.workerpools.get e run.workerpools.update. Queste autorizzazioni sono incluse nel ruolo Amministratore di Cloud Run (roles/run.admin).
  • roles/secretmanager.secretAccessor per entrambi i secret per lo scaling e l'autenticazione Kafka.
  • roles/monitoring.viewer per il progetto consumer Kafka. Questo ruolo è necessario per leggere le metriche di utilizzo della CPU.
  • roles/monitoring.metricWriter per il progetto consumer Kafka. Questo ruolo è facoltativo, ma consente al gestore della scalabilità automatica di emettere metriche personalizzate per una migliore osservabilità.
  • Ruolo Autore inserimento in coda 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

Sostituisci quanto segue:

  • PROJECT_ID: l'ID progetto in cui si trova il servizio di scalabilità automatica di Kafka.
  • CONSUMER_SERVICE_ACCOUNT_EMAIL: l'indirizzo email dell'account di servizio per il consumer Kafka. Ad esempio, example@PROJECT_ID.iam.gserviceaccount.com.
  • SCALER_SERVICE_ACCOUNT: l'account di servizio per il gestore della scalabilità automatica di Kafka.
  • CONSUMER_IMAGE_REPO: l'ID o l'identificatore completo del repository con l'immagine del container per il consumer Kafka.
  • ADMIN_CLIENT_SECRET_NAME: il nome del secret di autenticazione Kafka.
  • SCALING_CONFIG_SECRET_NAME: il nome del secret di scalabilità.
  • REPO_REGION: la posizione del repository di immagini consumer.
  • CLOUD_TASKS_QUEUE_NAME: la coda Cloud Tasks configurata per attivare i controlli di scalabilità automatica.
  • REGION: la posizione del servizio di scalabilità automatica di Kafka.

Configura le variabili di ambiente

Uno o più minuti

Il gestore della scalabilità automatica Kafka utilizza le variabili di ambiente per specificare il consumer Kafka e altri aspetti del carico di lavoro di destinazione. Per motivi di sicurezza, ti consigliamo di configurare le informazioni sensibili come secret.

Crea un file YAML denominato scaler_env_vars.yaml con le seguenti variabili:

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

Sostituisci quanto segue:

  • KAFKA_TOPIC_ID: l'ID argomento a cui si iscrivono i consumer Kafka.
  • CONSUMER_GROUP_ID: l'ID gruppo di consumer utilizzato dal consumer Kafka di destinazione. Questi valori devono corrispondere, altrimenti lo scalabilità automatica non funzionerà.
  • CYCLE_SECONDS: il periodo del ciclo del gestore della scalabilità automatica, in secondi.
  • OUTPUT_SCALER_METRICS: l'impostazione per abilitare le metriche. Imposta il valore su true per attivare l'output delle metriche personalizzate o su false in caso contrario.

Meno di un minuto

Il gestore della scalabilità automatica Kafka utilizza le variabili di ambiente per specificare il consumer Kafka e altri aspetti del carico di lavoro di destinazione. Per motivi di sicurezza, ti consigliamo di configurare le informazioni sensibili come secret.

Crea un file YAML denominato scaler_env_vars.yaml con le seguenti variabili:

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

Sostituisci quanto segue:

  • KAFKA_TOPIC_ID: l'ID argomento a cui si iscrivono i consumer Kafka.
  • CONSUMER_GROUP_ID: l'ID gruppo di consumer utilizzato dal consumer Kafka di destinazione. Questi valori devono corrispondere, altrimenti lo scalabilità automatica non funzionerà.
  • CYCLE_SECONDS: il periodo del ciclo del gestore della scalabilità automatica, in secondi.
  • OUTPUT_SCALER_METRICS: l'impostazione per abilitare le metriche. Imposta il valore su true per attivare l'output delle metriche personalizzate o su false in caso contrario.
  • CLOUD_TASKS_QUEUE_NAME: il nome completo della coda Cloud Tasks per attivare i controlli di scalabilità automatica. Ha il seguente formato: projects/$PROJECT_ID/locations/$REGION/queues/$CLOUD_TASKS_QUEUE_NAME.
  • TASKS_SERVICE_ACCOUNT_EMAIL: il account di servizio che Cloud Tasks deve utilizzare per attivare i controlli di scalabilità automatica. Ad esempio, example@PROJECT_ID.iam.gserviceaccount.com.

Esegui il deployment dello strumento di scalabilità automatica di Kafka utilizzando l'immagine fornita e connettiti al VPC Kafka con il file scaler_env_vars.yaml e i montaggi del volume secret:

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

Sostituisci quanto segue:

  • SCALER_IMAGE_URI: l'URI dell'immagine del gestore della scalabilità automatica Kafka.
  • SCALER_SERVICE_NAME: il nome del servizio di scalabilità automatica di Kafka.
  • SCALER_SERVICE_ACCOUNT: il nome del service account del gestore della scalabilità automatica di Kafka.
  • PROJECT_ID: l'ID progetto per il servizio di scalabilità automatica di Kafka.
  • KAFKA_VPC_NETWORK: la rete VPC connessa al cluster Kafka.
  • KAFKA_VPC_SUBNET: la subnet VPC connessa al cluster Kafka.
  • ADMIN_CLIENT_SECRET_NAME: il nome del secret di autenticazione Kafka.
  • SCALING_CONFIG_SECRET_NAME: il nome del secret di scalabilità.

Configurare controlli periodici della scalabilità automatica

In questa sezione, utilizzi Cloud Scheduler per attivare controlli periodici di scalabilità automatica:

  • Un minuto o più: configura Cloud Scheduler in modo che venga attivato all'intervallo selezionato
  • Meno di un minuto: configura Cloud Scheduler in modo che venga attivato ogni minuto
Crea account di servizio invoker

Per consentire a Cloud Scheduler di chiamare lo scalatore automatico Kafka, devi creare un service account con il ruolo Invoker (roles/run.invoker) nel servizio di scalatore automatico 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"

Sostituisci quanto segue:

  • SCALER_SERVICE_NAME: il nome del servizio di scalabilità automatica di Kafka.
  • SCALER_INVOKER_SERVICE_ACCOUNT: il nome del account di servizio chiamante.
  • PROJECT_ID: l'ID progetto per il servizio di scalabilità automatica di Kafka.
Crea job Cloud Scheduler

Uno o più minuti

Crea un job Cloud Scheduler con l'intervallo di controllo della scalabilità automatica selezionato:

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

Sostituisci quanto segue:

  • SCALER_SERVICE_NAME: il nome del servizio di scalabilità automatica di Kafka.
  • SCALER_INVOKER_SERVICE_ACCOUNT: il nome del account di servizio chiamante.
  • PROJECT_ID: l'ID progetto o il servizio di scalabilità automatica di Kafka.
  • PROJECT_NUMBER: il numero di progetto per il servizio di scalabilità automatica di Kafka.
  • REGION: la posizione del servizio di scalabilità automatica di Kafka.
  • TIMEZONE: il fuso orario, ad esempio America/Los_Angeles.
  • CRON_SCHEDULE: la pianificazione selezionata nel formato Crontab. Ad esempio, ogni minuto: "* * * * *".

Meno di un minuto

Crea un job Cloud Scheduler che venga eseguito ogni minuto:

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

Sostituisci quanto segue:

  • SCALER_SERVICE_NAME: il nome del servizio di scalabilità automatica di Kafka.
  • SCALER_INVOKER_SERVICE_ACCOUNT: il nome del account di servizio chiamante.
  • PROJECT_ID: l'ID progetto del servizio di scalabilità automatica di Kafka.
  • PROJECT_NUMBER: il numero di progetto per il servizio di scalabilità automatica di Kafka.
  • REGION: la posizione del servizio di scalabilità automatica di Kafka.
  • TIMEZONE: il fuso orario, ad esempio America/Los_Angeles.

terraform

La directory terraform/ contiene un modulo Terraform riutilizzabile che puoi utilizzare per eseguire il provisioning dello strumento di scalabilità automatica Kafka e delle relative risorse.

Questo modulo automatizza la creazione di:

  • Servizio Cloud Run di scalabilità automatica di Kafka
  • Supporto di service account e binding IAM
  • Coda di attività cloud
  • Job Cloud Scheduler

Per istruzioni dettagliate, esempi di utilizzo e descrizioni di tutte le variabili di input/output, consulta la terraform readme.

Devi fornire le variabili necessarie al modulo Terraform, inclusi i dettagli dei prerequisiti, come ID progetto, regione, email SA consumer, nomi dei secret, percorso dell'immagine dello scaler e ID argomento.

shell

Con il gestore della scalabilità automatica viene fornito uno script setup_kafka_scaler.sh per creare e configurare automaticamente tutte le risorse necessarie.

Imposta le variabili di ambiente

Prima di eseguire lo script, assicurati di aver impostato tutte le variabili di ambiente richieste:

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

Sostituisci quanto segue:

  • PROJECT_ID: l'ID progetto in cui si trova il servizio di scalabilità automatica di Kafka.
  • REGION: la posizione del servizio di scalabilità automatica di Kafka.
  • DEPLOYED_KAFKA_CONSUMER: il nome del consumer Kafka.
  • KAFKA_CONSUMER_ACCOUNT_EMAIL: l'indirizzo email dell'account di servizio per il consumer Kafka.
  • KAFKA_TOPIC_ID: l'ID argomento a cui si iscrivono i consumer Kafka.
  • KAFKA_CONSUMER_GROUP_ID: l'ID gruppo di consumer utilizzato dal consumer Kafka di destinazione. Questi valori devono corrispondere, altrimenti lo scalabilità automatica non funzionerà.
  • VPC_NETWORK: la rete VPC connessa al cluster Kafka.
  • VPC_SUBNET: la subnet VPC connessa al cluster Kafka.
  • CLOUD_TASKS_QUEUE_FOR_SCALING_CHECKS: la coda Cloud Tasks configurata per attivare i controlli di scalabilità automatica.
  • TASKS_SERVICE_ACCOUNT_NAME: il account di servizio che Cloud Tasks deve utilizzare per attivare i controlli di scalabilità automatica.
  • KAFKA_AUTOSCALER_SERVICE_NAME: il nome del servizio di scalabilità automatica di Kafka.
  • KAFKA_AUTOSCALER_IMAGE_URI: l'URI dell'immagine del gestore della scalabilità automatica Kafka.
  • KAFKA_AUTOSCALER_CONFIG_SECRET_NAME: il nome del secret di scalabilità.
  • SCALER_CHECK_FREQUENCY: il periodo del ciclo del gestore della scalabilità automatica, in secondi.

Esegui lo script di configurazione

Esegui lo script setup_kafka_scaler.sh fornito:

./setup_kafka_scaler.sh

Lo script esegue queste azioni:

  • Crea la coda di Cloud Tasks utilizzata per attivare i controlli di scalabilità automatica.
  • Crea il account di servizio del gestore della scalabilità automatica di Kafka e concede le autorizzazioni necessarie.
  • Configura e implementa il gestore della scalabilità automatica di Kafka.
  • Crea il job Cloud Scheduler che attiva periodicamente i controlli di scalabilità automatica.

Quando viene eseguito lo script setup_kafka_scaler.sh, vengono restituite le variabili di ambiente configurate. Verifica che le variabili di ambiente siano corrette prima di continuare.

Concedi autorizzazioni aggiuntive

Per modificare il conteggio delle istanze del consumer Kafka, l'account di servizio Kafka Autoscaler deve disporre dell'autorizzazione di visualizzazione sull'immagine del container di cui è stato eseguito il deployment. Ad esempio, se l'immagine consumer è stata sottoposta a deployment da Artifact Registry, esegui questo comando:

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

Verificare che la scalabilità automatica di Kafka funzioni

La scalabilità automatica del servizio di scalabilità automatica di Kafka viene attivata con una richiesta all'URL del servizio (SCALER_SERVICE_NAME-PROJECT_NUMBER.REGION.run.app).

Puoi inviare una richiesta POST al servizio di scalabilità automatica di Kafka per attivare il calcolo della scalabilità automatica:

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

Sostituisci quanto segue:

  • SCALER_SERVICE_NAME: il nome del servizio di scalabilità automatica di Kafka.
  • PROJECT_NUMBER: il numero di progetto per il servizio di scalabilità automatica di Kafka.
  • REGION: la posizione del servizio di scalabilità automatica di Kafka.

Le richieste POST attivano il calcolo della scalabilità automatica, l'output nella registrazione e modificano il numero di istanze in base al consiglio.

I log del servizio di scalabilità automatica di Kafka devono includere messaggi come [SCALING] Recommended instances X.

Se il flag OUTPUT_SCALER_METRICS è attivato, puoi trovare le metriche di Cloud Monitoring dello scalatore anche in custom.googleapis.com/cloud-run-kafkascaler.

Configurazione avanzata dello scaling

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]

Il seguente elenco descrive alcuni degli elementi precedenti:

  • scaleDown: il comportamento durante la riduzione del conteggio delle istanze (ridimensionamento verso il basso).
  • scaleUp: il comportamento quando si aumenta il numero di istanze (scalabilità verticale).
  • stabilizationWindowSeconds: il conteggio delle istanze più alto (scaleDown) o più basso (scaleUp) calcolato in un periodo mobile. Se imposti il valore su 0, viene utilizzato il valore calcolato più recente.
  • selectPolicy: il risultato da applicare quando sono configurati più criteri.
  • Min: la variazione più piccola
  • Max: la variazione più grande
  • Percent: le modifiche per periodo sono limitate alla percentuale configurata del totale delle istanze.
  • Instances: le modifiche per periodo sono limitate al numero configurato di istanze.
  • periodSeconds: il periodo di tempo durante il quale vengono applicate le norme.

Ad esempio, la specifica completa, utilizzando la configurazione predefinita, ha il seguente aspetto:

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