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:
- Achten Sie darauf, dass die Google Kubernetes Engine API aktiviert ist. Aktivieren Sie Google Kubernetes Engine API
- Prüfen Sie, ob das Cloud SDK installiert ist.
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.
-
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
- Folgen Sie der Anleitung, um
gcloud
zur Verwendung Ihres Google Cloud-Kontos zu autorisieren. - Erstellen Sie eine neue Konfiguration oder wählen Sie eine vorhandene aus.
- Wählen Sie ein Google Cloud-Projekt aus.
- 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
- Vertikales Pod-Autoscaling
- Containern und Pods CPU-Ressourcen zuweisen
- Containern und Pods Arbeitsspeicherressourcen zuweisen
- Anwendungen skalieren
- Deployments mit benutzerdefinierten Messwerten automatisch skalieren
- Cluster Autoscaler