Använda autoskalning av lodrät podd i Azure Kubernetes Service (AKS)
Den här artikeln visar hur du använder VPA (Vertical Pod Autoscaler) i ditt AkS-kluster (Azure Kubernetes Service). VPA justerar automatiskt cpu- och minnesbegäranden för dina poddar så att de matchar användningsmönstren för dina arbetsbelastningar. Den här funktionen hjälper till att optimera prestanda för dina program och minska kostnaden för att köra dina arbetsbelastningar i AKS.
Mer information finns i översikten över autoskalning av lodrät podd.
Innan du börjar
Om du har ett befintligt AKS-kluster kontrollerar du att det kör Kubernetes version 1.24 eller senare.
Du behöver Azure CLI version 2.52.0 eller senare installerad och konfigurerad. Kör
az --version
för att hitta versionen. Om du behöver installera eller uppgradera kan du läsa Installera Azure CLI.Om du aktiverar VPA i ett befintligt kluster kontrollerar du att
kubectl
det är installerat och konfigurerat för att ansluta till ditt AKS-kluster med hjälp avaz aks get-credentials
kommandot .az aks get-credentials --name <cluster-name> --resource-group <resource-group-name>
Distribuera autoskalning av lodrät podd i ett nytt kluster
Skapa ett nytt AKS-kluster med VPA aktiverat med kommandot
az aks create
med--enable-vpa
flaggan .az aks create --name <cluster-name> --resource-group <resource-group-name> --enable-vpa --generate-ssh-keys
Efter några minuter slutförs kommandot och returnerar JSON-formaterad information om klustret.
Uppdatera ett befintligt kluster för att använda autoskalning av lodrät podd
Uppdatera ett befintligt kluster för att använda VPA med hjälp av
az aks update
kommandot med--enable-vpa
flaggan .az aks update --name <cluster-name> --resource-group <resource-group-name> --enable-vpa
Efter några minuter slutförs kommandot och returnerar JSON-formaterad information om klustret.
Inaktivera autoskalning av lodrät podd i ett befintligt kluster
Inaktivera VPA på ett befintligt kluster med kommandot
az aks update
med--disable-vpa
flaggan .az aks update --name <cluster-name> --resource-group <resource-group-name> --disable-vpa
Efter några minuter slutförs kommandot och returnerar JSON-formaterad information om klustret.
Testa installation av vertikal podd autoskalning
I följande exempel skapar vi en distribution med två poddar, var och en kör en enda container som begär 100 millicore och försöker använda något över 500 millicores. Vi skapar också en VPA-konfiguration som pekar på distributionen. VPA observerar poddarnas beteende och uppdaterar poddarna efter cirka fem minuter för att begära 500 millicores.
Skapa en fil med namnet
hamster.yaml
och kopiera i följande manifest i exemplet Vertical Pod Autoscaler från GitHub-lagringsplatsen 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"
Distribuera exemplet
hamster.yaml
Vertical Pod Autoscaler med kommandotkubectl apply
.kubectl apply -f hamster.yaml
Efter några minuter slutförs kommandot och returnerar JSON-formaterad information om klustret.
Visa de poddar som körs med kommandot
kubectl get
.kubectl get pods -l app=hamster
Dina utdata bör se ut ungefär som följande exempelutdata:
hamster-78f9dcdd4c-hf7gk 1/1 Running 0 24s hamster-78f9dcdd4c-j9mc7 1/1 Running 0 24s
Visa cpu- och minnesreservationerna på en av poddarna med hjälp av
kubectl describe
kommandot . Se till att du ersätter<example-pod>
med ett av de podd-ID:t som returnerades i dina utdata från föregående steg.kubectl describe pod hamster-<example-pod>
Dina utdata bör se ut ungefär som följande exempelutdata:
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>
Podden har 100 millicpu och 50 Mibibyte minne reserverade i det här exemplet. För det här exempelprogrammet behöver podden mindre än 100 millicpu för att köras, så det finns ingen tillgänglig processorkapacitet. Poddarna reserverar också mindre minne än vad som behövs. Distributionen vertical pod autoscaler vpa-recommender analyserar poddarna som är värd för hamsterprogrammet för att se om kraven på processor och minne är lämpliga. Om justeringar behövs startar vpa-updater om poddarna med uppdaterade värden.
Övervaka poddarna med kommandot
kubectl get
.kubectl get --watch pods -l app=hamster
När den nya hamsterpodden startar kan du visa de uppdaterade cpu- och minnesreservationerna
kubectl describe
med kommandot . Se till att du ersätter<example-pod>
med ett av de podd-ID:t som returnerades i dina utdata från föregående steg.kubectl describe pod hamster-<example-pod>
Dina utdata bör se ut ungefär som följande exempelutdata:
State: Running Started: Wed, 28 Sep 2022 15:09:51 -0400 Ready: True Restart Count: 0 Requests: cpu: 587m memory: 262144k Environment: <none>
I föregående utdata kan du se att CPU-reservationen ökade till 587 millicpu, vilket är över fem gånger det ursprungliga värdet. Minnet ökade till 262 144 kilobyte, vilket är cirka 250 Mibibyte, eller fem gånger det ursprungliga värdet. Den här podden var underbetonad och Autoskalning av lodrät podd korrigerade uppskattningen med ett mycket mer lämpligt värde.
Visa uppdaterade rekommendationer från VPA med hjälp av
kubectl describe
kommandot för att beskriva information om hamster-vpa-resursen.kubectl describe vpa/hamster-vpa
Dina utdata bör se ut ungefär som följande exempelutdata:
State: Running Started: Wed, 28 Sep 2022 15:09:51 -0400 Ready: True Restart Count: 0 Requests: cpu: 587m memory: 262144k Environment: <none>
Ange lodrät autoskalning av poddar
Objektet VerticalPodAutoscaler
anger automatiskt resursbegäranden på poddar med en updateMode
av Auto
. Du kan ange ett annat värde beroende på dina krav och testning. I det här exemplet skapar och testar vi ett distributionsmanifest med två poddar, var och en kör en container som begär 100 milliCPU och 50 MiB minne och anger updateMode
till Recreate
.
Skapa en fil med namnet
azure-autodeploy.yaml
och kopiera i följande 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"]
Skapa podden med kommandot
kubectl create
.kubectl create -f azure-autodeploy.yaml
Efter några minuter slutförs kommandot och returnerar JSON-formaterad information om klustret.
Visa de poddar som körs med kommandot
kubectl get
.kubectl get pods
Dina utdata bör se ut ungefär som följande exempelutdata:
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
Skapa en fil med namnet
azure-vpa-auto.yaml
och kopiera i följande 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"
Värdet
targetRef.name
anger att alla poddar som styrs av en distribution med namnetvpa-auto-deployment
tillhörVerticalPodAutoscaler
. VärdetupdateMode
Recreate
för innebär att den lodräta autoskalningsstyrenheten för poddar kan ta bort en podd, justera cpu- och minnesbegäranden och sedan skapa en ny podd.Använd manifestet på klustret med kommandot
kubectl apply
.kubectl create -f azure-vpa-auto.yaml
Vänta några minuter och visa sedan de poddar som körs med kommandot
kubectl get
.kubectl get pods
Dina utdata bör se ut ungefär som följande exempelutdata:
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
Få detaljerad information om en av dina poddar som körs med kommandot
kubectl get
. Se till att du ersätter<pod-name>
med namnet på en av dina poddar från dina tidigare utdata.kubectl get pod <pod-name> --output yaml
Dina utdata bör se ut ungefär som i följande exempelutdata, vilket visar att VPA-styrenheten ökade minnesbegäran till 262144k och CPU-begäran till 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
Få detaljerad information om autoskalning av lodrät podd och dess rekommendationer för CPU och minne med hjälp av
kubectl get
kommandot .kubectl get vpa vpa-auto --output yaml
Dina utdata bör se ut ungefär som följande exempelutdata:
recommendation: containerRecommendations: - containerName: mycontainer lowerBound: cpu: 25m memory: 262144k target: cpu: 25m memory: 262144k uncappedTarget: cpu: 25m memory: 262144k upperBound: cpu: 230m memory: 262144k
I det här exemplet anger resultatet i
target
attributet att den inte behöver ändra cpu- eller minnesmålet för att containern ska köras optimalt. Resultaten kan dock variera beroende på programmet och dess resursanvändning.Autoskalning av lodrät podd använder attributen
lowerBound
ochupperBound
för att avgöra om en podd ska tas bort och ersättas med en ny podd. Om en podd har begäranden som är mindre än den nedre gränsen eller större än den övre gränsen, tar autoskalningsenheten lodrät podd bort podden och ersätter den med en podd som uppfyller målattributet.
Extrarekommendator för lodrät podd autoskalning
Rekommenderaren ger rekommendationer för resursanvändning baserat på resursförbrukning i realtid. AKS distribuerar en rekommenderare när ett kluster aktiverar VPA. Du kan distribuera en anpassad rekommenderare eller en extra rekommenderare med samma avbildning som standardvärdet. Fördelen med att ha en anpassad rekommenderare är att du kan anpassa rekommendationslogik. Med en extra rekommenderare kan du partitionera virtuella vpn-program för att använda olika rekommenderare.
I följande exempel skapar vi en extra rekommenderare, tillämpar på en befintlig AKS-clust och konfigurerar VPA-objektet så att det använder den extra rekommendationen.
Skapa en fil med namnet
extra_recommender.yaml
och kopiera i följande 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
Distribuera exemplet
extra-recomender.yaml
Vertical Pod Autoscaler med kommandotkubectl apply
.kubectl apply -f extra-recommender.yaml
Efter några minuter slutförs kommandot och returnerar JSON-formaterad information om klustret.
Skapa en fil med namnet
hamster-extra-recommender.yaml
och kopiera i följande 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"
Om
memory
inte anges icontrolledResources
svarar inte rekommenderaren på OOM-händelser. I det här exemplet anger vi bara CPU icontrolledValues
.controlledValues
låter dig välja om du vill uppdatera containerns resursbegäranden med hjälp avRequestsOnly
alternativet eller av både resursbegäranden och begränsningar med hjälp avRequestsAndLimits
alternativet . Standardvärdet ärRequestsAndLimits
. Om du använderRequestsAndLimits
alternativet beräknas begäranden baserat på den faktiska användningen och gränserna beräknas baserat på den aktuella poddens förhållande för begäran och gräns.Om du till exempel börjar med en podd som begär 2 processorer och begränsar till 4 processorer, anger VPA alltid gränsen till dubbelt så mycket som begäranden. Samma princip gäller för minne. När du använder
RequestsAndLimits
läget kan det fungera som en skiss för dina första begäranden och begränsningar för programresurser.Du kan förenkla VPA-objektet med hjälp av
Auto
läges- och beräkningsrekommendationer för både CPU och minne.Distribuera exemplet
hamster-extra-recomender.yaml
med kommandotkubectl apply
.kubectl apply -f hamster-extra-recommender.yaml
Övervaka dina poddar med kommandot
[kubectl get
]kubectl-get .kubectl get --watch pods -l app=hamster
När den nya hamsterpodden startar visar du de uppdaterade CPU- och minnesreservationerna
kubectl describe
med kommandot . Se till att du ersätter<example-pod>
med ett av dina podd-ID:t.kubectl describe pod hamster-<example-pod>
Dina utdata bör se ut ungefär som följande exempelutdata:
State: Running Started: Wed, 28 Sep 2022 15:09:51 -0400 Ready: True Restart Count: 0 Requests: cpu: 587m memory: 262144k Environment: <none>
Visa uppdaterade rekommendationer från VPA med kommandot
kubectl describe
.kubectl describe vpa/hamster-vpa
Dina utdata bör se ut ungefär som följande exempelutdata:
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
Felsöka autoskalning av lodrät podd
Om du stöter på problem med autoskalning av lodrät podd kan du felsöka systemkomponenterna och den anpassade resursdefinitionen för att identifiera problemet.
Kontrollera att alla systemkomponenter körs med följande kommando:
kubectl --namespace=kube-system get pods|grep vpa
Dina utdata bör visa tre poddar: rekommenderare, uppdaterings- och antagningskontrollant, alla med statusen
Running
.För var och en av poddarna som returnerades i dina tidigare utdata kontrollerar du att systemkomponenterna loggar eventuella fel med hjälp av följande kommando:
kubectl --namespace=kube-system logs [pod name] | grep -e '^E[0-9]\{4\}'
Kontrollera att den anpassade resursdefinitionen skapades med hjälp av följande kommando:
kubectl get customresourcedefinition | grep verticalpodautoscalers
Nästa steg
Mer information om VPA-objektet finns i API-referensen lodrät podd autoskalning.
Azure Kubernetes Service