Automatische schaalaanpassing van verticale pods in Azure Kubernetes Service (AKS)

Dit artikel bevat een overzicht van VPA (Vertical Pod Autoscaler) in Azure Kubernetes Service (AKS), dat is gebaseerd op de open source Kubernetes-versie . Wanneer deze is geconfigureerd, worden resourceaanvragen en limieten voor containers per workload automatisch ingesteld op basis van het eerdere gebruik. VPA maakt CPU en geheugen vrij voor de andere pods en helpt effectief gebruik te maken van uw AKS-cluster.

Automatische schaalaanpassing van verticale pods biedt aanbevelingen voor resourcegebruik in de loop van de tijd. Als u plotselinge toenamen in resourcegebruik wilt beheren, gebruikt u de horizontale automatische schaalaanpassing van pods, waarmee het aantal podreplica's naar behoefte wordt geschaald.

Vergoedingen

Verticale automatische schaalaanpassing van pods biedt de volgende voordelen:

  • Het analyseert en past processor- en geheugenbronnen aan om uw toepassingen de juiste grootte te geven . VPA is niet alleen verantwoordelijk voor omhoog schalen, maar ook voor omlaag schalen op basis van het resourcegebruik in de loop van de tijd.

  • Een pod wordt verwijderd als deze de resourceaanvragen moet wijzigen als de schaalmodus is ingesteld op automatisch of opnieuw maken.

  • CPU- en geheugenbeperkingen instellen voor afzonderlijke containers door een resourcebeleid op te geven

  • Zorgt ervoor dat knooppunten over de juiste resources beschikken voor het plannen van pods

  • Configureerbare logboekregistratie van eventuele aanpassingen aan processor- of geheugenresources

  • Verbeter het gebruik van clusterresources en maak CPU en geheugen vrij voor andere pods.

Beperkingen

  • Automatische schaalaanpassing van verticale pods ondersteunt maximaal 1000 pods die zijn gekoppeld aan VerticalPodAutoscaler objecten per cluster.

  • VPA raadt mogelijk meer resources aan dan beschikbaar is in het cluster. Hierdoor voorkomt u dat de pod wordt toegewezen aan een knooppunt en wordt uitgevoerd, omdat het knooppunt niet over voldoende resources beschikt. U kunt deze beperking oplossen door LimitRange in te stellen op de maximaal beschikbare resources per naamruimte, waardoor pods niet om meer resources vragen dan is opgegeven. Daarnaast kunt u maximaal toegestane resourceaan aanbevelingen per pod instellen in een VerticalPodAutoscaler object. Houd er rekening mee dat VPA een onvoldoende probleem met knooppuntresources niet volledig kan oplossen. Het limietbereik is vast, maar het resourcegebruik van het knooppunt wordt dynamisch gewijzigd.

  • Het wordt afgeraden verticale automatische schaalaanpassing van pods te gebruiken met horizontale automatische schaalaanpassing van pods, die worden geschaald op basis van dezelfde metrische gegevens over CPU- en geheugengebruik.

  • VPA Recommender slaat maximaal acht dagen aan historische gegevens op.

  • VPA biedt geen ondersteuning voor op JVM gebaseerde workloads vanwege beperkte zichtbaarheid van het werkelijke geheugengebruik van de workload.

  • Het wordt niet aanbevolen of ondersteund om uw eigen implementatie van VPA uit te voeren naast deze beheerde implementatie van VPA. Het gebruik van een extra of aangepaste aanbevelingsfunctie wordt ondersteund.

  • AKS Windows-containers worden niet ondersteund.

Voordat u begint

  • Een AKS-cluster voert Kubernetes versie 1.24 en hoger uit.

  • De Azure CLI versie 2.52.0 of hoger is geïnstalleerd en geconfigureerd. Voer az --version uit om de versie te bekijken. Als u Azure CLI 2.0 wilt installeren of upgraden, raadpleegt u Azure CLI 2.0 installeren.

  • kubectl moet zijn verbonden met het cluster dat u VPA wilt installeren.

Overzicht van VPA

API-object

De verticale schaalaanpassing van pods is een API-resource in de Kubernetes-groep voor automatische schaalaanpassing van API's. De ondersteunde versie is 0.11 en hoger en vindt u in de kubernetes-opslagplaats voor automatische schaalaanpassing.

Het VPA-object bestaat uit drie onderdelen:

  • Aanbeveling: het bewaakt het huidige en eerdere resourceverbruik en biedt op basis daarvan aanbevolen waarden voor de CPU- en geheugenaanvragen/-limieten van de containers. De aanbevelingsfunctie bewaakt de metrische geschiedenis, OOM-gebeurtenissen (Out of Memory) en de VPA-implementatiespecificatie en stelt eerlijke aanvragen voor. Door een juiste configuratie van resourceaanvragen en limieten op te geven, worden de limieten verhoogd en verlaagd.

  • Updater : er wordt gecontroleerd welke van de beheerde pods de juiste resources hebben ingesteld en, zo niet, worden ze gedood zodat ze opnieuw kunnen worden gemaakt door hun controllers met de bijgewerkte aanvragen.

  • VPA-toegangscontroller : hiermee worden de juiste resourceaanvragen ingesteld op nieuwe pods (gemaakt of opnieuw gemaakt door hun controller vanwege de activiteit van de Updater).

VPA-toegangscontroller

VPA-toegangscontroller is een binair bestand dat zich registreert als een Mutating Admission Webhook. Wanneer elke pod is gemaakt, krijgt deze een aanvraag van de API-server en wordt geëvalueerd of er een overeenkomende VPA-configuratie is, of een overeenkomende pod wordt gevonden en de huidige aanbeveling wordt gebruikt om resourceaanvragen in te stellen in de pod.

Een zelfstandige taak wordt uitgevoerd buiten de VPA-toegangscontroller, genaamd overlay-vpa-cert-webhook-check. Het overlay-vpa-cert-webhook-check wordt gebruikt om de certificaten te maken en te vernieuwen en de VPA-toegangscontroller te registreren als een MutatingWebhookConfiguration.

Voor hoge beschikbaarheid ondersteunt AKS twee toegangscontrollerreplica's.

VPA-objectbewerkingsmodi

Er wordt een verticale resource voor automatische schaalaanpassing van pods ingevoegd voor elke controller waarvoor automatisch resourcevereisten moeten worden berekend. Dit is meestal een implementatie. Er zijn vier modi waarin VPN's werken:

  • Auto - VPA wijst resourceaanvragen toe tijdens het maken van pods en werkt bestaande pods bij met behulp van het aanbevolen updatemechanisme. Auto Is momenteel gelijk aan Recreateen is ook de standaardmodus. Zodra de update van podaanvragen opnieuw is opgestart ('in-place') is beschikbaar, kan deze worden gebruikt als het voorkeursupdatemechanisme door de Auto modus. Wanneer u de modus gebruikt Recreate , verwijdert VPA een pod als deze de resourceaanvragen moet wijzigen. Dit kan ertoe leiden dat de pods allemaal tegelijk opnieuw worden opgestart, waardoor toepassingsconsistentie ontstaat. U kunt herstarts beperken en consistentie in deze situatie behouden met behulp van een PodDisruptionBudget.
  • Recreate - VPA wijst resourceaanvragen toe tijdens het maken van pods en werkt bestaande pods bij door ze te verwijderen wanneer de aangevraagde resources aanzienlijk verschillen van de nieuwe aanbeveling (rekening houden met het budget voor podonderbreking, indien gedefinieerd). Deze modus moet zelden worden gebruikt, alleen als u ervoor moet zorgen dat de pods opnieuw worden opgestart wanneer de resourceaanvraag wordt gewijzigd. Anders heeft de modus de Auto voorkeur, die kan profiteren van updates zonder opnieuw opstarten zodra deze beschikbaar zijn.
  • Initial - VPA wijst alleen resourceaanvragen toe tijdens het maken van de pod en wijzigt daarna nooit meer.
  • Off - VPA wijzigt niet automatisch de resourcevereisten van de pods. De aanbevelingen worden berekend en kunnen worden geïnspecteerd in het VPA-object.

Implementatiepatroon tijdens het ontwikkelen van toepassingen

Een algemeen implementatiepatroon dat voor u wordt aanbevolen als u niet bekend bent met VPA, is door de volgende stappen uit te voeren tijdens het ontwikkelen van toepassingen om de unieke kenmerken van het resourcegebruik te identificeren, VPA te testen om te controleren of deze goed werkt en naast andere Kubernetes-onderdelen te testen om het resourcegebruik van het cluster te optimaliseren.

  1. Stel UpdateMode = 'Uit' in uw productiecluster in en voer VPA uit in de aanbevelingsmodus, zodat u VPA kunt testen en vertrouwd kunt raken met VPA. UpdateMode = "Uit" kan voorkomen dat er een onjuiste configuratie wordt ingevoerd die een storing kan veroorzaken.

  2. Stel eerst waarneembaarheid vast door de telemetrie van het werkelijke resourcegebruik gedurende een bepaalde periode te verzamelen. Dit helpt u inzicht te krijgen in het gedrag en de tekenen van symptomen of problemen van container- en podbronnen die worden beïnvloed door de workloads die erop worden uitgevoerd.

  3. Maak kennis met de bewakingsgegevens om inzicht te krijgen in de prestatiekenmerken. Stel op basis van dit inzicht de gewenste aanvragen/limieten in en vervolgens in de volgende implementatie of upgrade

  4. Stel updateMode de waarde in op Auto, Recreateof Initial afhankelijk van uw vereisten.

VPA in een cluster implementeren, upgraden of uitschakelen

In deze sectie implementeert, upgradet of schakelt u de automatische schaalaanpassing van verticale pods in uw cluster uit.

  1. Als u VPA wilt inschakelen op een nieuw cluster, gebruikt --enable-vpa u de parameter met de opdracht az aks create .

    az aks create -n myAKSCluster -g myResourceGroup --enable-vpa
    

    Na enkele minuten is de opdracht voltooid en retourneert deze informatie over het cluster in JSON-indeling.

  2. Als u VPA op een bestaand cluster wilt inschakelen, gebruikt u de --enable-vpa opdracht [https://learn.microsoft.com/en-us/cli/azure/aks?view=azure-cli-latest#az-aks-update] als u VPA wilt inschakelen.

    az aks update -n myAKSCluster -g myResourceGroup --enable-vpa 
    

    Na enkele minuten is de opdracht voltooid en retourneert deze informatie over het cluster in JSON-indeling.

  3. Als u VPA op een bestaand cluster wilt uitschakelen, gebruikt u de --disable-vpa opdracht [https://learn.microsoft.com/en-us/cli/azure/aks?view=azure-cli-latest#az-aks-update] om VPA uit te schakelen.

    az aks update -n myAKSCluster -g myResourceGroup --disable-vpa
    

    Na enkele minuten is de opdracht voltooid en retourneert deze informatie over het cluster in JSON-indeling.

  4. Gebruik de opdracht kubectl get om te controleren of de pods voor automatische schaalaanpassing voor verticale pods zijn gemaakt.

kubectl get pods -n kube-system

De uitvoer van de opdracht bevat de volgende resultaten die specifiek zijn voor de VPA-pods. De pods moeten een actieve status weergeven.

NAME                                        READY   STATUS    RESTARTS   AGE
vpa-admission-controller-7867874bc5-vjfxk   1/1     Running   0          41m
vpa-recommender-5fd94767fb-ggjr2            1/1     Running   0          41m
vpa-updater-56f9bfc96f-jgq2g                1/1     Running   0          41m

De installatie van de automatische schaalaanpassing van verticale pods testen

Met de volgende stappen maakt u een implementatie met twee pods, elk met één container die 100 millicores aanvraagt en probeert iets meer dan 500 millicores te gebruiken. Er wordt ook een VPA-configuratie gemaakt, die verwijst naar de implementatie. De VPA ziet het gedrag van de pods en na ongeveer vijf minuten worden ze bijgewerkt met een hogere CPU-aanvraag.

  1. Maak een bestand met de naam hamster.yaml en kopieer dit in het volgende manifest van het voorbeeld van de verticale pod automatisch schalen vanuit de GitHub-opslagplaats kubernetes/autoscaler .

  2. Implementeer het voorbeeld van automatische hamster.yaml schaalaanpassing van verticale pods met behulp van de opdracht kubectl apply en geef de naam van uw YAML-manifest op:

    kubectl apply -f hamster.yaml
    

    Na enkele minuten is de opdracht voltooid en retourneert deze informatie over het cluster in JSON-indeling.

  3. Voer de volgende kubectl get-opdracht uit om de pods op te halen uit de voorbeeldtoepassing voor het voorbeeld van de notebook:

    kubectl get pods -l app=hamster
    

    De voorbeelduitvoer ziet er ongeveer als volgt uit:

    hamster-78f9dcdd4c-hf7gk   1/1     Running   0          24s
    hamster-78f9dcdd4c-j9mc7   1/1     Running   0          24s
    
  4. Gebruik de opdracht kubectl describe op een van de pods om de CPU- en geheugenreservering weer te geven. Vervang 'exampleID' door een van de pod-id's die zijn geretourneerd in de uitvoer van de vorige stap.

    kubectl describe pod hamster-exampleID
    

    De voorbeelduitvoer is een fragment van de informatie over het cluster:

     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>
    

    De pod heeft in dit voorbeeld 100 millicpu en 50 Mibibytes geheugen gereserveerd. Voor deze voorbeeldtoepassing heeft de pod minder dan 100 millicpu nodig om uit te voeren, zodat er geen CPU-capaciteit beschikbaar is. De pods reserveren ook veel minder geheugen dan nodig is. De implementatie van de verticale pod autoscaler vpa-recommender analyseert de pods die als host fungeren voor de databasetoepassing om te zien of de CPU- en geheugenvereisten geschikt zijn. Als er aanpassingen nodig zijn, start de vpa-updater de pods opnieuw met bijgewerkte waarden.

  5. Wacht totdat de vpa-updater een nieuwe vm-updater start. Dit duurt enkele minuten. U kunt de pods bewaken met behulp van de opdracht kubectl get .

    kubectl get --watch pods -l app=hamster
    
  6. Wanneer een nieuwe cmdlet-pod wordt gestart, beschrijft u de pod waarop de kubectl-opdracht wordt uitgevoerd en bekijkt u de bijgewerkte CPU- en geheugenreserveringen.

    kubectl describe pod hamster-<exampleID>
    

    De voorbeelduitvoer is een fragment van de informatie die de pod beschrijft:

    State:          Running
      Started:      Wed, 28 Sep 2022 15:09:51 -0400
    Ready:          True
    Restart Count:  0
    Requests:
      cpu:        587m
      memory:     262144k
    Environment:  <none>
    

    In de vorige uitvoer ziet u dat de CPU-reservering is verhoogd tot 587 millicpu, wat meer dan vijf keer de oorspronkelijke waarde is. Het geheugen steeg tot 262.144 kilobytes, wat ongeveer 250 Mibibytes is, of vijf keer de oorspronkelijke waarde. Deze pod is onderresourced en de automatische schaalaanpassing van verticale pods corrigeerde de schatting met een veel geschiktere waarde.

  7. Als u bijgewerkte aanbevelingen van VPA wilt weergeven, voert u de opdracht kubectl describe uit om de resourcegegevens van de cmdlet-vpa te beschrijven.

    kubectl describe vpa/hamster-vpa
    

    De voorbeelduitvoer is een fragment van de informatie over het resourcegebruik:

     State:          Running
      Started:      Wed, 28 Sep 2022 15:09:51 -0400
    Ready:          True
    Restart Count:  0
    Requests:
      cpu:        587m
      memory:     262144k
    Environment:  <none>
    

Aanvragen voor automatische schaalaanpassing van pods instellen

Bij automatisch schalen van verticale pods wordt het VerticalPodAutoscaler object gebruikt om automatisch resourceaanvragen in te stellen op pods wanneer de updateMode is ingesteld op een auto. U kunt een andere waarde instellen, afhankelijk van uw vereisten en testen. In dit voorbeeld is updateMode ingesteld op Recreate.

  1. Schakel VPA in voor uw cluster door de volgende opdracht uit te voeren. Vervang de clusternaam myAKSCluster door de naam van uw AKS-cluster en vervang door myResourceGroup de naam van de resourcegroep waarin het cluster wordt gehost.

    az aks update -n myAKSCluster -g myResourceGroup --enable-vpa
    
  2. Maak een bestand met de naam azure-autodeploy.yamlen kopieer dit in het volgende manifest.

    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"]
    

    In dit manifest wordt een implementatie met twee pods beschreven. Elke pod heeft één container die 100 milliCPU en 50 MiB aan geheugen aanvraagt.

  3. Maak de pod met de opdracht kubectl create , zoals wordt weergegeven in het volgende voorbeeld:

    kubectl create -f azure-autodeploy.yaml
    

    Na enkele minuten is de opdracht voltooid en retourneert deze informatie over het cluster in JSON-indeling.

  4. Voer de volgende kubectl get-opdracht uit om de pods op te halen:

    kubectl get pods
    

    De uitvoer lijkt op het volgende voorbeeld met de naam en status van de pods:

    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
    
  5. Maak een bestand met de naam azure-vpa-auto.yamlen kopieer dit in het volgende manifest dat een beschrijving geeft van:VerticalPodAutoscaler

    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"
    

    De targetRef.name waarde geeft aan dat een pod die wordt beheerd door een implementatie met de naam vpa-auto-deployment behoort tot VerticalPodAutoscaler. De updateMode waarde van betekent dat de controller voor automatische schaalaanpassing van Recreate verticale pods een pod kan verwijderen, de CPU- en geheugenaanvragen kan aanpassen en vervolgens een nieuwe pod kan maken.

  6. Pas het manifest toe op het cluster met behulp van de opdracht kubectl apply :

    kubectl create -f azure-vpa-auto.yaml
    
  7. Wacht enkele minuten en bekijk de actieve pods opnieuw door de volgende kubectl get-opdracht uit te voeren:

    kubectl get pods
    

    De uitvoer lijkt op het volgende voorbeeld met de podnamen zijn gewijzigd en de status van de pods:

    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
    
  8. Krijg gedetailleerde informatie over een van uw actieve pods met behulp van de opdracht Kubectl get . Vervang podName door de naam van een van uw pods die u in de vorige stap hebt opgehaald.

    kubectl get pod podName --output yaml
    

    De uitvoer lijkt op het volgende voorbeeld, waarin wordt weergegeven dat de controller voor automatische schaalaanpassing van verticale pods de geheugenaanvraag heeft verhoogd naar 262144k en cpu-aanvraag tot 25 milliCPU.

    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
    
  9. Gebruik de opdracht kubectl get om gedetailleerde informatie te krijgen over de automatische schaalaanpassing van verticale pods en de aanbevelingen voor CPU en geheugen:

    kubectl get vpa vpa-auto --output yaml
    

    De uitvoer lijkt op het volgende voorbeeld:

     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 de resultaten ziet u dat het target kenmerk aangeeft dat de container optimaal moet worden uitgevoerd. Het is niet nodig om de CPU of het geheugendoel te wijzigen. Uw resultaten kunnen variëren waar de aanbeveling voor de doel-CPU en het geheugen hoger is.

    De verticale schaalaanpassing voor pods gebruikt de lowerBound en upperBound kenmerken om te bepalen of een pod moet worden verwijderd en vervangen door een nieuwe pod. Als een pod aanvragen heeft die kleiner zijn dan de ondergrens of groter dan de bovengrens, verwijdert de verticale schaalaanpassing voor pods de pod en vervangt deze door een pod die voldoet aan het doelkenmerk.

Extra aanbeveling voor automatische schaalaanpassing van verticale pods

In de VPA is een van de kernonderdelen de Aanbevelingsfunctie. Het biedt aanbevelingen voor resourcegebruik op basis van realtime resourceverbruik. AKS implementeert een aanbevelingsfunctie wanneer een cluster VPA inschakelt. U kunt een aangepaste aanbevelingsfunctie of een extra aanbeveling implementeren met dezelfde installatiekopieën als de standaardinstallatiekopieën. Het voordeel van een aangepaste aanbevelingsfunctie is dat u uw aanbevelingslogica kunt aanpassen. Met een extra aanbeveling kunt u VPN's partitioneren naar meerdere aanbevelers als er veel VPA-objecten zijn.

Het volgende voorbeeld is een extra aanbeveling die u toepast op uw bestaande AKS-cluster. Vervolgens configureert u het VPA-object voor het gebruik van de extra aanbeveling.

  1. Maak een bestand met de naam extra_recommender.yaml en kopieer dit in het volgende manifest:

    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 # nobody 
          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. Implementeer het extra-recomender.yaml voorbeeld van automatische schaalaanpassing van verticale pods met behulp van de opdracht kubectl apply en geef de naam van uw YAML-manifest op.

    kubectl apply -f extra-recommender.yaml 
    

    Na enkele minuten is de opdracht voltooid en retourneert deze informatie over het cluster in JSON-indeling.

  3. Maak een bestand met de naam hamnster_extra_recommender.yaml en kopieer dit in het volgende manifest:

    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" 
    

    Als memory dit niet is opgegeven, controlledResourcesreageert de aanbevelingsfunctie niet op OOM-gebeurtenissen. In dit geval stelt u alleen DE CPU in controlledValues. controlledValues hiermee kunt u kiezen of u de resourceaanvragen van de container op optie wilt bijwerken, of zowel resourceaanvragen RequestsOnly als limieten met behulp van de RequestsAndLimits optie. De standaardwaarde is RequestsAndLimits. Als u de RequestsAndLimits optie gebruikt, worden aanvragen berekend op basis van het werkelijke gebruik en worden limieten berekend op basis van de aanvraag- en limietverhouding van de huidige pod.

    Als u bijvoorbeeld begint met een pod die 2 CPU's en limieten aanvraagt tot 4 CPU's, stelt VPA altijd de limiet in op twee keer zoveel als aanvragen. Hetzelfde principe geldt voor geheugen. Wanneer u de RequestsAndLimits modus gebruikt, kan deze fungeren als blauwdruk voor uw eerste aanvraag en limieten voor toepassingsresources.

U kunt het VPA-object vereenvoudigen met behulp van de automodus en aanbevelingen voor computing voor zowel CPU als geheugen.

  1. Implementeer het hamster_extra-recomender.yaml voorbeeld met behulp van de opdracht kubectl apply en geef de naam van uw YAML-manifest op.

    kubectl apply -f hamster_customized_recommender.yaml
    
  2. Wacht totdat de vpa-updater een nieuwe vm-updater start. Dit duurt enkele minuten. U kunt de pods bewaken met behulp van de opdracht kubectl get .

    kubectl get --watch pods -l app=hamster
    
  3. Wanneer een nieuwe cmdlet-pod wordt gestart, beschrijft u de pod waarop de kubectl-opdracht wordt uitgevoerd en bekijkt u de bijgewerkte CPU- en geheugenreserveringen.

    kubectl describe pod hamster-<exampleID>
    

    De voorbeelduitvoer is een fragment van de informatie die de pod beschrijft:

    State:          Running
      Started:      Wed, 28 Sep 2022 15:09:51 -0400
    Ready:          True
    Restart Count:  0
    Requests:
      cpu:        587m
      memory:     262144k
    Environment:  <none>
    
  4. Als u bijgewerkte aanbevelingen van VPA wilt weergeven, voert u de opdracht kubectl describe uit om de resourcegegevens van de cmdlet-vpa te beschrijven.

    kubectl describe vpa/hamster-vpa
    

    De voorbeelduitvoer is een fragment van de informatie over het resourcegebruik:

    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
    

Problemen oplossen

Voer de volgende stappen uit om problemen met een VPA-installatie vast te stellen.

  1. Controleer of alle systeemonderdelen worden uitgevoerd met behulp van de volgende opdracht:

    kubectl --namespace=kube-system get pods|grep vpa
    

De uitvoer moet drie pods bevatten: aanbeveelaar, updater en toegangscontroller allemaal met de status met een status van Running.

  1. Controleer of de systeemonderdelen fouten registreren. Voer de volgende opdracht uit voor elk van de pods die door de vorige opdracht worden geretourneerd:

    kubectl --namespace=kube-system logs [pod name] | grep -e '^E[0-9]\{4\}'
    
  2. Controleer of de definitie van de aangepaste resource is gemaakt door de volgende opdracht uit te voeren:

    kubectl get customresourcedefinition | grep verticalpodautoscalers
    

Volgende stappen

In dit artikel hebt u gezien hoe u het resourcegebruik, zoals CPU en geheugen, van clusterknooppunten automatisch kunt schalen om te voldoen aan de toepassingsvereisten.