Verwenden des Vertical Pod Autoscalers in Azure Kubernetes Service (AKS)
Dieser Artikel zeigt Ihnen, wie Sie den Vertical Pod Autoscaler (VPA) in Ihrem Azure Kubernetes Service-Cluster (AKS) verwenden. Der VPA passt die CPU- und Speicheranforderungen für Ihre Pods automatisch an die Nutzungsmuster Ihrer Workloads an. Dieses Feature trägt dazu bei, die Leistung Ihrer Anwendungen zu optimieren und die Kosten für die Ausführung Ihrer Workloads in AKS zu reduzieren.
Weitere Informationen finden Sie in der Vertical Pod Autoscaler-Übersicht.
Voraussetzungen
Wenn Sie über einen vorhandenen AKS-Cluster verfügen, stellen Sie sicher, dass er Kubernetes, Version 1.24 oder höher, ausführt.
Azure CLI, Version 2.52.0 oder höher, muss installiert und konfiguriert sein. Führen Sie
az --version
aus, um die Version zu ermitteln. Informationen zum Durchführen einer Installation oder eines Upgrades finden Sie bei Bedarf unter Installieren der Azure CLI.Wenn Sie VPA auf einem vorhandenen Cluster aktivieren, stellen Sie mithilfe des Befehls
az aks get-credentials
sicher, dasskubectl
installiert und für die Verbindung mit Ihrem AKS-Cluster konfiguriert ist.az aks get-credentials --name <cluster-name> --resource-group <resource-group-name>
Bereitstellen des Vertical Pod Autoscalers in einem neuen Cluster
Erstellen Sie einen neuen AKS-Cluster mit aktiviertem VPA mithilfe des Befehls
az aks create
mit dem Flag--enable-vpa
.az aks create --name <cluster-name> --resource-group <resource-group-name> --enable-vpa --generate-ssh-keys
Nach wenigen Minuten ist die Ausführung des Befehls abgeschlossen, und es werden Informationen zum Cluster im JSON-Format zurückgegeben.
Aktualisieren eines vorhandenen Clusters zur Verwendung des Vertical Pod Autoscalers
Aktualisieren Sie mithilfe des Befehls
az aks update
mit dem Flag--enable-vpa
einen vorhandenen Cluster für die Verwendung von VPA.az aks update --name <cluster-name> --resource-group <resource-group-name> --enable-vpa
Nach wenigen Minuten ist die Ausführung des Befehls abgeschlossen, und es werden Informationen zum Cluster im JSON-Format zurückgegeben.
Deaktivieren des Vertical Pod Autoscalers für einen vorhandenen Cluster
Deaktivieren Sie mit dem Befehl
az aks update
und dem Flag--disable-vpa
VPA für einen vorhandenen Cluster.az aks update --name <cluster-name> --resource-group <resource-group-name> --disable-vpa
Nach wenigen Minuten ist die Ausführung des Befehls abgeschlossen, und es werden Informationen zum Cluster im JSON-Format zurückgegeben.
Testen der Vertical Pod Autoscaler-Installation
Im folgenden Beispiel erstellen wir eine Bereitstellung mit zwei Pods mit jeweils einem einzelnen Container, der 100 Millicores anfordert und versucht, etwas mehr als 500 Millicores zu verwenden. Außerdem erstellen wir eine VPA-Konfiguration, die auf die Bereitstellung verweist. Der VPA beobachtet das Verhalten der Pods und aktualisiert die Pods nach etwa fünf Minuten, um 500 Millicores anzufordern.
Erstellen Sie eine Datei namens
hamster.yaml
, und kopieren Sie das folgende Manifest des Vertical Pod Autoscaler-Beispiels aus dem GitHub-Repository kubernetes/autoscaler hinein:apiVersion: "autoscaling.k8s.io/v1" kind: VerticalPodAutoscaler metadata: name: hamster-vpa spec: targetRef: apiVersion: "apps/v1" kind: Deployment name: hamster resourcePolicy: containerPolicies: - containerName: '*' minAllowed: cpu: 100m memory: 50Mi maxAllowed: cpu: 1 memory: 500Mi controlledResources: ["cpu", "memory"] --- apiVersion: apps/v1 kind: Deployment metadata: name: hamster spec: selector: matchLabels: app: hamster replicas: 2 template: metadata: labels: app: hamster spec: securityContext: runAsNonRoot: true runAsUser: 65534 containers: - name: hamster image: registry.k8s.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"
Stellen Sie das Vertical Pod Autoscaler-Beispiel
hamster.yaml
mithilfe des Befehlskubectl apply
bereit.kubectl apply -f hamster.yaml
Nach wenigen Minuten ist die Ausführung des Befehls abgeschlossen, und es werden Informationen zum Cluster im JSON-Format zurückgegeben.
Zeigen Sie die ausgeführten Pods mithilfe des Befehls
kubectl get
an.kubectl get pods -l app=hamster
Ihre Ausgabe sollte in etwa dem folgendem Beispiel entsprechen:
hamster-78f9dcdd4c-hf7gk 1/1 Running 0 24s hamster-78f9dcdd4c-j9mc7 1/1 Running 0 24s
Zeigen Sie die CPU- und Arbeitsspeicherreservierungen auf einem der Pods mithilfe des Befehls
kubectl describe
an. Sie müssen „exampleID“<example-pod>
durch eine der Pod-IDs ersetzen, die in der Ausgabe aus dem vorherigen Schritt zurückgegeben wurden.kubectl describe pod hamster-<example-pod>
Ihre Ausgabe sollte in etwa dem folgendem Beispiel entsprechen:
hamster: Container ID: containerd:// Image: k8s.gcr.io/ubuntu-slim:0.1 Image ID: sha256: Port: <none> Host Port: <none> Command: /bin/sh Args: -c while true; do timeout 0.5s yes >/dev/null; sleep 0.5s; done State: Running Started: Wed, 28 Sep 2022 15:06:14 -0400 Ready: True Restart Count: 0 Requests: cpu: 100m memory: 50Mi Environment: <none>
Der Pod in diesem Beispiel verfügt über 100 Millicpu und 50 Mibibyte Arbeitsspeicher an Reservierungen. Für diese Beispielanwendung benötigt der Pod weniger als 100 Millicpu, sodass keine CPU-Kapazität verfügbar ist. Der Pod reserviert auch weniger Arbeitsspeicher als erforderlich. Die Vertical Pod Autoscaler-Bereitstellung vpa-recommender analysiert die Pods, die die Hamster-Anwendung hosten, um festzustellen, ob die CPU- und Arbeitsspeicheranforderungen sinnvoll sind. Wenn Anpassungen erforderlich sind, startet der vpa-updater die Pods mit aktualisierten Werten neu.
Überwachen Sie die Pods mithilfe des Befehls
kubectl get
.kubectl get --watch pods -l app=hamster
Wenn der neue Hamster-Pod gestartet wird, können Sie die aktualisierten CPU- und Arbeitsspeicherreservierungen mithilfe des Befehls
kubectl describe
anzeigen. Sie müssen „exampleID“<example-pod>
durch eine der Pod-IDs ersetzen, die in der Ausgabe aus dem vorherigen Schritt zurückgegeben wurden.kubectl describe pod hamster-<example-pod>
Ihre Ausgabe sollte in etwa dem folgendem Beispiel entsprechen:
State: Running Started: Wed, 28 Sep 2022 15:09:51 -0400 Ready: True Restart Count: 0 Requests: cpu: 587m memory: 262144k Environment: <none>
In der vorherigen Ausgabe können Sie sehen, dass die CPU-Reservierung auf 587 Millicpu erhöht wurde, was mehr als fünf mal der ursprüngliche Wert ist. Der Arbeitsspeicher ist auf 262.144 Kilobyte angestiegen, also etwa 250 Mibibyte oder fünf mal der ursprüngliche Wert. Diesem Pod standen zu wenige Ressourcen zur Verfügung, und der Vertical Pod Autoscaler korrigierte die Schätzung durch einen viel geeigneteren Wert.
Zeigen Sie aktualisierte Empfehlungen von VPA mithilfe des Befehls
kubectl describe
an, um die Informationen zur Ressource „hamster-vpa“ zu beschreiben.kubectl describe vpa/hamster-vpa
Ihre Ausgabe sollte in etwa dem folgendem Beispiel entsprechen:
State: Running Started: Wed, 28 Sep 2022 15:09:51 -0400 Ready: True Restart Count: 0 Requests: cpu: 587m memory: 262144k Environment: <none>
Festlegen von Vertical Pod Autoscaler-Anforderungen
Das Objekt VerticalPodAutoscaler
legt automatisch Ressourcenanforderungen für Pods fest, bei denen updateMode
den Wert Auto
hat. Sie können je nach Ihren Anforderungen und Tests einen anderen Wert festlegen. In diesem Beispiel erstellen und testen wir ein Bereitstellungsmanifest mit zwei Pods, die jeweils einen Container ausführen, der 100 MilliCPU und 50 MiB Arbeitsspeicher anfordert und updateMode
auf Recreate
festlegt.
Erstellen Sie eine Datei namens
azure-autodeploy.yaml
, und fügen Sie das folgende Manifest ein:apiVersion: apps/v1 kind: Deployment metadata: name: vpa-auto-deployment spec: replicas: 2 selector: matchLabels: app: vpa-auto-deployment template: metadata: labels: app: vpa-auto-deployment spec: containers: - name: mycontainer image: mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine resources: requests: cpu: 100m memory: 50Mi command: ["/bin/sh"] args: ["-c", "while true; do timeout 0.5s yes >/dev/null; sleep 0.5s; done"]
Erstellen Sie den Pod mit dem Befehl
kubectl create
.kubectl create -f azure-autodeploy.yaml
Nach wenigen Minuten ist die Ausführung des Befehls abgeschlossen, und es werden Informationen zum Cluster im JSON-Format zurückgegeben.
Zeigen Sie die ausgeführten Pods mithilfe des Befehls
kubectl get
an.kubectl get pods
Ihre Ausgabe sollte in etwa dem folgendem Beispiel entsprechen:
NAME READY STATUS RESTARTS AGE vpa-auto-deployment-54465fb978-kchc5 1/1 Running 0 52s vpa-auto-deployment-54465fb978-nhtmj 1/1 Running 0 52s
Erstellen Sie eine Datei namens
azure-vpa-auto.yaml
, und fügen Sie das folgende Manifest ein:apiVersion: autoscaling.k8s.io/v1 kind: VerticalPodAutoscaler metadata: name: vpa-auto spec: targetRef: apiVersion: "apps/v1" kind: Deployment name: vpa-auto-deployment updatePolicy: updateMode: "Recreate"
Der Wert
targetRef.name
gibt an, dass jeder Pod, der von einer Bereitstellung namensvpa-auto-deployment
gesteuert wird, zuVerticalPodAutoscaler
gehört. Der WertupdateMode
vonRecreate
bedeutet, dass der Vertical Pod Autoscaler-Controller einen Pod löschen, die CPU- und Arbeitsspeicheranforderungen anpassen und dann einen neuen Pod starten kann.Wenden Sie das Manifest auf den Cluster an, indem Sie den Befehl
kubectl apply
verwenden.kubectl create -f azure-vpa-auto.yaml
Warten Sie einige Minuten, und zeigen Sie dann die ausgeführten Pods mit dem Befehl
kubectl get
an.kubectl get pods
Ihre Ausgabe sollte in etwa dem folgendem Beispiel entsprechen:
NAME READY STATUS RESTARTS AGE vpa-auto-deployment-54465fb978-qbhc4 1/1 Running 0 2m49s vpa-auto-deployment-54465fb978-vbj68 1/1 Running 0 109s
Rufen Sie mithilfe des Befehls
kubectl get
detaillierte Informationen zu einzelnen ausgeführten Pods ab. Stellen Sie sicher, dass Sie<pod-name>
durch den Namen eines Ihrer Pods aus der vorherigen Ausgabe ersetzen.kubectl get pod <pod-name> --output yaml
Die Ausgabe sollte ähnlich wie die folgende Beispielausgabe aussehen. Sie zeigt, dass der VPA-Controller die Arbeitsspeicheranforderung auf 262144k und die CPU-Anforderung auf 25 MilliCPU erhöht hat:
apiVersion: v1 kind: Pod metadata: annotations: vpaObservedContainers: mycontainer vpaUpdates: 'Pod resources updated by vpa-auto: container 0: cpu request, memory request' creationTimestamp: "2022-09-29T16:44:37Z" generateName: vpa-auto-deployment-54465fb978- labels: app: vpa-auto-deployment spec: containers: - args: - -c - while true; do timeout 0.5s yes >/dev/null; sleep 0.5s; done command: - /bin/sh image: mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine imagePullPolicy: IfNotPresent name: mycontainer resources: requests: cpu: 25m memory: 262144k
Rufen Sie mit dem Befehl
kubectl get
detaillierte Informationen zum Vertical Pod Autoscaler und seinen Empfehlungen für CPU und Arbeitsspeicher ab.kubectl get vpa vpa-auto --output yaml
Ihre Ausgabe sollte in etwa dem folgendem Beispiel entsprechen:
recommendation: containerRecommendations: - containerName: mycontainer lowerBound: cpu: 25m memory: 262144k target: cpu: 25m memory: 262144k uncappedTarget: cpu: 25m memory: 262144k upperBound: cpu: 230m memory: 262144k
In diesem Beispiel geben die Ergebnisse im Attribut
target
an, dass das CPU- oder Arbeitsspeicherziel nicht geändert werden muss, damit der Container optimal ausgeführt wird. Die Ergebnisse können jedoch je nach Anwendung und deren Ressourcenauslastung variieren.Der Vertical Pod Autoscaler verwendet die Attribute
lowerBound
undupperBound
, um zu entscheiden, ob ein Pod gelöscht und durch einen neuen Pod ersetzt werden soll. Wenn ein Pod Anforderungen kleiner als die untere Grenze oder größer als die obere Grenze aufweist, löscht der Vertical Pod Autoscaler den Pod und ersetzt ihn durch einen Pod, der das Zielattribut erfüllt.
Zusätzliche Empfehlung für die automatische vertikale Podskalierung
Das Empfehlungsmodul bietet Empfehlungen für den Ressourceneinsatz basierend auf dem Ressourcenverbrauch in Echtzeit. AKS stellt ein Empfehlungsmodul bereit, wenn ein Cluster VPA aktiviert. Sie können ein benutzerdefiniertes Empfehlungsmodul oder ein zusätzliches Empfehlungsmodul mit demselben Image wie das Standardimage bereitstellen. Der Vorteil eines benutzerdefinierten Empfehlungsmodul besteht darin, dass Sie Ihre Empfehlungslogik anpassen können. Mit einem zusätzlichen Empfehlungsmodul können Sie VPAs partitionieren, um verschiedene Empfehlungsmodule zu verwenden.
Im folgenden Beispiel wird ein zusätzliches Empfehlungsmodul erstellt, auf einen vorhandenen AKS-Cluster angewendet und das VPA-Objekt so konfiguriert, dass das zusätzliche Empfehlungsmodul verwendet wird.
Erstellen Sie eine Datei namens
extra_recommender.yaml
, und fügen Sie das folgende Manifest ein:apiVersion: apps/v1 kind: Deployment metadata: name: extra-recommender namespace: kube-system spec: replicas: 1 selector: matchLabels: app: extra-recommender template: metadata: labels: app: extra-recommender spec: serviceAccountName: vpa-recommender securityContext: runAsNonRoot: true runAsUser: 65534 containers: - name: recommender image: registry.k8s.io/autoscaling/vpa-recommender:0.13.0 imagePullPolicy: Always args: - --recommender-name=extra-recommender resources: limits: cpu: 200m memory: 1000Mi requests: cpu: 50m memory: 500Mi ports: - name: prometheus containerPort: 8942
Stellen Sie das Vertical Pod Autoscaler-Beispiel
extra-recomender.yaml
mithilfe des Befehlskubectl apply
bereit.kubectl apply -f extra-recommender.yaml
Nach wenigen Minuten ist die Ausführung des Befehls abgeschlossen, und es werden Informationen zum Cluster im JSON-Format zurückgegeben.
Erstellen Sie eine Datei namens
hamster-extra-recommender.yaml
, und fügen Sie das folgende Manifest ein:apiVersion: "autoscaling.k8s.io/v1" kind: VerticalPodAutoscaler metadata: name: hamster-vpa spec: recommenders: - name: 'extra-recommender' targetRef: apiVersion: "apps/v1" kind: Deployment name: hamster updatePolicy: updateMode: "Auto" resourcePolicy: containerPolicies: - containerName: '*' minAllowed: cpu: 100m memory: 50Mi maxAllowed: cpu: 1 memory: 500Mi controlledResources: ["cpu", "memory"] --- apiVersion: apps/v1 kind: Deployment metadata: name: hamster spec: selector: matchLabels: app: hamster replicas: 2 template: metadata: labels: app: hamster spec: securityContext: runAsNonRoot: true runAsUser: 65534 # nobody containers: - name: hamster 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"
Wenn
memory
nicht incontrolledResources
angegeben ist, antwortet das Empfehlungsmodul nicht auf OOM-Ereignisse. In diesem Beispiel wird nur die CPU incontrolledValues
festgelegt.controlledValues
ermöglicht Ihnen die Auswahl, ob die Ressourcenanforderungen des Containers mit der OptionRequestsOnly
oder sowohl Ressourcenanforderungen als auch Grenzwerte mithilfe der OptionRequestsAndLimits
aktualisiert werden sollen. Der Standardwert istRequestsAndLimits
. Wenn Sie die OptionRequestsAndLimits
verwenden, werden Anforderungen basierend auf der tatsächlichen Nutzung berechnet, und Grenzwerte werden basierend auf dem Anforderungs- und Grenzwertverhältnis des aktuellen Pods berechnet.Wenn Sie beispielsweise mit einem Pod beginnen, der 2 CPUs anfordert und auf 4 CPUs beschränkt ist, legt VPA den Grenzwert immer auf das Doppelte fest wie Anforderungen. Das gleiche Prinzip gilt für den Arbeitsspeicher. Wenn Sie den
RequestsAndLimits
Modus verwenden, kann er als Blaupause für Ihre anfänglichen Anwendungsressourcenanforderungen und -grenzwerte dienen.Sie können das VPA-Objekt vereinfachen, indem Sie den Modus
Auto
und Computeempfehlungen für CPU und Arbeitsspeicher verwenden.Stellen Sie das Beispiel
hamster-extra-recomender.yaml
mithilfe des Befehlskubectl apply
bereit.kubectl apply -f hamster-extra-recommender.yaml
Überwachen Sie Ihre Pods mithilfe des Befehls
[kubectl get
]kubectl-get.kubectl get --watch pods -l app=hamster
Wenn der neue Hamster-Pod gestartet wird, zeigen Sie die aktualisierten CPU- und Arbeitsspeicherreservierungen mithilfe des Befehls
kubectl describe
an. Stellen Sie sicher, dass Sie<example-pod>
durch eine Ihrer Pod-IDs ersetzen.kubectl describe pod hamster-<example-pod>
Ihre Ausgabe sollte in etwa dem folgendem Beispiel entsprechen:
State: Running Started: Wed, 28 Sep 2022 15:09:51 -0400 Ready: True Restart Count: 0 Requests: cpu: 587m memory: 262144k Environment: <none>
Zeigen Sie aktualisierte Empfehlungen von VPA mithilfe des Befehls
kubectl describe
an.kubectl describe vpa/hamster-vpa
Ihre Ausgabe sollte in etwa dem folgendem Beispiel entsprechen:
State: Running Started: Wed, 28 Sep 2022 15:09:51 -0400 Ready: True Restart Count: 0 Requests: cpu: 587m memory: 262144k Environment: <none> Spec: recommenders: Name: customized-recommender
Problembehandlung für den Vertical Pod Autoscaler
Wenn Probleme mit dem Vertical Pod Autoscaler auftreten, können Sie die Problembehandlung für Systemkomponenten und die benutzerdefinierte Ressourcendefinition ausführen, um das Problem zu identifizieren.
Überprüfen Sie mit dem folgenden Befehl, ob alle Systemkomponenten ausgeführt werden:
kubectl --namespace=kube-system get pods|grep vpa
Ihre Ausgabe sollte drei Pods auflisten: „recommender“, „updater“ und „admission-controller“, alle mit dem Status
Running
.Überprüfen Sie mit dem folgenden Befehl für jeden der in der vorherigen Ausgabe zurückgegebenen Pods, ob die Systemkomponenten Fehler protokollieren:
kubectl --namespace=kube-system logs [pod name] | grep -e '^E[0-9]\{4\}'
Stellen Sie mit dem folgenden Befehl sicher, dass die benutzerdefinierte Ressourcendefinition erstellt wurde:
kubectl get customresourcedefinition | grep verticalpodautoscalers
Nächste Schritte
Weitere Informationen zum VPA-Objekt finden Sie in der Vertical Pod Autoscaler-API-Referenz.
Azure Kubernetes Service