Delen via


De automatische schaalaanpassing van verticale pods gebruiken in Azure Kubernetes Service (AKS)

In dit artikel leest u hoe u de Verticale automatische schaalaanpassing van pods (VPA) gebruikt in uw AKS-cluster (Azure Kubernetes Service). De VPA past automatisch de CPU- en geheugenaanvragen voor uw pods aan zodat deze overeenkomen met de gebruikspatronen van uw workloads. Met deze functie kunt u de prestaties van uw toepassingen optimaliseren en de kosten voor het uitvoeren van uw workloads in AKS verlagen.

Zie het overzicht van De automatische schaalaanpassing van verticale pods voor meer informatie.

Voordat u begint

  • Als u een bestaand AKS-cluster hebt, controleert u of Kubernetes versie 1.24 of hoger wordt uitgevoerd.

  • U moet Azure CLI versie 2.52.0 of hoger hebben 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.

  • Als U VPA inschakelt op een bestaand cluster, moet u ervoor zorgen dat kubectl deze is geïnstalleerd en geconfigureerd om verbinding te maken met uw AKS-cluster met behulp van de az aks get-credentials opdracht.

    az aks get-credentials --name <cluster-name> --resource-group <resource-group-name>
    

De automatische schaalaanpassing van verticale pods implementeren op een nieuw cluster

  • Maak een nieuw AKS-cluster met de VPA ingeschakeld met behulp van de az aks create opdracht met de --enable-vpa vlag.

    az aks create --name <cluster-name> --resource-group <resource-group-name> --enable-vpa --generate-ssh-keys
    

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

Een bestaand cluster bijwerken om de automatische schaalaanpassing van verticale pods te gebruiken

  • Werk een bestaand cluster bij om de VPA te gebruiken met behulp van de az aks update opdracht met de --enable-vpa vlag.

    az aks update --name <cluster-name> --resource-group <resource-group-name> --enable-vpa 
    

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

De automatische schaalaanpassing van verticale pods op een bestaand cluster uitschakelen

  • Schakel de VPA op een bestaand cluster uit met behulp van de az aks update opdracht met de --disable-vpa vlag.

    az aks update --name <cluster-name> --resource-group <resource-group-name> --disable-vpa
    

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

Installatie van automatische schaalaanpassing van verticale pods testen

In het volgende voorbeeld maken we een implementatie met twee pods, die elk één container uitvoeren die 100 millicore aanvraagt en iets meer dan 500 millicores probeert te gebruiken. We maken ook een VPA-configuratie die verwijst naar de implementatie. De VPA bekijkt het gedrag van de pods en werkt na ongeveer vijf minuten de pods bij om 500 millicores aan te vragen.

  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 :

    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. Implementeer het voorbeeld van automatische hamster.yaml schaalaanpassing van verticale pods met behulp van de kubectl apply opdracht.

    kubectl apply -f hamster.yaml
    

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

  3. Bekijk de actieve pods met behulp van de kubectl get opdracht.

    kubectl get pods -l app=hamster
    

    De uitvoer moet er ongeveer uitzien als in de volgende voorbeelduitvoer:

    hamster-78f9dcdd4c-hf7gk   1/1     Running   0          24s
    hamster-78f9dcdd4c-j9mc7   1/1     Running   0          24s
    
  4. Bekijk de CPU- en geheugenreserveringen op een van de pods met behulp van de kubectl describe opdracht. Zorg ervoor dat u vervangt door <example-pod> een van de pod-id's die zijn geretourneerd in de uitvoer van de vorige stap.

    kubectl describe pod hamster-<example-pod>
    

    De uitvoer moet er ongeveer uitzien als in de volgende voorbeelduitvoer:

     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 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. Bewaak de pods met behulp van de kubectl get opdracht.

    kubectl get --watch pods -l app=hamster
    
  6. Wanneer de nieuwe cmdlet-pod wordt gestart, kunt u de bijgewerkte CPU- en geheugenreservering bekijken met behulp van de kubectl describe opdracht. Zorg ervoor dat u vervangt door <example-pod> een van de pod-id's die zijn geretourneerd in de uitvoer van de vorige stap.

    kubectl describe pod hamster-<example-pod>
    

    De uitvoer moet er ongeveer uitzien als in de volgende voorbeelduitvoer:

    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. Bekijk bijgewerkte aanbevelingen van VPA met behulp van de kubectl describe opdracht om de informatie over de resource-vpa voor de cmdlet-vpa te beschrijven.

    kubectl describe vpa/hamster-vpa
    

    De uitvoer moet er ongeveer uitzien als in de volgende voorbeelduitvoer:

     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 voor verticale pods instellen

Het VerticalPodAutoscaler object stelt automatisch resourceaanvragen in op pods met een updateMode van Auto. U kunt een andere waarde instellen, afhankelijk van uw vereisten en testen. In dit voorbeeld maken en testen we een implementatiemanifest met twee pods, waarbij elk een container wordt uitgevoerd die 100 milliCPU en 50 MiB aan geheugen aanvraagt en het updateMode instelt op Recreate.

  1. Maak een bestand met de naam azure-autodeploy.yaml en 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"]
    
  2. Maak de pod met behulp van de kubectl create opdracht.

    kubectl create -f azure-autodeploy.yaml
    

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

  3. Bekijk de actieve pods met behulp van de kubectl get opdracht.

    kubectl get pods
    

    De uitvoer moet er ongeveer uitzien als in de volgende voorbeelduitvoer:

    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. Maak een bestand met de naam azure-vpa-auto.yaml en kopieer dit in het volgende manifest:

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

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

    kubectl create -f azure-vpa-auto.yaml
    
  6. Wacht enkele minuten en bekijk vervolgens de actieve pods met behulp van de kubectl get opdracht.

    kubectl get pods
    

    De uitvoer moet er ongeveer uitzien als in de volgende voorbeelduitvoer:

    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. Krijg gedetailleerde informatie over een van uw actieve pods met behulp van de kubectl get opdracht. Zorg ervoor dat u vervangt door <pod-name> de naam van een van uw pods uit uw vorige uitvoer.

    kubectl get pod <pod-name> --output yaml
    

    Uw uitvoer moet er ongeveer uitzien als in de volgende voorbeelduitvoer, die laat zien dat de VPA-controller de geheugenaanvraag heeft verhoogd naar 262144k en de CPU-aanvraag naar 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
    
  8. Krijg gedetailleerde informatie over de verticale automatische schaalaanpassing van pods en de aanbevelingen voor CPU en geheugen met behulp van de kubectl get opdracht.

    kubectl get vpa vpa-auto --output yaml
    

    De uitvoer moet er ongeveer uitzien als in de volgende voorbeelduitvoer:

     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 dit voorbeeld geven de resultaten in het target kenmerk aan dat de CPU of het geheugendoel voor de container niet optimaal hoeft te worden uitgevoerd. De resultaten kunnen echter variëren, afhankelijk van het resourcegebruik van de toepassing en het bijbehorende resourcegebruik.

    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

De aanbevelingsfunctie 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 om verschillende aanbevelingsfuncties te gebruiken.

In het volgende voorbeeld maken we een extra aanbeveelaar, passen we toe op een bestaande AKS-clust en configureren we het VPA-object om de extra aanbeveling te gebruiken.

  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
          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 voorbeeld van automatische extra-recomender.yaml schaalaanpassing van verticale pods met behulp van de kubectl apply opdracht.

    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 hamster-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 voorbeeld stellen we alleen CPU in controlledValues. controlledValues hiermee kunt u kiezen of u de resourceaanvragen van de container wilt bijwerken met behulp van deRequestsOnly optie, of door zowel resourceaanvragen 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 is van toepassing op 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 Auto de modus en aanbevelingen voor computing voor zowel CPU als geheugen.

  4. Implementeer het hamster-extra-recomender.yaml voorbeeld met behulp van de kubectl apply opdracht.

    kubectl apply -f hamster-extra-recommender.yaml
    
  5. Bewaak uw pods met behulp van de [kubectl getopdracht ]kubectl-get .

    kubectl get --watch pods -l app=hamster
    
  6. Wanneer de nieuwe cmdlet-pod wordt gestart, bekijkt u de bijgewerkte CPU- en geheugenreserveringen met behulp van de kubectl describe opdracht. Zorg ervoor dat u een van uw pod-id's vervangt <example-pod> .

    kubectl describe pod hamster-<example-pod>
    

    De uitvoer moet er ongeveer uitzien als in de volgende voorbeelduitvoer:

    State:          Running
      Started:      Wed, 28 Sep 2022 15:09:51 -0400
    Ready:          True
    Restart Count:  0
    Requests:
      cpu:        587m
      memory:     262144k
    Environment:  <none>
    
  7. Bekijk bijgewerkte aanbevelingen van VPA met behulp van de kubectl describe opdracht.

    kubectl describe vpa/hamster-vpa
    

    De uitvoer moet er ongeveer uitzien als in de volgende voorbeelduitvoer:

    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 met automatische schaalaanpassing van verticale pods oplossen

Als u problemen ondervindt met de automatische schaalaanpassing van verticale pods, kunt u de systeemonderdelen en de aangepaste resourcedefinitie oplossen om het probleem te identificeren.

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

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

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

  2. Controleer voor elk van de pods die in uw vorige uitvoer worden geretourneerd, of de systeemonderdelen fouten registreren met behulp van de volgende opdracht:

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

    kubectl get customresourcedefinition | grep verticalpodautoscalers
    

Volgende stappen

Voor meer informatie over het VPA-object raadpleegt u de Api-verwijzing voor verticale pods voor automatische schaalaanpassing.