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 deaz 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.
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"
Implementeer het voorbeeld van automatische
hamster.yaml
schaalaanpassing van verticale pods met behulp van dekubectl apply
opdracht.kubectl apply -f hamster.yaml
Na enkele minuten is de opdracht voltooid en retourneert deze informatie over het cluster in JSON-indeling.
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
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.
Bewaak de pods met behulp van de
kubectl get
opdracht.kubectl get --watch pods -l app=hamster
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.
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
.
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"]
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.
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
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 naamvpa-auto-deployment
behoort totVerticalPodAutoscaler
. DeupdateMode
waarde van betekent dat de controller voor automatische schaalaanpassing vanRecreate
verticale pods een pod kan verwijderen, de CPU- en geheugenaanvragen kan aanpassen en vervolgens een nieuwe pod kan maken.Pas het manifest toe op het cluster met behulp van de
kubectl apply
opdracht.kubectl create -f azure-vpa-auto.yaml
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
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
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
enupperBound
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.
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
Implementeer het voorbeeld van automatische
extra-recomender.yaml
schaalaanpassing van verticale pods met behulp van dekubectl 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.
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,controlledResources
reageert de aanbevelingsfunctie niet op OOM-gebeurtenissen. In dit voorbeeld stellen we alleen CPU incontrolledValues
.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 deRequestsAndLimits
optie. De standaardwaarde isRequestsAndLimits
. Als u deRequestsAndLimits
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.Implementeer het
hamster-extra-recomender.yaml
voorbeeld met behulp van dekubectl apply
opdracht.kubectl apply -f hamster-extra-recommender.yaml
Bewaak uw pods met behulp van de
[kubectl get
opdracht ]kubectl-get .kubectl get --watch pods -l app=hamster
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>
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.
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
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\}'
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.
Azure Kubernetes Service