In dieser Anleitung erfahren Sie, wie Sie einen Kafka-Autoscaler als Cloud Run-Dienst konfigurieren und bereitstellen. Dieser Autoscaler führt die Skalierungslogik für eine Kafka-Consumer-Arbeitslast aus, z. B. für die Bereitstellung eines Cloud Run-Worker-Pools. Der Kafka-Autoscaler liest Messwerte aus Ihrem Kafka-Cluster und verwendet die manuelle Skalierung für einen Cloud Run-Worker-Pool oder -Dienst, um eine Kafka-Consumer-Arbeitslast basierend auf dem Kafka-Consumer-Lag-Messwert zu skalieren.
Das folgende Diagramm zeigt, wie ein Kafka-Autoscaler-Dienst Messwerte aus einem Kafka-Cluster liest, um einen Kafka-Consumer-Worker-Pool automatisch zu skalieren.
Erforderliche Rollen
Bitten Sie Ihren Administrator, Ihnen die folgenden IAM-Rollen zuzuweisen, um die Berechtigungen zu erhalten, die Sie zum Bereitstellen und Ausführen dieses Dienstes benötigen:
- Cloud Run Developer (
roles/run.developer
) - Dienstkontonutzer (
roles/iam.serviceAccountUser
) - Artifact Registry-Leser (
roles/artifactregistry.reader
) - Cloud Scheduler-Administrator (
roles/cloudscheduler.admin
) zum Erstellen des Cloud Scheduler-Jobs zum Auslösen von Autoscaling-Prüfungen - Administrator für Cloud Tasks-Warteschlangen (
roles/cloudtasks.queueAdmin
), um die Cloud Tasks-Warteschlange für Autoscaling-Prüfungen zu erstellen - Sicherheitsadministrator (
roles/iam.securityAdmin
) zum Erteilen von Berechtigungen für Dienstkonten
Hinweise
Zum Konfigurieren und Verwenden des Kafka-Autoscalers benötigen Sie die folgenden Ressourcen.
- Kafka-Cluster
- Bereitgestellter Verbraucher
Kafka-Cluster
- Ein Kafka-Cluster muss entweder in Compute Engine, Google Kubernetes Engine oder im Managed Service for Apache Kafka ausgeführt werden.
- Ein konfiguriertes Kafka-Thema mit Ereignissen, die in diesem Thema veröffentlicht werden.
Bereitgestellter Cloud Run-Consumer
- Eine Kafka-Consumer-Arbeitslast muss als Dienst oder Worker-Pool in Cloud Run bereitgestellt werden. Es muss so konfiguriert sein, dass es eine Verbindung zu Ihrem Kafka-Cluster, ‑Thema und ‑Nutzergruppe herstellen kann. Ein Beispiel für einen Kafka-Consumer finden Sie unter Cloud Run Kafka Autoscaler Example Consumer.
- Ihre Consumer-Arbeitslast muss sich im selben Google Cloud Projekt wie Ihr Kafka-Cluster befinden.
Best Practices
- Verbinden Sie Ihre Kafka-Consumer über Direct VPC mit Ihrem VPC-Netzwerk. Mit Direct VPC können Sie über private IP-Adressen eine Verbindung zu Ihrem Kafka-Cluster herstellen und den Traffic in Ihrem VPC-Netzwerk halten.
- Konfigurieren Sie eine Liveness-Systemdiagnose für Ihre Kafka-Consumer, die prüft, ob der Consumer Ereignisse abruft. Die Systemdiagnose sorgt dafür, dass fehlerhafte Instanzen automatisch neu gestartet werden, wenn sie die Verarbeitung von Ereignissen einstellen, auch wenn der Container nicht abstürzt.
Kafka-Autoscaler erstellen
Mit Cloud Build können Sie ein Container-Image des Kafka-Autoscalers aus seinem Quellcode erstellen.
Klonen Sie das Repository:
git clone https://github.com/GoogleCloudPlatform/cloud-run-kafka-scaler.git
Wechseln Sie zum Repository-Ordner:
cd cloud-run-kafka-scaler
Wenn Sie den Namen des Ausgabebilds angeben möchten, aktualisieren Sie %ARTIFACT_REGISTRY_IMAGE%
in der enthaltenen Datei cloudbuild.yaml
, z. B. 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
Mit diesem Befehl wird das Container-Image erstellt und per Push in Artifact Registry übertragen. Notieren Sie sich den vollständigen Bildpfad (SCALER_IMAGE_PATH
), da Sie ihn später benötigen.
Das resultierende Bild kann nicht lokal ausgeführt werden. Es ist für die Verwendung als Layer über einem Java-Basis-Image vorgesehen. Weitere Informationen, einschließlich der Vorgehensweise zum erneuten Zusammensetzen des Container-Images für die lokale Ausführung, finden Sie unter Automatische Updates für Basis-Images konfigurieren.
Kafka-Autoscaling-Konfiguration definieren
Sie können den Kafka-Autoscaler mit Secrets konfigurieren. Der Autoscaler aktualisiert seine Konfiguration regelmäßig. Das bedeutet, dass Sie neue Secret-Versionen übertragen können, um die Konfiguration zu ändern, ohne den Autoscaler neu bereitstellen zu müssen.
Kafka-Client-Eigenschaften konfigurieren
Sie können die Verbindung zur Kafka Admin API konfigurieren, indem Sie beim Bereitstellen des Kafka-Autoscalers ein Secret als Volume bereitstellen.
Erstellen Sie eine Datei mit dem Namen kafka_client_config.txt
und fügen Sie alle Kafka-Admin-Clientkonfigurationsattribute hinzu, die Sie verwenden möchten. Die Property bootstrap.servers
ist erforderlich:
bootstrap.servers=BOOTSTRAP_SERVER_LIST
Ersetzen Sie BOOTSTRAP_SERVER_LIST durch die HOST:PORT
-Liste für den Kafka-Cluster.
Kafka-Authentifizierung konfigurieren
Wenn Ihr Kafka-Server eine Authentifizierung erfordert, fügen Sie die erforderlichen Konfigurationseigenschaften in die Datei kafka_client_config.txt
ein. Wenn Sie beispielsweise eine Verbindung zu einem Managed Service for Apache Kafka-Cluster mit Standardanmeldedaten für Anwendungen mit Google OAuth herstellen möchten, sollte dieses Secret die folgenden Eigenschaften enthalten:
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;
Ersetzen Sie BOOTSTRAP_SERVER_LIST durch die HOST:PORT
-Liste für den Kafka-Cluster.
Wenn Sie Standardanmeldedaten für Anwendungen mit einem Managed Service for Apache Kafka-Cluster verwenden, müssen Sie dem Kafka-Autoscaler-Dienstkonto auch die Rolle Managed Kafka Client (roles/managedkafka.client
) zuweisen:
gcloud projects add-iam-policy-binding PROJECT_ID \
--member="serviceAccount:SCALER_SERVICE_ACCOUNT@PROJECT_ID.iam.gserviceaccount.com" \
--role="roles/managedkafka.client"
Ersetzen Sie Folgendes:
- SCALER_SERVICE_ACCOUNT: Der Name des Dienstkontos für Kafka-Autoscaling.
- PROJECT_ID: die Projekt-ID für den Kafka-Autoscaler-Dienst.
So erstellen Sie das Secret, das bei der Bereitstellung als Volume bereitgestellt wird:kafka_client_config.txt
gcloud secrets create ADMIN_CLIENT_SECRET_NAME --data-file=kafka_client_config.txt
Ersetzen Sie ADMIN_CLIENT_SECRET_NAME durch den Namen des Kafka-Authentifizierungs-Secrets.
Skalierung konfigurieren
Das Kafka-Autoscaling liest seine Skalierungskonfiguration aus dem /scaler-config/scaling
-Volume. Der Inhalt dieses Volumes sollte als YAML formatiert sein. Wir empfehlen, für diese Konfiguration ein vertrauliches Volume zu mounten.
Erstellen Sie eine Datei mit dem Namen scaling_config.yaml
und der folgenden Konfiguration:
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
Ersetzen Sie Folgendes:
- PROJECT_ID: die Projekt-ID der Kafka-Consumer-Arbeitslast, die automatisch skaliert werden soll.
- REGION: die Region der Kafka-Consumer-Arbeitslast, für die das Autoscaling durchgeführt werden soll.
- CONSUMER_SERVICE_NAME: Der Name der Kafka-Consumer-Arbeitslast, die automatisch skaliert werden soll.
- TARGET_CPU_UTILIZATION: Die CPU-Zielauslastung für Autoscaling-Berechnungen, z. B.
60
. - LAG_THRESHOLD: Der Grenzwert für den Messwert
consumer_lag
, der das Autoscaling auslöst, z. B.1000
. - (Optional) CPU_ACTIVATION_THRESHOLD: Der Aktivierungsgrenzwert für die CPU. Wenn alle Messwerte inaktiv sind, wird die Zielgruppe auf null skaliert. Die Standardeinstellung ist
0
. - (Optional) CPU_TOLERANCE: Ein Grenzwert, der Skalierungsänderungen verhindert, wenn sie innerhalb des angegebenen Bereichs liegen. Wird als Prozentsatz der CPU-Zielauslastung ausgedrückt. Die Standardeinstellung ist
0.1
. - (Optional) CPU_METRIC_WINDOW: Ein Zeitraum in Sekunden, über den die durchschnittliche CPU-Auslastung berechnet wird. Die Standardeinstellung ist
120
. - (Optional) LAG_ACTIVATION_THRESHOLD: Der Aktivierungsschwellenwert für den Messwert
consumer_lag
. Wenn alle Messwerte inaktiv sind, wird die Zielgruppe auf null skaliert. Die Standardeinstellung ist0
. - (Optional) LAG_TOLERANCE: Ein Grenzwert, der Skalierungsänderungen verhindert, wenn sie innerhalb des angegebenen Bereichs liegen. Ausgedrückt als Prozentsatz der Zielverzögerung. Die Standardeinstellung ist
0.1
.
Optional können Sie erweiterte Skalierungseigenschaften mit einem behavior:
-Block konfigurieren.
Dieser Block unterstützt viele der gleichen Eigenschaften wie HPA-Skalierungsrichtlinien von Kubernetes.
Wenn Sie keinen behavior
-Block angeben, wird die folgende Standardkonfiguration verwendet:
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
Um das Secret-Volume zu erstellen, das unter deployment bereitgestellt wird, kopieren Sie die Konfiguration in eine Datei mit dem Namen scaling_config.yaml
und führen Sie dann Folgendes aus:
gcloud secrets create SCALING_CONFIG_SECRET_NAME --data-file=scaling_config.yaml
Ersetzen Sie SCALING_CONFIG_SECRET_NAME durch den Namen des Skalierungs-Secrets.
Kafka-Autoscaler bereitstellen
Nachdem Sie die Voraussetzungen erfüllt haben, können Sie den Kafka-Autoscaler-Dienst und die zugehörige Infrastruktur bereitstellen. Ein Terraform-Modul und ein Shell-Script sind verfügbar, um diesen Prozess zu vereinfachen.
gcloud
In diesem Abschnitt werden alle gcloud-Befehle beschrieben, die für die manuelle Bereitstellung des Autoscalers erforderlich sind. In den meisten Fällen empfehlen wir stattdessen die Verwendung des Shell-Skripts oder des Terraform-Moduls.
Dienstkonto erstellen
Die Anforderungen an Dienstkonten hängen vom konfigurierten Autoscaling-Prüfintervall ab. Sie können das Kafka-Autoscaling so konfigurieren, dass Autoscaling-Prüfungen in flexiblen Intervallen durchgeführt werden:
- Eine Minute oder länger: Cloud Scheduler löst die Autoscaling-Prüfung im ausgewählten Intervall mit einer POST-Anfrage aus.
Weniger als eine Minute: Cloud Scheduler löst die Erstellung mehrerer Cloud Tasks pro Minute aus, basierend auf der konfigurierten Häufigkeit.
Eine oder mehrere Minuten
Kafka-Autoscaler-Dienstkonto
Erstellen Sie ein Dienstkonto für den Kafka-Autoscaler:
gcloud iam service-accounts create SCALER_SERVICE_ACCOUNT
Ersetzen Sie SCALER_SERVICE_ACCOUNT durch den Namen des Dienstkontos für den Kafka-Autoscaler.
Für das Kafka-Autoscaling sind die folgenden Berechtigungen erforderlich, um die Anzahl der Kafka-Consumer-Instanzen zu aktualisieren:
iam.serviceaccounts.actAs
für das Kafka-Nutzerdienstkonto.roles/artifactregistry.reader
für das Repository, das das Kafka-Consumer-Image enthält.run.workerpools.get
undrun.workerpools.update
. Diese Berechtigungen sind in der Rolle Cloud Run-Administrator (roles/run.admin
) enthalten.roles/secretmanager.secretAccessor
für die Secrets für die Skalierung und die Kafka-Authentifizierung.roles/monitoring.viewer
für das Kafka-Nutzerprojekt. Diese Rolle ist erforderlich, um Messwerte zur CPU-Auslastung zu lesen.roles/monitoring.metricWriter
für das Kafka-Nutzerprojekt. Diese Rolle ist optional, ermöglicht es dem Autoscaler aber, benutzerdefinierte Messwerte für eine bessere Beobachtbarkeit auszugeben.
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
Ersetzen Sie Folgendes:
- PROJECT_ID: die Projekt-ID, in der sich der Kafka-Autoscaler-Dienst befindet.
- CONSUMER_SERVICE_ACCOUNT_EMAIL: die E-Mail-Adresse des Dienstkontos für den Kafka-Consumer. Beispiel:
example@PROJECT-ID.iam.gserviceaccount.com
- SCALER_SERVICE_ACCOUNT: das Dienstkonto für den Kafka-Autoscaler.
- ADMIN_CLIENT_SECRET_NAME: der Name des Kafka-Authentifizierungs-Secrets.
- SCALING_CONFIG_SECRET_NAME: der Name des Skalierungs-Secrets.
- CONSUMER_IMAGE_REPO: Die ID oder voll qualifizierte Kennzeichnung für das Repository mit dem Container-Image für den Kafka-Consumer.
- REPO_REGION: der Speicherort des Image-Repositorys des Nutzers.
Weniger als eine Minute
Cloud Tasks einrichten
Cloud Scheduler kann nur in Intervallen von einer Minute oder mehr ausgelöst werden. Verwenden Sie für Intervalle von weniger als einer Minute Cloud Tasks, um das Kafka-Autoscaling auszulösen. Für die Einrichtung von Cloud Tasks ist Folgendes erforderlich:
- Cloud Tasks-Warteschlange für die Autoscaling-Prüfaufgaben erstellen
- Erstellen Sie das Dienstkonto, das von Cloud Tasks zum Aufrufen des Kafka-Autoscalers verwendet wird, mit der Rolle 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"
Ersetzen Sie Folgendes:
- CLOUD_TASKS_QUEUE_NAME: die konfigurierte Cloud Tasks-Warteschlange zum Auslösen von Autoscaling-Prüfungen.
- TASKS_SERVICE_ACCOUNT: Das Dienstkonto, das Cloud Tasks zum Auslösen von Autoscaling-Prüfungen verwenden soll.
- SCALER_SERVICE_NAME: Der Name Ihres Kafka-Autoscaling-Dienstes.
- PROJECT_ID: die Projekt-ID für den Kafka-Autoscaler-Dienst.
- REGION: Der Standort des Kafka-Autoscaler-Dienstes.
Kafka-Autoscaler-Dienstkonto einrichten
Erstellen Sie ein Dienstkonto für den Kafka-Autoscaler:
gcloud iam service-accounts create SCALER_SERVICE_ACCOUNT
Ersetzen Sie SCALER_SERVICE_ACCOUNT durch den Namen des Dienstkontos für den Kafka-Autoscaler.
Zum Aktualisieren der Anzahl der Kafka-Consumer-Instanzen und zum Erstellen von Aufgaben für Autoscaling-Prüfungen benötigt der Kafka-Autoscaler die folgenden Berechtigungen:
iam.serviceaccounts.actAs
für das Kafka-Nutzerdienstkonto.roles/artifactregistry.reader
für das Repository, das das Kafka-Consumer-Image enthältrun.workerpools.get
undrun.workerpools.update
. Diese Berechtigungen sind in der Rolle Cloud Run-Administrator (roles/run.admin
) enthalten.roles/secretmanager.secretAccessor
für beide Secrets für die Skalierung und die Kafka-Authentifizierung.roles/monitoring.viewer
für das Kafka-Nutzerprojekt. Diese Rolle ist erforderlich, um Messwerte zur CPU-Auslastung zu lesen.roles/monitoring.metricWriter
für das Kafka-Nutzerprojekt. Diese Rolle ist optional, ermöglicht es dem Autoscaler aber, benutzerdefinierte Messwerte für eine bessere Beobachtbarkeit auszugeben.- Cloud Tasks-Ersteller-Rolle (
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
Ersetzen Sie Folgendes:
- PROJECT_ID: die Projekt-ID, in der sich der Kafka-Autoscaler-Dienst befindet.
- CONSUMER_SERVICE_ACCOUNT_EMAIL: die E-Mail-Adresse des Dienstkontos für den Kafka-Consumer. Beispiel:
example@PROJECT_ID.iam.gserviceaccount.com
- SCALER_SERVICE_ACCOUNT: das Dienstkonto für den Kafka-Autoscaler.
- CONSUMER_IMAGE_REPO: Die ID oder die vollständig qualifizierte Kennzeichnung für das Repository mit dem Container-Image für den Kafka-Consumer.
- ADMIN_CLIENT_SECRET_NAME: der Name des Kafka-Authentifizierungs-Secrets.
- SCALING_CONFIG_SECRET_NAME: der Name des Skalierungs-Secrets.
- REPO_REGION: der Speicherort des Image-Repositorys des Nutzers.
- CLOUD_TASKS_QUEUE_NAME: die konfigurierte Cloud Tasks-Warteschlange zum Auslösen von Autoscaling-Prüfungen.
- REGION: Der Standort des Kafka-Autoscaler-Dienstes.
Umgebungsvariablen konfigurieren
Eine oder mehrere Minuten
Der Kafka-Autoscaler verwendet Umgebungsvariablen, um den Kafka-Consumer und andere Aspekte der Zielarbeitslast anzugeben. Aus Sicherheitsgründen empfehlen wir, vertrauliche Informationen als Secrets zu konfigurieren.
Erstellen Sie eine YAML-Datei mit dem Namen scaler_env_vars.yaml
mit den folgenden Variablen:
KAFKA_TOPIC_ID: KAFKA_TOPIC_ID CONSUMER_GROUP_ID: CONSUMER_GROUP_ID CYCLE_SECONDS: CYCLE_SECONDS OUTPUT_SCALER_METRICS: OUTPUT_SCALER_METRICS
Ersetzen Sie Folgendes:
- KAFKA_TOPIC_ID: Die Themen-ID, die von den Kafka-Consumern abonniert wird.
- CONSUMER_GROUP_ID: Die Nutzergruppen-ID, die vom Ziel-Kafka-Consumer verwendet wird. Diese Werte müssen übereinstimmen, da das Autoscaling sonst fehlschlägt.
- CYCLE_SECONDS: Der Autoscaler-Zykluszeitraum in Sekunden.
- OUTPUT_SCALER_METRICS: Die Einstellung zum Aktivieren von Messwerten. Legen Sie den Wert auf
true
fest, um die Ausgabe benutzerdefinierter Messwerte zu aktivieren, oder auffalse
, wenn dies nicht der Fall ist.
Weniger als eine Minute
Der Kafka-Autoscaler verwendet Umgebungsvariablen, um den Kafka-Consumer und andere Aspekte der Zielarbeitslast anzugeben. Aus Sicherheitsgründen empfehlen wir, vertrauliche Informationen als Secrets zu konfigurieren.
Erstellen Sie eine YAML-Datei mit dem Namen scaler_env_vars.yaml
mit den folgenden Variablen:
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
Ersetzen Sie Folgendes:
- KAFKA_TOPIC_ID: Die Themen-ID, die von den Kafka-Consumern abonniert wird.
- CONSUMER_GROUP_ID: Die Nutzergruppen-ID, die vom Ziel-Kafka-Consumer verwendet wird. Diese Werte müssen übereinstimmen, da das Autoscaling sonst fehlschlägt.
- CYCLE_SECONDS: Der Autoscaler-Zykluszeitraum in Sekunden.
- OUTPUT_SCALER_METRICS: Die Einstellung zum Aktivieren von Messwerten. Legen Sie den Wert auf
true
fest, um die Ausgabe benutzerdefinierter Messwerte zu aktivieren, oder auffalse
, um sie zu deaktivieren. - CLOUD_TASKS_QUEUE_NAME: der vollständig qualifizierte Name der Cloud Tasks-Warteschlange zum Auslösen von Autoscaling-Prüfungen. Sie hat folgendes Format:
projects/$PROJECT_ID/locations/$REGION/queues/$CLOUD_TASKS_QUEUE_NAME
. - TASKS_SERVICE_ACCOUNT_EMAIL: Das Dienstkonto, das Cloud Tasks zum Auslösen von Autoscaling-Prüfungen verwenden soll. Beispiel:
example@PROJECT_ID.iam.gserviceaccount.com
Stellen Sie den Kafka-Autoscaler mit dem bereitgestellten Image bereit und stellen Sie mit der Datei scaler_env_vars.yaml
und Secret-Volume-Mounts eine Verbindung zur Kafka-VPC her:
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
Ersetzen Sie Folgendes:
- SCALER_IMAGE_URI: der URI für das Kafka-Autoscaler-Image.
- SCALER_SERVICE_NAME: Der Name Ihres Kafka-Autoscaling-Dienstes.
- SCALER_SERVICE_ACCOUNT: der Name des Dienstkontos für das Kafka-Autoscaling.
- PROJECT_ID: die Projekt-ID für den Kafka-Autoscaler-Dienst.
- KAFKA_VPC_NETWORK: Das VPC-Netzwerk, das mit dem Kafka-Cluster verbunden ist.
- KAFKA_VPC_SUBNET: das VPC-Subnetz, das mit dem Kafka-Cluster verbunden ist.
- ADMIN_CLIENT_SECRET_NAME: der Name des Kafka-Authentifizierungs-Secrets.
- SCALING_CONFIG_SECRET_NAME: der Name des Skalierungs-Secrets.
Regelmäßige Autoscaling-Prüfungen einrichten
In diesem Abschnitt verwenden Sie Cloud Scheduler, um regelmäßige Prüfungen der automatischen Skalierung auszulösen:
- Eine Minute oder länger: Konfigurieren Sie Cloud Scheduler so, dass der Trigger im ausgewählten Intervall ausgelöst wird.
- Weniger als eine Minute: Cloud Scheduler so konfigurieren, dass der Trigger jede Minute ausgelöst wird
Aufrufer-Dienstkonto erstellen
Damit Cloud Scheduler den Kafka-Autoscaler aufrufen kann, müssen Sie ein Dienstkonto mit der Rolle „Invoker“ (roles/run.invoker
) für den Kafka-Autoscaler-Dienst erstellen:
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"
Ersetzen Sie Folgendes:
- SCALER_SERVICE_NAME: Der Name Ihres Kafka-Autoscaling-Dienstes.
- SCALER_INVOKER_SERVICE_ACCOUNT: der Name des aufrufenden Dienstkontos.
- PROJECT_ID: die Projekt-ID für den Kafka-Autoscaler-Dienst.
Cloud Scheduler-Job erstellen
Eine oder mehrere Minuten
Erstellen Sie einen Cloud Scheduler-Job mit dem ausgewählten Autoscaling-Prüfintervall:
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
Ersetzen Sie Folgendes:
- SCALER_SERVICE_NAME: Der Name Ihres Kafka-Autoscaling-Dienstes.
- SCALER_INVOKER_SERVICE_ACCOUNT: der Name des aufrufenden Dienstkontos.
- PROJECT_ID: die Projekt-ID oder der Kafka-Autoscaler-Dienst.
- PROJECT_NUMBER: die Projektnummer für den Kafka-Autoscaler-Dienst.
- REGION: Der Standort des Kafka-Autoscaler-Dienstes.
- TIMEZONE: Die Zeitzone, z. B.
America/Los_Angeles
. - CRON_SCHEDULE: Der ausgewählte Zeitplan im Crontab-Format. Beispiel: jede Minute:
"* * * * *"
.
Weniger als eine Minute
Cloud Scheduler-Job erstellen, der jede Minute ausgeführt wird:
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
Ersetzen Sie Folgendes:
- SCALER_SERVICE_NAME: Der Name Ihres Kafka-Autoscaling-Dienstes.
- SCALER_INVOKER_SERVICE_ACCOUNT: der Name des aufrufenden Dienstkontos.
- PROJECT_ID: die Projekt-ID des Kafka-Autoscaler-Dienstes.
- PROJECT_NUMBER: die Projektnummer für den Kafka-Autoscaler-Dienst.
- REGION: Der Standort des Kafka-Autoscaler-Dienstes.
- TIMEZONE: Die Zeitzone, z. B.
America/Los_Angeles
.
Terraform
Das Verzeichnis terraform/
enthält ein wiederverwendbares Terraform-Modul, mit dem Sie den Kafka-Autoscaler und die zugehörigen Ressourcen bereitstellen können.
In diesem Modul wird die Erstellung der folgenden Elemente automatisiert:
- Der Cloud Run-Dienst für die automatische Skalierung von Kafka
- Unterstützung von Dienstkonten und IAM-Bindungen
- Cloud Tasks-Warteschlange
- Cloud Scheduler-Job
Eine detaillierte Anleitung, Anwendungsbeispiele und Beschreibungen aller Ein- und Ausgabevariablen finden Sie in der terraform readme
.
Sie müssen dem Terraform-Modul die erforderlichen Variablen zur Verfügung stellen, einschließlich Details aus den Voraussetzungen wie Projekt-ID, Region, E-Mail-Adresse des Consumer-Dienstkontos, geheime Namen, Skalierer-Image-Pfad und Themen-ID.
shell
Ein setup_kafka_scaler.sh
-Skript wird mit dem Autoscaler bereitgestellt, um alle erforderlichen Ressourcen automatisch zu erstellen und zu konfigurieren.
Umgebungsvariablen festlegen
Bevor Sie das Skript ausführen, müssen Sie alle erforderlichen Umgebungsvariablen festlegen:
# 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).
Ersetzen Sie Folgendes:
- PROJECT_ID: die Projekt-ID, in der sich der Kafka-Autoscaler-Dienst befindet.
- REGION: Der Standort des Kafka-Autoscaler-Dienstes.
- DEPLOYED_KAFKA_CONSUMER: Der Name des Kafka-Consumers.
- KAFKA_CONSUMER_ACCOUNT_EMAIL: die E-Mail-Adresse des Dienstkontos für den Kafka-Consumer.
- KAFKA_TOPIC_ID: Die Themen-ID, die von den Kafka-Consumern abonniert wird.
- KAFKA_CONSUMER_GROUP_ID: Die Nutzergruppen-ID, die vom Ziel-Kafka-Consumer verwendet wird. Diese Werte müssen übereinstimmen, da das Autoscaling sonst fehlschlägt.
- VPC_NETWORK: das VPC-Netzwerk, das mit dem Kafka-Cluster verbunden ist.
- VPC_SUBNET: das VPC-Subnetz, das mit dem Kafka-Cluster verbunden ist.
- CLOUD_TASKS_QUEUE_FOR_SCALING_CHECKS: die konfigurierte Cloud Tasks-Warteschlange zum Auslösen von Autoscaling-Prüfungen.
- TASKS_SERVICE_ACCOUNT_NAME: Das Dienstkonto, das Cloud Tasks zum Auslösen von Autoscaling-Prüfungen verwenden soll.
- KAFKA_AUTOSCALER_SERVICE_NAME: Der Name Ihres Kafka-Autoscaling-Dienstes.
- KAFKA_AUTOSCALER_IMAGE_URI: der URI für das Kafka-Autoscaler-Image.
- KAFKA_AUTOSCALER_CONFIG_SECRET_NAME: der Name des Skalierungs-Secrets.
- SCALER_CHECK_FREQUENCY: Der Autoscaler-Zykluszeitraum in Sekunden.
Setup-Skript ausführen
Führen Sie das bereitgestellte setup_kafka_scaler.sh
-Skript aus:
./setup_kafka_scaler.sh
Das Skript führt die folgenden Aktionen aus:
- Erstellt die Cloud Tasks-Warteschlange, mit der Autoscaling-Prüfungen ausgelöst werden.
- Erstellt das Kafka-Autoscaler-Dienstkonto und gewährt die erforderlichen Berechtigungen.
- Konfiguriert und stellt das Kafka-Autoscaling bereit.
- Erstellt den Cloud Scheduler-Job, der regelmäßig Autoscaling-Prüfungen auslöst.
Wenn das setup_kafka_scaler.sh
-Skript ausgeführt wird, gibt es die konfigurierten Umgebungsvariablen aus. Prüfen Sie, ob die Umgebungsvariablen korrekt sind, bevor Sie fortfahren.
Zusätzliche Berechtigungen erteilen
Wenn Sie die Anzahl der Instanzen des Kafka-Consumers ändern möchten, muss das Dienstkonto des Kafka-Autoscalers die Berechtigung zum Aufrufen des bereitgestellten Containerbilds haben. Wenn das Consumer-Image beispielsweise aus Artifact Registry bereitgestellt wurde, führen Sie den folgenden Befehl aus:
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
Prüfen, ob das automatische Skalieren von Kafka funktioniert
Die Skalierung des Kafka-Autoscaler-Dienstes wird durch eine Anfrage an die Dienst-URL (SCALER_SERVICE_NAME-
PROJECT_NUMBER.
REGION.run.app
) ausgelöst.
Sie können eine POST
-Anfrage an den Kafka-Autoscaler-Dienst senden, um die Autoscaling-Berechnung auszulösen:
curl -X POST -H "Authorization: Bearer $(gcloud auth print-identity-token)" https://SCALER_SERVICE_NAME-PROJECT_NUMBER.REGION.run.app
Ersetzen Sie Folgendes:
- SCALER_SERVICE_NAME: Der Name Ihres Kafka-Autoscaling-Dienstes.
- PROJECT_NUMBER: die Projektnummer für den Kafka-Autoscaler-Dienst.
- REGION: Der Standort des Kafka-Autoscaler-Dienstes.
POST
-Anfragen lösen die Autoscaling-Berechnung aus, die in den Logs ausgegeben wird, und ändern die Anzahl der Instanzen basierend auf der Empfehlung.
Die Logs Ihres Kafka-Autoscaler-Dienstes sollten Nachrichten wie [SCALING] Recommended instances X
enthalten.
Wenn das Flag OUTPUT_SCALER_METRICS
aktiviert ist, finden Sie die Cloud Monitoring-Messwerte für Skalierer auch unter custom.googleapis.com/cloud-run-kafkascaler
.
Erweiterte Skalierungskonfiguration
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]
In der folgenden Liste werden einige der vorherigen Elemente beschrieben:
scaleDown
: Das Verhalten beim Reduzieren der Anzahl der Instanzen (Herunterskalieren).scaleUp
: Das Verhalten beim Erhöhen der Anzahl der Instanzen (Hochskalierung).stabilizationWindowSeconds
: Die höchste (scaleDown
) oder niedrigste (scaleUp
) berechnete Anzahl von Instanzen über einen rollierenden Zeitraum. Wenn Sie den Wert auf0
festlegen, wird der zuletzt berechnete Wert verwendet.selectPolicy
: Das Ergebnis, das erzwungen werden soll, wenn mehrere Richtlinien konfiguriert sind.Min
: die kleinste ÄnderungMax
: die größte ÄnderungPercent
: Die Änderungen pro Zeitraum sind auf den konfigurierten Prozentsatz der Gesamtanzahl der Instanzen begrenzt.Instances
: Die Änderungen pro Zeitraum sind auf die konfigurierte Anzahl von Instanzen beschränkt.periodSeconds
: Der Zeitraum, in dem die Richtlinie durchgesetzt wird.
Die vollständige Spezifikation mit der Standardkonfiguration sieht beispielsweise so aus:
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