Horizontales Pod-Autoscaling konfigurieren

Auf dieser Seite wird erläutert, wie Sie das horizontale Pod-Autoscaling (HPA) verwenden, um ein Deployment mithilfe verschiedener Arten von Messwerten automatisch zu skalieren. Sie können dieselben Richtlinien verwenden, um ein HPA für ein beliebiges skalierbares Deployment-Objekt zu konfigurieren.

Vorbereitung

Führen Sie die folgenden Aufgaben aus, bevor Sie beginnen:

Mit den folgenden Methoden können Sie die gcloud-Einstellungen festlegen:

  • Verwenden Sie gcloud init, wenn Sie die Standardeinstellungen ansehen möchten.
  • Verwenden Sie gcloud config, um Ihre Projekt-ID, Zone und Region individuell festzulegen.

gcloud init verwenden

Wenn Sie die Fehlermeldung One of [--zone, --region] must be supplied: Please specify location erhalten, führen Sie diesen Abschnitt aus.

  1. Führen Sie gcloud init aus und folgen Sie der Anleitung:

    gcloud init

    Wenn Sie SSH auf einem Remote-Server verwenden, können Sie mit dem Flag --console-only verhindern, dass mit dem Befehl ein Browserfenster geöffnet wird:

    gcloud init --console-only
  2. Folgen Sie der Anleitung, um gcloud zur Verwendung Ihres Google Cloud-Kontos zu autorisieren.
  3. Erstellen Sie eine neue Konfiguration oder wählen Sie eine vorhandene aus.
  4. Wählen Sie ein Google Cloud-Projekt aus.
  5. Wählen Sie eine Compute Engine-Standardzone aus.

gcloud config verwenden

  • Legen Sie Ihre standardmäßige Projekt-ID fest:
    gcloud config set project project-id
  • Wenn Sie mit zonalen Clustern arbeiten, legen Sie die Compute-Standardzone fest:
    gcloud config set compute/zone compute-zone
  • Wenn Sie mit regionalen Clustern arbeiten, legen Sie die Standardregion für Compute Engine fest:
    gcloud config set compute/region compute-region
  • Aktualisieren Sie gcloud auf die neueste Version:
    gcloud components update

API-Versionen für HPA-Objekte

Wenn Sie die Google Cloud Console verwenden, werden HPA-Objekte mit der autoscaling/v2beta2 API erstellt.

Wenn Sie kubectl verwenden, um Informationen zu einem HPA zu erstellen oder aufzurufen, können Sie entweder die autoscaling/v1 API oder die autoscaling/v2beta2 API angeben.

  • apiVersion: autoscaling/v1 ist die Standardeinstellung und ermöglicht Ihnen das Autoscaling ausschließlich auf Grundlage der CPU-Auslastung. Für das Autoscaling anhand anderer Messwerte wird die Verwendung von apiVersion: autoscaling/v2beta2 empfohlen. Im Beispiel unter Deployment konfigurieren wird apiVersion: autoscaling/v1 verwendet.

  • Zum Erstellen neuer HPA-Objekte wird apiVersion: autoscaling/v2beta2 empfohlen. Es ermöglicht das Autoscaling basierend auf mehreren Messwerten, einschließlich benutzerdefinierter oder externer Messwerte. Für alle anderen Beispiele in diesem Thema wird apiVersion: autoscaling/v2beta2 verwendet.

Welche API-Versionen unterstützt werden, erfahren Sie durch Verwendung des Befehls kubectl api-versions.

Beim Aufrufen der Details zu einem HPA, das apiVersion: autoscaling/v2beta2 verwendet, können Sie angeben, welche API genutzt werden soll.

Beispiel-Deployment erstellen

Zum Festlegen eines HPA müssen Sie die Arbeitslast einrichten, die überwacht werden soll. In den Beispielen dieses Themas kommen unterschiedliche HPA-Konfigurationen für das folgende nginx-Deployment zur Anwendung. In separaten Beispielen ist jeweils ein HPA zu sehen, das auf Ressourcennutzung, einem benutzerdefinierten oder externen Messwert und mehreren Messwerten beruht.

Speichern Sie Folgendes in einer Datei mit dem Namen nginx.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  namespace: default
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80
        resources:
          # You must specify requests for CPU to autoscale
          # based on CPU utilization
          requests:
            cpu: "250m"

Dieses Manifest gibt einen Wert für CPU-Anfragen an. Wenn Sie ein prozentuales Autoscaling basierend auf der Auslastung einer Ressource durchführen möchten, müssen Sie Anforderungen für diese Ressource angeben. Wenn Sie keine Anforderungen angeben, kann das Autoscaling nur basierend auf dem absoluten Wert der Ressourcenauslastung erfolgen, z. B. basierend auf MilliCPUs für die CPU-Auslastung.

Zum Erstellen des Deployments wenden Sie das Manifest nginx.yaml an:

kubectl apply -f nginx.yaml

Für das Deployment wurde spec.replicas auf 3 festgelegt, sodass drei Pods bereitgestellt werden. Sie können dies mit dem Befehl kubectl get deployment nginx überprüfen.

In jedem der Beispiele dieses Themas kommt ein anderes HPA für das Beispiel-Deployment nginx zur Anwendung.

Autoscaling auf Basis der Ressourcennutzung

In diesem Beispiel wird ein HPA-Objekt erstellt, um das nginx-Deployment automatisch zu skalieren, wenn die CPU-Auslastung 50 % überschreitet. Damit wird auch dafür gesorgt, dass immer mindestens ein Replikat und maximal zehn Replikate vorhanden sind.

Mit der Cloud Console, dem Befehl kubectl apply oder dem Befehl kubectl autoscale (nur für eine durchschnittliche CPU) können Sie ein HPA erstellen, dessen Ziel die CPU ist.

Console

  1. Rufen Sie in der Cloud Console das Menü "GKE-Arbeitslasten" auf.

    Zum Menü "GKE-Arbeitslasten"

  2. Klicken Sie auf den Namen des nginx-Deployments.

  3. Maximieren Sie das Menü Aktionen und wählen Sie Autoscaling aus.

  4. Geben Sie die folgenden Werte an:

    • Mindestanzahl von Pods: 1
    • Maximale Anzahl von Pods: 10
    • Ziel-CPU-Auslastung in Prozent: 50
  5. Klicken Sie auf Automatisch skalieren.

kubectl apply

Speichern Sie dieses YAML-Manifest als Datei mit dem Namen nginx-hpa.yaml:

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: nginx
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx
  minReplicas: 1
  maxReplicas: 10
  targetCPUUtilizationPercentage: 50

Verwenden Sie das Manifest mit dem folgenden Befehl, um das HPA zu erstellen:

kubectl apply -f nginx-hpa.yaml

kubectl autoscale

Sie können mit dem Befehl kubectl autoscale ein HPA-Objekt erstellen, dessen Ziel ausschließlich die durchschnittliche CPU-Auslastung ist:

kubectl autoscale deployment nginx --cpu-percent=50 --min=1 --max=10

Verwenden Sie zum Abrufen einer Liste der HPA-Objekte im Cluster diesen Befehl:

kubectl get hpa

Die Ausgabe sieht etwa so aus:

NAME    REFERENCE          TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
nginx   Deployment/nginx   0%/50%    1         10        3          61s

Details zum HPA erhalten Sie über die Cloud Console oder mit dem Befehl kubectl.

Console

  1. Rufen Sie in der Cloud Console das Menü "GKE-Arbeitslasten" auf.

    Zum Menü "GKE-Arbeitslasten"

  2. Klicken Sie auf den Namen des nginx-Deployments.

  3. Rufen Sie die HPA-Konfiguration im Abschnitt Autoscaling der Seite auf.

  4. Weitere Details zu Autoscaling-Ereignissen finden Sie im Tab Ereignisse.

kubectl get

Verwenden Sie kubectl get hpa mit dem Flag -o yaml, um Details zum HPA abzurufen. Das Feld status enthält Informationen zur aktuellen Anzahl von Replikaten und zu allen aktuellen Autoscaling-Ereignissen.

kubectl get hpa nginx -o yaml

Die Ausgabe sieht etwa so aus:

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  annotations:
    autoscaling.alpha.kubernetes.io/conditions: '[{"type":"AbleToScale","status":"True","lastTransitionTime":"2019-10-30T19:42:59Z","reason":"ScaleDownStabilized","message":"recent
      recommendations were higher than current one, applying the highest recent recommendation"},{"type":"ScalingActive","status":"True","lastTransitionTime":"2019-10-30T19:42:59Z","reason":"ValidMetricFound","message":"the
      HPA was able to successfully calculate a replica count from cpu resource utilization
      (percentage of request)"},{"type":"ScalingLimited","status":"False","lastTransitionTime":"2019-10-30T19:42:59Z","reason":"DesiredWithinRange","message":"the
      desired count is within the acceptable range"}]'
    autoscaling.alpha.kubernetes.io/current-metrics: '[{"type":"Resource","resource":{"name":"cpu","currentAverageUtilization":0,"currentAverageValue":"0"}}]'
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"autoscaling/v1","kind":"HorizontalPodAutoscaler","metadata":{"annotations":{},"name":"nginx","namespace":"default"},"spec":{"maxReplicas":10,"minReplicas":1,"scaleTargetRef":{"apiVersion":"apps/v1","kind":"Deployment","name":"nginx"},"targetCPUUtilizationPercentage":50}}
  creationTimestamp: "2019-10-30T19:42:43Z"
  name: nginx
  namespace: default
  resourceVersion: "220050"
  selfLink: /apis/autoscaling/v1/namespaces/default/horizontalpodautoscalers/nginx
  uid: 70d1067d-fb4d-11e9-8b2a-42010a8e013f
spec:
  maxReplicas: 10
  minReplicas: 1
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx
  targetCPUUtilizationPercentage: 50
status:
  currentCPUUtilizationPercentage: 0
  currentReplicas: 3
  desiredReplicas: 3

Löschen Sie das HPA, bevor Sie mit den restlichen Beispielen in diesem Thema fortfahren:

kubectl delete hpa nginx

Wenn Sie ein HPA löschen, bleibt die Anzahl der Replikate des Deployments erhalten. Der Zustand eines Deployments vor der Anwendung eines HPA wird nicht automatisch wiederhergestellt.

Weitere Informationen finden Sie unter Ein HPA löschen.

Autoscaling auf Basis eines benutzerdefinierten oder externen Messwerts

Sie können den Schritt-für-Schritt-Anleitungen folgen, um HPAs für benutzerdefinierte Messwerte und externe Messwerte zu erstellen.

Autoscaling auf Basis von mehreren Messwerten

In diesem Beispiel wird ein HPA erstellt, das ein Autoscaling basierend auf der CPU-Auslastung und einem benutzerdefinierten Messwert mit dem Namen packets_per_second vornimmt.

Wenn Sie sich an das vorherige Beispiel gehalten haben und noch immer ein HPA mit dem Namen nginx vorhanden ist, löschen Sie es, bevor Sie mit diesem Beispiel fortfahren.

Für dieses Beispiel ist apiVersion: autoscaling/v2beta2 erforderlich. Weitere Informationen zu den verfügbaren APIs finden Sie unter API-Versionen für HPA-Objekte.

Speichern Sie dieses YAML-Manifest als Datei mit dem Namen nginx-multiple.yaml.

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: nginx
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50
  - type: Resource
    resource:
      name: memory
      target:
        type: AverageValue
        averageValue: 100Mi
  # Uncomment these lines if you create the custom packets_per_second metric and
  # configure your app to export the metric.
  # - type: Pods
  #   pods:
  #     metric:
  #       name: packets_per_second
  #     target:
  #       type: AverageValue
  #       averageValue: 100

Wenden Sie das YAML-Manifest an:

kubectl apply -f nginx-multiple.yaml

Sobald das HPA erstellt wurde, erfolgt ein Monitoring des Deployments nginx auf durchschnittliche CPU-Auslastung, durchschnittliche Speichernutzung und zum benutzerdefinierten Messwert packets_per_second, sofern Sie zuvor die Kommentarzeichen entfernt haben. Das HPA skaliert das Deployment automatisch anhand des Messwerts, dessen Wert das umfassendere Autoscaling-Ereignis bestimmen würde.

Details zu einem HPA aufrufen

Verwenden Sie den folgenden Befehl, um die Konfiguration und Statistiken eines HPA anzuzeigen:

kubectl describe hpa hpa-name

Ersetzen Sie dabei hpa-name durch den Namen Ihres HorizontalPodAutoscaler-Objekts.

Wenn das HPA apiVersion: autoscaling/v2beta2 nutzt und auf mehreren Messwerten basiert, wird mit dem Befehl kubectl describe hpa nur der CPU-Messwert ausgegeben. Mit dem folgenden Befehl können Sie stattdessen alle Messwerte anzeigen lassen:

kubectl describe hpa.v2beta2.autoscaling hpa-name

Ersetzen Sie dabei hpa-name durch den Namen Ihres HorizontalPodAutoscaler-Objekts.

Der aktuelle Status jedes HPA wird im Feld Conditions angezeigt. Autoscaling-Ereignisse sind im Feld Events aufgeführt.

Die Ausgabe sieht etwa so aus:

Name:                                                  nginx
Namespace:                                             default
Labels:                                                <none>
Annotations:                                           kubectl.kubernetes.io/last-applied-configuration:
                                                         {"apiVersion":"autoscaling/v2beta2","kind":"HorizontalPodAutoscaler","metadata":{"annotations":{},"name":"nginx","namespace":"default"},"s...
CreationTimestamp:                                     Tue, 05 May 2020 20:07:11 +0000
Reference:                                             Deployment/nginx
Metrics:                                               ( current / target )
  resource memory on pods:                             2220032 / 100Mi
  resource cpu on pods  (as a percentage of request):  0% (0) / 50%
Min replicas:                                          1
Max replicas:                                          10
Deployment pods:                                       1 current / 1 desired
Conditions:
  Type            Status  Reason              Message
  ----            ------  ------              -------
  AbleToScale     True    ReadyForNewScale    recommended size matches current size
  ScalingActive   True    ValidMetricFound    the HPA was able to successfully calculate a replica count from memory resource
  ScalingLimited  False   DesiredWithinRange  the desired count is within the acceptable range
Events:                                                <none>

HPA löschen

Sie können ein HPA über die Cloud Console oder mit dem Befehl kubectl delete löschen.

Console

So löschen Sie das HPA nginx:

  1. Rufen Sie in der Cloud Console das Menü "GKE-Arbeitslasten" auf.

    Zum Menü "GKE-Arbeitslasten"

  2. Klicken Sie auf den Namen des nginx-Deployments.

  3. Maximieren Sie das Menü Aktionen und wählen Sie Autoscaling aus.

  4. Wählen Sie Autoscaling deaktivieren aus.

kubectl delete

Verwenden Sie den folgenden Befehl, um das HPA nginx zu löschen:

kubectl delete hpa nginx

Wenn Sie ein HPA löschen, bleibt die Skalierung des Deployments oder eines anderen Deployment-Objekts erhalten und wird nicht auf die Anzahl der Replikate im ursprünglichen Manifest des Deployments zurückgesetzt. Sie können den Befehl kubectl scale verwenden, um die Skalierung des Deployments manuell auf drei Pods zurückzusetzen.

kubectl scale deployment nginx --replicas=3

Bereinigen

  1. Löschen Sie das HPA, falls Sie dies noch nicht getan haben:

    kubectl delete hpa nginx
    
  2. Löschen Sie das Deployment nginx:

    kubectl delete deployment nginx
    
  3. Optional: Löschen Sie den Cluster.

Nächste Schritte