Dela via


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

  1. 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"
    
  2. Distribuera exemplet hamster.yaml Vertical Pod Autoscaler med kommandot kubectl apply .

    kubectl apply -f hamster.yaml
    

    Efter några minuter slutförs kommandot och returnerar JSON-formaterad information om klustret.

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

  5. Övervaka poddarna med kommandot kubectl get .

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

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

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

  3. 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
    
  4. 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 namnet vpa-auto-deployment tillhör VerticalPodAutoscaler. Värdet updateMode 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.

  5. Använd manifestet på klustret med kommandot kubectl apply .

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

  1. 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 
    
  2. Distribuera exemplet extra-recomender.yaml Vertical Pod Autoscaler med kommandot kubectl apply .

    kubectl apply -f extra-recommender.yaml 
    

    Efter några minuter slutförs kommandot och returnerar JSON-formaterad information om klustret.

  3. 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 i controlledResourcessvarar inte rekommenderaren på OOM-händelser. I det här exemplet anger vi bara CPU i controlledValues. 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 av RequestsAndLimits alternativet . Standardvärdet är RequestsAndLimits. Om du använder RequestsAndLimits 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.

  4. Distribuera exemplet hamster-extra-recomender.yaml med kommandot kubectl apply .

    kubectl apply -f hamster-extra-recommender.yaml
    
  5. Övervaka dina poddar med kommandot [kubectl get]kubectl-get .

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

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

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