Vertikales Pod-Autoscaling konfigurieren

Auf dieser Seite wird beschrieben, wie Sie vertikales Pod-Autoscaling in einem Google Kubernetes Engine-Cluster konfigurieren. Beim vertikalen Pod-Autoscaling werden die CPU- und Speicheranforderungen eines Pods angepasst.

Übersicht

Mit der benutzerdefinierten Ressource VerticalPodAutoscaler können Sie die CPU-Anforderungen und Speicheranforderungen Ihrer Container analysieren und anpassen. Sie können einen VerticalPodAutoscaler so konfigurieren, dass er Empfehlungen für CPU- und Speicheranforderungen gibt oder automatisch Änderungen an Ihren CPU- und Speicheranforderungen vornimmt.

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

Hinweis zu API-Versionen

In dieser Anleitung wird davon ausgegangen, dass Sie die v1-Version der VerticalPodAutoscaler API in Ihrem Google Kubernetes Engine-Cluster installiert haben. Sie ist in Version 1.14.7-gke.10 oder höher und in 1.15.4-gke.15 oder höher verfügbar.

Wir empfehlen Ihnen dringend, diese API zu verwenden. Anweisungen zur Migration von älteren API-Versionen finden Sie im Migrationshandbuch.

Vertikales Pod-Autoscaling für einen Cluster aktivieren

Geben Sie den folgenden Befehl ein, um einen neuen Cluster mit aktiviertem vertikalen Pod-Autoscaling zu erstellen:

gcloud container clusters create cluster-name \
    --enable-vertical-pod-autoscaling --cluster-version=1.14.7

Dabei ist cluster-name der Name, den Sie für Ihren Cluster auswählen.

Mit dem folgenden Befehl können Sie vertikales Pod-Autoscaling für einen vorhandenen Cluster aktivieren:

gcloud container clusters update cluster-name --enable-vertical-pod-autoscaling

Dabei ist cluster-name der Name des Clusters.

Das Aktivieren oder Deaktivieren des vertikalen Pod-Autoscalings führt zu einem Neustart der Steuerungsebene.

Ressourcenempfehlungen erhalten

In dieser Übung erstellen Sie ein VerticalPodAutoscaler-Objekt mit deaktiviertem updateMode ("Off"). Dann erstellen Sie ein Deployment mit zwei Pods, die jeweils einen Container haben. Wenn die Pods erstellt werden, analysiert der VerticalPodAutoscaler die CPU- und Speicheranforderungen der Container und erfasst diese Empfehlungen im Feld status. Der VerticalPodAutoscaler führt keine Aktion zur Aktualisierung der Ressourcenanforderungen für die aktiven Container aus.

Dies ist ein Manifest für den VerticalPodAutoscaler:

apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
  name: my-rec-vpa
spec:
  targetRef:
    apiVersion: "apps/v1"
    kind:       Deployment
    name:       my-rec-deployment
  updatePolicy:
    updateMode: "Off"

Speichern Sie das Manifest in einer Datei mit dem Namen my-rec-vpa.yaml und erstellen Sie den VerticalPodAutoscaler:

kubectl create -f my-rec-vpa.yaml

Das ist ein Manifest für das Deployment:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-rec-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: my-rec-deployment
  template:
    metadata:
      labels:
        app: my-rec-deployment
    spec:
      containers:
      - name: my-rec-container
        image: nginx

Anhand des Manifests sehen Sie, dass keine CPU- oder Speicheranforderungen vorhanden sind. Ebenso sehen Sie, dass die Pods im Deployment zum VerticalPodAutoscaler gehören, da er auf die Ziele kind: Deployment und name: my-rec-deployment verweist.

Kopieren Sie das Manifest in eine Datei mit dem Namen my-rec-deployment.yaml und erstellen Sie das Deployment:

kubectl create -f my-rec-deployment.yaml

Warten Sie eine Minute und rufen Sie dann den VerticalPodAutoscaler auf:

kubectl get vpa my-rec-vpa --output yaml

Die Ausgabe zeigt Empfehlungen für CPU- und Speicheranforderungen:

...
  recommendation:
    containerRecommendations:
    - containerName: my-rec-container
      lowerBound:
        cpu: 25m
        memory: 262144k
      target:
        cpu: 25m
        memory: 262144k
      upperBound:
        cpu: 7931m
        memory: 8291500k
...

Da Sie jetzt die empfohlenen CPU- und Speicheranforderungen kennen, können Sie das Deployment löschen, die CPU- und Speicheranforderungen in Ihrem Deployment-Manifest einfügen und das Deployment wieder starten.

Bestimmte Container deaktivieren

In dieser Übung erstellen Sie einen VerticalPodAutoscaler, für den ein bestimmter Container deaktiviert ist. Anschließend erstellen Sie ein Deployment mit einem Pod mit zwei Containern. Wenn der Pod erstellt wurde, erstellt und wendet der VerticalPodAutoscaler eine Empfehlung nur für einen einzelnen Container an, wobei der deaktivierte ignoriert wird.

Dies ist ein Manifest für den VerticalPodAutoscaler:

apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
  name: my-opt-vpa
spec:
  targetRef:
    apiVersion: "apps/v1"
    kind:       Deployment
    name:       my-opt-deployment
  updatePolicy:
    updateMode: "Auto"
  resourcePolicy:
    containerPolicies:
    - containerName: my-opt-sidecar
      mode: "Off"

Der VerticalPodAutoscaler erhält zusätzliche Informationen im Abschnitt resourcePolicy. mode "Off" deaktiviert Empfehlungen für einen Container mit einem angegebenen Namen, in diesem Fall my-opt-sidecar.

Speichern Sie das Manifest in einer Datei mit dem Namen my-opt-vpa.yaml und erstellen Sie den VerticalPodAutoscaler:

kubectl create -f my-opt-vpa.yaml

Das ist ein Manifest für das Deployment:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-opt-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-opt-deployment
  template:
    metadata:
      labels:
        app: my-opt-deployment
    spec:
      containers:
      - name: my-opt-container
        image: nginx
      - name: my-opt-sidecar
        image: busybox
        command: ["sh","-c","while true; do echo Doing sidecar stuff!; sleep 60; done"]

Kopieren Sie das Manifest in eine Datei mit dem Namen my-opt-deployment.yaml und erstellen Sie das Deployment:

kubectl create -f my-opt-deployment.yaml

Warten Sie eine Minute und rufen Sie dann den VerticalPodAutoscaler auf:

kubectl get vpa my-opt-vpa --output yaml

Die Ausgabe zeigt Empfehlungen für CPU- und Speicheranforderungen:

...
  recommendation:
    containerRecommendations:
    - containerName: my-opt-container
...

Es gibt Empfehlungen für nur einen Container. Es sind keine Empfehlungen für my-opt-sidecar vorhanden, da der Container deaktiviert wurde.

Der VerticalPodAutoscaler aktualisiert niemals Ressourcen für deaktivierte Container. Wenn Sie einige Minuten warten, erstellt der Pod Container zwar neu, aber nur ein Container enthält aktualisierte Ressourcenanforderungen.

Ressourcenanforderungen automatisch aktualisieren

In dieser Übung erstellen Sie ein Deployment mit zwei Pods. Jeder Pod hat einen Container, der 100 MilliCPU und 50 Mebibyte Speicher anfordert. Dann erstellen Sie einen VerticalPodAutoscaler, der die CPU- und Speicheranforderungen automatisch anpasst.

Das ist ein Manifest für das Deployment:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-auto-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: my-auto-deployment
  template:
    metadata:
      labels:
        app: my-auto-deployment
    spec:
      containers:
      - name: my-container
        image: k8s.gcr.io/ubuntu-slim:0.1
        resources:
          requests:
            cpu: 100m
            memory: 50Mi
        command: ["/bin/sh"]
        args: ["-c", "while true; do timeout 0.5s yes >/dev/null; sleep 0.5s; done"]

Kopieren Sie das Manifest in eine Datei mit dem Namen my-auto-deployment.yaml und erstellen Sie das Deployment:

kubectl create -f my-auto-deployment.yaml

Listen Sie die aktiven Pods auf:

kubectl get pods

Die Ausgabe zeigt die Namen der Pods in my-deployment an:

NAME                            READY     STATUS             RESTARTS   AGE
my-auto-deployment-cbcdd49fb-d6bf9   1/1       Running            0          8s
my-auto-deployment-cbcdd49fb-th288   1/1       Running            0          8s

Notieren Sie sich die Namen Ihrer Pods für später.

Die CPU- und Speicheranforderungen für die Deployments sind sehr gering. Deshalb kann davon ausgegangen werden, dass eine Erhöhung der Ressourcen von Vorteil wäre.

Dies ist ein Manifest für einen VerticalPodAutoscaler:

apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
  name: my-vpa
spec:
  targetRef:
    apiVersion: "apps/v1"
    kind:       Deployment
    name:       my-auto-deployment
  updatePolicy:
    updateMode: "Auto"

Das Feld targetRef im Manifest gibt an, dass jeder von einem Deployment mit dem Namen my-deployment gesteuerte Pod zu diesem VerticalPodAutoscaler gehört.

Das Feld updateMode hat den Wert Auto. Das bedeutet, dass der VerticalPodAutoscaler die CPU- und Speicheranforderungen während der Lebensdauer eines Pods aktualisieren kann. Der VerticalPodAutoscaler kann einen Pod also löschen, die CPU- und Speicheranforderungen anpassen und dann einen neuen Pod starten.

Kopieren Sie das Manifest in eine Datei mit dem Namen my-vpa.yaml und erstellen Sie den VerticalPodAutoscaler:

kubectl create -f my-vpa.yaml

Warten Sie einige Minuten und rufen Sie dann wieder die aktiven Pods auf:

kubectl get pods

Die Namen der Pods haben sich geändert. Sollten sich die Namen der Pods noch nicht geändert haben, warten Sie etwas länger und listen Sie die aktiven Pods noch einmal auf.

Rufen Sie detaillierte Informationen zu einem der aktiven Pods ab:

kubectl get pod pod-name --output yaml

Dabei ist pod-name der Name eines Ihrer Pods.

In der Ausgabe sehen Sie, dass der VerticalPodAutoscaler die Speicher- und CPU-Anforderungen erhöht hat. Außerdem können Sie eine Annotation sehen, in der die Aktualisierung dokumentiert wird:

apiVersion: v1
kind: Pod
metadata:
  annotations:
    vpaUpdates: 'Pod resources updated by my-vpa: container 0: cpu capped to node
      capacity, memory capped to node capacity, cpu request, memory request'
...
spec:
  containers:
  ...
    resources:
      requests:
        cpu: 510m
        memory: 262144k
    ...

Rufen Sie detaillierte Informationen zum VerticalPodAutoscaler ab:

kubectl get vpa my-vpa --output yaml

Die Ausgabe enthält drei separate Empfehlungen für CPU- und Speicheranforderungen: "lowerBound", "target" und "upperBound":

...
  recommendation:
    containerRecommendations:
    - containerName: my-container
      lowerBound:
        cpu: 536m
        memory: 262144k
      target:
        cpu: 587m
        memory: 262144k
      upperBound:
        cpu: 27854m
        memory: "545693548"

Die Empfehlung target gibt an, dass der Container für eine optimale Ausführung 587 MilliCPU und 262.144 Kilobyte Speicher anfordern sollte.

Anhand der Empfehlungen lowerBound und upperBound entscheidet der VerticalPodAutoscaler, ob ein Pod gelöscht und durch einen neuen Pod ersetzt werden soll. Wenn die Anforderungen eines Pods unter der Untergrenze oder über der Obergrenze liegen, wird er vom VerticalPodAutoscaler gelöscht und durch einen Pod mit der Zielempfehlung ersetzt.

Bereinigen

Deaktivieren Sie das vertikale Pod-Autoscaling:

gcloud container clusters update cluster-name --no-enable-vertical-pod-autoscaling

Dabei ist cluster-name der Name des Clusters.

Optional: Löschen Sie den Cluster.

Nächste Schritte