Freigeben über


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, dass kubectl 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.

  1. 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"
    
  2. Stellen Sie das Vertical Pod Autoscaler-Beispiel hamster.yaml mithilfe des Befehls kubectl 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.

  3. 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
    
  4. 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.

  5. Überwachen Sie die Pods mithilfe des Befehls kubectl get.

    kubectl get --watch pods -l app=hamster
    
  6. 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.

  7. 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.

  1. 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"]
    
  2. 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.

  3. 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
    
  4. 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 namens vpa-auto-deployment gesteuert wird, zu VerticalPodAutoscaler gehört. Der Wert updateMode von Recreate bedeutet, dass der Vertical Pod Autoscaler-Controller einen Pod löschen, die CPU- und Arbeitsspeicheranforderungen anpassen und dann einen neuen Pod starten kann.

  5. Wenden Sie das Manifest auf den Cluster an, indem Sie den Befehl kubectl apply verwenden.

    kubectl create -f azure-vpa-auto.yaml
    
  6. 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
    
  7. 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
    
  8. 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 und upperBound, 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.

  1. 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 
    
  2. Stellen Sie das Vertical Pod Autoscaler-Beispiel extra-recomender.yaml mithilfe des Befehls kubectl 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.

  3. 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 in controlledResources angegeben ist, antwortet das Empfehlungsmodul nicht auf OOM-Ereignisse. In diesem Beispiel wird nur die CPU in controlledValues festgelegt. controlledValues ermöglicht Ihnen die Auswahl, ob die Ressourcenanforderungen des Containers mit der Option RequestsOnly oder sowohl Ressourcenanforderungen als auch Grenzwerte mithilfe der Option RequestsAndLimits aktualisiert werden sollen. Der Standardwert ist RequestsAndLimits. Wenn Sie die Option RequestsAndLimits 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.

  4. Stellen Sie das Beispiel hamster-extra-recomender.yaml mithilfe des Befehls kubectl apply bereit.

    kubectl apply -f hamster-extra-recommender.yaml
    
  5. Überwachen Sie Ihre Pods mithilfe des Befehls [kubectl get]kubectl-get.

    kubectl get --watch pods -l app=hamster
    
  6. 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>
    
  7. 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.

  1. Ü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.

  2. Ü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\}'
    
  3. 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.