GKE-Arbeitslasten mit HPA auf null skalieren und von null skalieren

In dieser Anleitung erfahren Sie, wie Sie die Ressourcennutzung in Google Kubernetes Engine (GKE) optimieren, indem Sie Arbeitslasten so konfigurieren, dass sie bei Inaktivität automatisch auf null Replikate skaliert und bei steigender Nachfrage wieder hochskaliert werden. Bei diesem Ansatz wird der horizontale Pod-Autoscaler (HPA) in die verwaltete Autoscaling-Infrastruktur von GKE integriert, um die Skalierung anhand externer Messwerte zu verwalten.

Konfigurieren Sie Ihre Bereitstellung so, dass sie auf null skaliert wird. Setzen Sie dazu den Wert des Felds minReplicas auf 0 und definieren Sie einen Messwert mit dem Typ External oder Object in Ihrem HPA-Manifest. GKE überwacht diese Messwerte über die benutzerdefinierte Ressource AutoscalingMetric, um eine effiziente Ressourcenverwaltung für Ihre Anwendungen zu gewährleisten.

Mit dieser Konfiguration müssen Sie keine Drittanbieter-Messwertadapter wie KEDA verwenden, um GKE-Arbeitslasten zu skalieren. Bei dieser Lösung werden die Aufnahme von Messwerten und Empfehlungen zur Skalierung direkt in der GKE-Steuerungsebene verwaltet, wodurch der Aufwand für die Clusterverwaltung reduziert wird.

In dieser Anleitung stellen Sie eine Beispielanwendung für asynchrone Worker bereit, die Nachrichten aus einer Pub/Sub-Warteschlange verarbeitet. Sie konfigurieren einen horizontalen Pod-Autoscaler, um die Warteschlangentiefe (pubsub.googleapis.com:num_undelivered_messages) mit einer benutzerdefinierten AutoscalingMetric-Ressource zu überwachen:

  • Wenn Nachrichten im Abo eingehen:GKE skaliert Worker-Pods hoch, um die Warteschlange zu verarbeiten.
  • Wenn die Warteschlange leer ist:GKE skaliert die Worker-Bereitstellung automatisch auf null Replikate herunter.

Diese Anleitung richtet sich an Anwendungsentwickler, Plattformadministratoren und ‑operatoren sowie DevOps-Experten, die die Ressourcennutzung in GKE optimieren möchten, indem sie Arbeitslasten auf null skalieren, wenn sie im Leerlauf sind.

Hinweise

Bevor Sie Arbeitslasten für die Skalierung auf null konfigurieren, sollten Sie die folgenden Aspekte berücksichtigen:

  • Wenn Sie Arbeitslasten mit HPA auf null und von null skalieren möchten, muss auf der Steuerungsebene und den Knoten des GKE-Clusters die Version 1.37 oder höher ausgeführt werden. Dies gilt sowohl für neue als auch für aktualisierte vorhandene Cluster. Wenn Sie einen vorhandenen Cluster verwenden, prüfen Sie seine Version oder führen Sie ein Upgrade des Clusters oder seiner Knoten auf Version 1.37 oder höher durch.
  • Ihr HPA-Manifest muss die apiVersion: autoscaling/v2-Konfiguration verwenden, um die minReplicas: 0-Einstellung und externe Messwerte zu unterstützen.
  • Bevor Sie Knotenpools auf eine Version vor 1.37 downgraden, aktualisieren Sie alle HPA-Manifeste, die für das Skalieren auf und von null konfiguriert sind, indem Sie das Feld minReplicas auf 1 oder höher festlegen. Versionen vor 1.37 unterstützen die Einstellung minReplicas: 0 nicht. Das kann dazu führen, dass Arbeitslasten bei null Replikaten hängen bleiben.
  • Sie müssen mindestens einen External- oder Object-Messwert (z. B. eine Warteschlangentiefe) in Ihrem horizontalen Pod-Autoscaler konfigurieren. GKE kann keine CPU- oder Arbeitsspeicher-Messwerte (Resource) erfassen, wenn eine Arbeitslast keine Pods hat. Daher können Ressourcenmesswerte allein kein Hochskalieren von null auslösen.
  • Der AutoscalingMetric, der HorizontalPodAutoscaler und die Zielbereitstellung müssen sich im selben Kubernetes-Namespace befinden.

Hinweis

  1. Melden Sie sich in Ihrem Google Cloud -Konto an. Wenn Sie mit Google Cloudnoch nicht vertraut sind, erstellen Sie ein Konto, um die Leistungsfähigkeit unserer Produkte in der Praxis sehen und bewerten zu können. Neukunden erhalten außerdem ein Guthaben von 300 $, um Arbeitslasten auszuführen, zu testen und bereitzustellen.
  2. Installieren Sie die Google Cloud CLI.

  3. Wenn Sie einen externen Identitätsanbieter (IdP) verwenden, müssen Sie sich zuerst mit Ihrer föderierten Identität in der gcloud CLI anmelden.

  4. Führen Sie den folgenden Befehl aus, um die gcloud CLI zu initialisieren:

    gcloud init
  5. Erstellen Sie ein Google Cloud Projekt oder wählen Sie eines aus.

    Rollen, die zum Auswählen oder Erstellen eines Projekts erforderlich sind

    • Projekt auswählen: Für die Auswahl eines Projekts ist keine bestimmte IAM-Rolle erforderlich. Sie können jedes Projekt auswählen, für das Ihnen eine Rolle zugewiesen wurde.
    • Projekt erstellen: Zum Erstellen eines Projekts benötigen Sie die Rolle „Projektersteller“ (roles/resourcemanager.projectCreator), die die Berechtigung resourcemanager.projects.create enthält. Weitere Informationen zum Zuweisen von Rollen
    • So erstellen Sie ein Google Cloud Projekt:

      gcloud projects create PROJECT_ID

      Ersetzen Sie PROJECT_ID durch einen Namen für das Google Cloud Projekt, das Sie erstellen.

    • Wählen Sie das von Ihnen erstellte Google Cloud Projekt aus:

      gcloud config set project PROJECT_ID

      Ersetzen Sie PROJECT_ID durch den Namen Ihres Projekts in Google Cloud .

  6. Prüfen Sie, ob die Abrechnung für Ihr Google Cloud Projekt aktiviert ist.

  7. Aktivieren Sie die GKE- und Pub/Sub-APIs, falls sie noch nicht aktiviert sind:

    Rollen, die zum Aktivieren von APIs erforderlich sind

    Zum Aktivieren von APIs benötigen Sie die Berechtigung serviceusage.services.enable. Wenn Sie das Projekt erstellt haben, haben Sie diese Berechtigung wahrscheinlich bereits über die Rolle „Inhaber“ (roles/owner). Andernfalls können Sie diese Berechtigung über die Rolle „Service Usage-Administrator“ (roles/serviceusage.serviceUsageAdmin) erhalten. Informationen zum Zuweisen von Rollen

    gcloud services enable container.googleapis.com pubsub.googleapis.com
  8. Installieren Sie die Google Cloud CLI.

  9. Wenn Sie einen externen Identitätsanbieter (IdP) verwenden, müssen Sie sich zuerst mit Ihrer föderierten Identität in der gcloud CLI anmelden.

  10. Führen Sie den folgenden Befehl aus, um die gcloud CLI zu initialisieren:

    gcloud init
  11. Erstellen Sie ein Google Cloud Projekt oder wählen Sie eines aus.

    Rollen, die zum Auswählen oder Erstellen eines Projekts erforderlich sind

    • Projekt auswählen: Für die Auswahl eines Projekts ist keine bestimmte IAM-Rolle erforderlich. Sie können jedes Projekt auswählen, für das Ihnen eine Rolle zugewiesen wurde.
    • Projekt erstellen: Zum Erstellen eines Projekts benötigen Sie die Rolle „Projektersteller“ (roles/resourcemanager.projectCreator), die die Berechtigung resourcemanager.projects.create enthält. Weitere Informationen zum Zuweisen von Rollen
    • So erstellen Sie ein Google Cloud Projekt:

      gcloud projects create PROJECT_ID

      Ersetzen Sie PROJECT_ID durch einen Namen für das Google Cloud Projekt, das Sie erstellen.

    • Wählen Sie das von Ihnen erstellte Google Cloud Projekt aus:

      gcloud config set project PROJECT_ID

      Ersetzen Sie PROJECT_ID durch den Namen Ihres Projekts in Google Cloud .

  12. Prüfen Sie, ob die Abrechnung für Ihr Google Cloud Projekt aktiviert ist.

  13. Aktivieren Sie die GKE- und Pub/Sub-APIs, falls sie noch nicht aktiviert sind:

    Rollen, die zum Aktivieren von APIs erforderlich sind

    Zum Aktivieren von APIs benötigen Sie die Berechtigung serviceusage.services.enable. Wenn Sie das Projekt erstellt haben, haben Sie diese Berechtigung wahrscheinlich bereits über die Rolle „Inhaber“ (roles/owner). Andernfalls können Sie diese Berechtigung über die Rolle „Service Usage-Administrator“ (roles/serviceusage.serviceUsageAdmin) erhalten. Informationen zum Zuweisen von Rollen

    gcloud services enable container.googleapis.com pubsub.googleapis.com

Erforderliche Rollen

Bitten Sie Ihren Administrator, Ihnen die folgenden IAM-Rollen für Ihr Projekt zuzuweisen, um die Berechtigungen zu erhalten, die Sie zum Ausführen dieser Anleitung benötigen:

Weitere Informationen zum Zuweisen von Rollen finden Sie unter Zugriff auf Projekte, Ordner und Organisationen verwalten.

Sie können die erforderlichen Berechtigungen auch über benutzerdefinierte Rollen oder andere vordefinierte Rollen erhalten.

Umgebung einrichten

Der Einfachheit halber werden in den Befehlen in dieser Anleitung alle Ressourcen (der GKE-Cluster sowie das Pub/Sub-Thema und -Abo) in einem einzigen Google Cloud ProjektPROJECT_IDerstellt.

So richten Sie Ihre Umgebung ein:

  1. Legen Sie Umgebungsvariablen fest:

    export PROJECT_ID=PROJECT_ID
    export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format 'get(projectNumber)')
    export LOCATION=LOCATION
    

    Ersetzen Sie Folgendes:

    • PROJECT_ID: Ihre Google Cloud Projekt-ID.
    • LOCATION: Die Region oder Zone, in der Sie Ihren GKE-Cluster erstellen möchten, z. B. us-central1. Geben Sie für Autopilot-Cluster eine Region an.
  2. Erstellen Sie einen GKE-Cluster mit Version 1.37 oder höher und aktivierter Workload Identity Federation for GKE. Für eine vollständig verwaltete Kubernetes-Umgebung und zur Maximierung der Kosteneinsparungen, wenn Arbeitslasten auf null skaliert werden, empfehlen wir die Verwendung eines Autopilot-Clusters. Informationen zum Auswählen des Betriebsmodus, der für Ihre Arbeitslasten am besten geeignet ist, finden Sie unter GKE-Betriebsmodus auswählen:

    Autopilot

    Autopilot-Cluster erstellen:

    gcloud container clusters create-auto scale-to-zero \
        --project=${PROJECT_ID} \
        --location=${LOCATION}
    

    Die Workload Identity-Föderation für GKE ist in Autopilot-Clustern standardmäßig aktiviert.

    Standard

    Erstellen Sie einen Standard-Cluster mit aktivierter Workload Identity Federation for GKE:

    gcloud container clusters create scale-to-zero \
        --project=${PROJECT_ID} \
        --location=${LOCATION} \
        --workload-pool=${PROJECT_ID}.svc.id.goog
    
  3. Konfigurieren Sie kubectl für die Kommunikation mit Ihrem Cluster:

    gcloud container clusters get-credentials scale-to-zero \
        --project=${PROJECT_ID} \
        --location=${LOCATION}
    

Pub/Sub-Ressourcen erstellen

In dieser Anleitung wird die Pub/Sub-Warteschlangentiefe als Beispiel für eine externe Messwertquelle verwendet.

So erstellen Sie ein Pub/Sub-Thema und ‑Abo:

  1. Pub/Sub-Thema erstellen

    gcloud pubsub topics create my-worker-topic \
        --project=${PROJECT_ID}
    
  2. Erstellen Sie ein Abo, das an das Thema angehängt ist:

    gcloud pubsub subscriptions create my-worker-subscription \
        --topic=my-worker-topic \
        --project=${PROJECT_ID}
    

Workload Identity Federation für GKE einrichten

Konfigurieren Sie Workload Identity Federation for GKE, damit sich Ihre Worker-Anwendung bei Google Cloud -APIs authentifizieren und Nachrichten aus Pub/Sub empfangen kann.

GKE übernimmt automatisch die Authentifizierung bei Cloud Monitoring für AutoscalingMetric-Ressourcen im selben Projekt. Weitere Informationen zum Definieren von Messwerten für das Autoscaling finden Sie unter Benutzerdefinierte oder externe Messwerte aus Cloud Monitoring abrufen.

So konfigurieren Sie die Workload Identity Federation for GKE für Ihre Worker-Arbeitslast:

  1. Erstellen Sie ein Kubernetes-Dienstkonto für Ihre Worker-Anwendung im Namespace default:

    kubectl create serviceaccount async-worker-sa \
        --namespace default
    
  2. Weisen Sie dem Kubernetes-Dienstkonto die Rolle roles/pubsub.subscriber zu, damit die Anwendung Nachrichten aus Ihrem Pub/Sub-Abo empfangen kann:

    gcloud projects add-iam-policy-binding projects/${PROJECT_ID} \
        --role=roles/pubsub.subscriber \
        --member=principal://iam.googleapis.com/projects/${PROJECT_NUMBER}/locations/global/workloadIdentityPools/${PROJECT_ID}.svc.id.goog/subject/ns/default/sa/async-worker-sa
    

Weitere Informationen finden Sie unter Anwendungen für die Verwendung von Workload Identity Federation for GKE konfigurieren.

Beispiel-Deployment erstellen

Bevor Sie ein HPA-Objekt erstellen können, müssen Sie die zu überwachende Arbeitslast einrichten.

So erstellen Sie das Beispiel-Deployment:

  1. Speichern Sie das folgende Manifest als async-worker.yaml:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: async-worker
      namespace: default
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: async-worker
      template:
        metadata:
          labels:
            app: async-worker
        spec:
          containers:
          - name: async-worker
            image: nginx:latest
            ports:
            - containerPort: 80
            resources:
              limits:
                memory: 100Mi
              requests:
                cpu: 50m
                memory: 100Mi
    
  2. Wenden Sie das async-worker.yaml-Deployment an:

    kubectl apply -f async-worker.yaml
    

Arbeitslast für das Skalieren auf und von null konfigurieren

In diesem Abschnitt konfigurieren Sie die async-worker-Bereitstellung so, dass sie auf null skaliert wird, wenn die Pub/Sub-Warteschlange leer ist, und wieder hochskaliert wird, wenn neue Nachrichten eingehen.

AutoscalingMetric-Ressource erstellen

Erstellen Sie die benutzerdefinierte Ressource „AutoscalingMetric“, um das von GKE überwachte externe Signal zu definieren. Im folgenden Beispielmanifest fragt der Messwert Cloud Monitoring nach der Anzahl der nicht zugestellten Pub/Sub-Nachrichten für das Abo my-worker-subscription ab.

So erstellen Sie die AutoscalingMetric-Ressource:

  1. Speichern Sie das folgende Manifest als Datei pubsub-metric.yaml:

    apiVersion: autoscaling.gke.io/v1beta1
    kind: AutoscalingMetric
    metadata:
      name: pubsub-queue-depth
      namespace: default
    spec:
      metrics:
      - promql:
          name: pubsub-undelivered
          query: >
              {
                "pubsub.googleapis.com/subscription/num_undelivered_messages",
                subscription_id="my-worker-subscription"
              }
    
  2. Wenden Sie das pubsub-metric.yaml-Manifest an:

    kubectl apply -f pubsub-metric.yaml
    
  3. Prüfen Sie den Messwertstatus und rufen Sie die Messwert-ID ab:

    kubectl describe autoscalingmetric pubsub-queue-depth
    

    Prüfen Sie im Abschnitt Status der Ausgabe, ob Fehler aufgeführt sind, und notieren Sie sich den Wert Hpa Name im Format autoscaling.gke.io|CUSTOM_RESOURCE_NAME|METRIC_NAME. Sie verweisen auf diese externe Messwert-ID, wenn Sie im nächsten Abschnitt das HorizontalPodAutoscaler-Objekt erstellen. Wenn im Abschnitt Status Konfigurationsfehler gemeldet werden oder Messwerte nicht wie erwartet abgerufen werden, lesen Sie den Abschnitt Fehlerbehebung bei Messwerten, die für die automatische Skalierung abgerufen werden.

Horizontales Pod-Autoscaling konfigurieren

Wenn Sie das Autoscaling-Verhalten konfigurieren möchten, erstellen Sie eine HorizontalPodAutoscaler-Ressource, die auf das Deployment ausgerichtet ist.

So konfigurieren Sie das horizontale Pod-Autoscaling:

  1. Speichern Sie das folgende Manifest als Datei worker-hpa.yaml:

    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
      name: async-worker-hpa
      namespace: default
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: async-worker
      minReplicas: 0
      maxReplicas: 20
      metrics:
      - type: External
        external:
          metric:
            name: autoscaling.gke.io|pubsub-queue-depth|pubsub-undelivered
          target:
            type: AverageValue
            averageValue: "10"
    

    In diesem Manifest werden die folgenden Schlüsselfelder konfiguriert:

    • minReplicas: 0: Ermöglicht die Skalierung auf null, indem der Controller das Deployment auf 0 Replikate herunterskalieren kann, wenn die Nachfrage auf null sinkt.
    • type: External: Konfiguriert eine externe Messwertquelle, damit der HPA eine Aufskalierung auslösen kann, wenn die Arbeitslast keine Pods hat.
    • name: autoscaling.gke.io|pubsub-queue-depth|pubsub-undelivered: ordnet den HPA direkt der im vorherigen Schritt erstellten AutoscalingMetric-Ressource zu, indem das autoscaling.gke.io|CUSTOM_RESOURCE_NAME|METRIC_NAME-Kennzeichnungsformat verwendet wird.
  2. Wenden Sie das worker-hpa.yaml-Manifest an:

    kubectl apply -f worker-hpa.yaml
    

Verhalten und Bedingungen für den Nullpunkt überprüfen

Wenn alle Nachrichten im Pub/Sub-Abo verarbeitet wurden, wertet der horizontale Pod-Autoscaler die Nachfrage von null aus und skaliert das Deployment auf 0 Replikate herunter.

Führen Sie den folgenden Befehl aus, um zu prüfen, ob der horizontale Pod-Autoscaler den Status „0“ aktiviert hat:async-worker-hpa

kubectl describe hpa async-worker-hpa

Die Ausgabe sieht etwa so aus:

Name:             async-worker-hpa
Namespace:        default
Reference:        Deployment/async-worker
Metrics:          ( current / target )
  "autoscaling.gke.io|pubsub-queue-depth|pubsub-undelivered" (external metric):  0 / 10
Min replicas:     0
Max replicas:     20
Deployment pods:  0 current / 0 desired
Conditions:
  Type            Status  Reason               Message
  ----            ------  ------               -------
  AbleToScale     True    SucceededGetScale    the HPA controller was able to get the target's current scale
  ScalingActive   True    ValidMetricFound     the HPA was able to successfully calculate a replica count from external metric
  ScaledToZero    True    ScaledToZero         the HPA has scaled the target resource to 0 replicas due to zero metric demand

ScaledToZero-Bedingung

Die Bedingung ScaledToZero gibt an, ob das horizontale Pod-Autoscaling die Arbeitslast auf null Replikate skaliert hat:

  • ScaledToZero: True (Reason: ScaledToZero): Gibt an, dass der HPA-Controller Ihre Arbeitslast erfolgreich auf 0 Replikate skaliert hat, da die Nachfrage nach externen Messwerten auf null gesunken ist. Die HPA bleibt aktiv (ScalingActive: True) und fragt GKE kontinuierlich ab, um zu erkennen, wann die Workload-Anforderungen steigen.
  • ScaledToZero: False: Gibt an, dass die Arbeitslast auf ein oder mehrere Replikate skaliert wurde.

Wenn Sie ein Deployment manuell auf null Replikate skalieren, z. B. mit dem Befehl kubectl scale --replicas=0, pausiert das HPA-Objekt das Autoscaling (ScalingActive: False), um widersprüchliche Änderungen zu verhindern. Wenn Sie das Autoscaling fortsetzen möchten, skalieren Sie das Deployment wieder auf ein oder mehrere Replikate (kubectl scale deployment async-worker --replicas=1).

Informationen zur Fehlerbehebung bei Szenarien, in denen Arbeitslasten nicht auf null skaliert werden oder nicht von null aufskaliert werden, finden Sie unter Fehlerbehebung bei der Skalierung von GKE-Arbeitslasten auf und von null mit HPA. Wenn das horizontale Pod-Autoscaling fehlende oder ungültige externe Messwerte meldet, lesen Sie den Abschnitt Fehlerbehebung bei Messwerten, die für das Autoscaling abgerufen werden.

Bereinigen

Mit den folgenden Schritten vermeiden Sie, dass Ihrem Google Cloud Konto die in dieser Anleitung verwendeten Ressourcen in Rechnung gestellt werden:

  1. Löschen Sie den GKE-Cluster:

    gcloud container clusters delete scale-to-zero \
        --project=${PROJECT_ID} \
        --location=${LOCATION}
    
  2. Löschen Sie das Pub/Sub-Abo und ‑Thema:

    gcloud pubsub subscriptions delete my-worker-subscription \
        --project=${PROJECT_ID}
    gcloud pubsub topics delete my-worker-topic \
        --project=${PROJECT_ID}
    

Nächste Schritte