Udostępnij za pośrednictwem


Korzystanie z narzędzia Autoscaler pionowych zasobników w usłudze Azure Kubernetes Service (AKS)

W tym artykule pokazano, jak używać narzędzia Vertical Pod Autoscaler (VPA) w klastrze usługi Azure Kubernetes Service (AKS). VPA automatycznie dostosowuje żądania CPU i pamięci dla zasobników, aby dopasować je do wzorców użycia twoich obciążeń. Ta funkcja pomaga zoptymalizować wydajność aplikacji i zmniejszyć koszty związane z obsługą obciążeń w usłudze AKS.

Aby uzyskać więcej informacji, zobacz omówienie pionowego skalowacza zasobników.

Zanim rozpoczniesz

  • Jeśli masz istniejący klaster usługi AKS, upewnij się, że jest uruchomiony program Kubernetes w wersji 1.24 lub nowszej.

  • Musisz zainstalować i skonfigurować interfejs wiersza polecenia platformy Azure w wersji 2.52.0 lub nowszej. Uruchom polecenie az --version, aby dowiedzieć się, jaka wersja jest używana. Jeśli konieczna będzie instalacja lub uaktualnienie, zobacz Instalowanie interfejsu wiersza polecenia platformy Azure.

  • Jeśli włączasz usługę VPA w istniejącym klastrze, upewnij się, że kubectl jest zainstalowany i skonfigurowany do połączenia z twoim klastrem AKS przy użyciu polecenia az aks get-credentials.

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

Wdróż Vertical Pod Autoscaler w nowym klastrze

  • Utwórz nowy klaster AKS z włączonym VPA, używając polecenia az aks create z flagą --enable-vpa.

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

    Po kilku minutach polecenie zostanie wykonane i zwróci informacje o klastrze w formacie JSON.

Aktualizowanie istniejącego klastra w celu korzystania z narzędzia do automatycznego skalowania zasobników pionowych

  • Zaktualizuj istniejący klaster, aby używał VPA, używając polecenia az aks update z flagą --enable-vpa.

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

    Po kilku minutach polecenie zostanie wykonane i zwróci informacje o klastrze w formacie JSON.

Wyłącz Pionowy Autoskalator zasobników w istniejącym klastrze

  • Wyłącz VPA w istniejącym klasterze, używając polecenia az aks update z flagą --disable-vpa.

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

    Po kilku minutach polecenie zostanie wykonane i zwróci informacje o klastrze w formacie JSON.

Testowanie instalacji autoskalatora zasobnika pionowego

W poniższym przykładzie utworzymy wdrożenie z dwoma zasobnikami, z których każdy uruchamia pojedynczy kontener, który wymaga 100 milicorów i próbuje wykorzystać nieco ponad 500 milicorów. Tworzymy również konfigurację VPA wskazującą na wdrożenie. VpA obserwuje zachowanie zasobników, a po około pięciu minutach aktualizuje zasobniki, aby zażądać 500 milicores.

  1. Utwórz plik o nazwie hamster.yaml i skopiuj poniższy manifest przykładu Vertical Pod Autoscaler z repozytorium kubernetes/autoscaler w serwisie GitHub.

    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. Rozpocznij wdrażanie przykładu narzędzia Vertical Pod Autoscaler przy użyciu polecenia kubectl apply.

    kubectl apply -f hamster.yaml
    

    Po kilku minutach polecenie zostanie wykonane i zwróci informacje o klastrze w formacie JSON.

  3. Wyświetl uruchomione zasobniki przy użyciu kubectl get polecenia .

    kubectl get pods -l app=hamster
    

    Dane wyjściowe powinny wyglądać podobnie do następujących przykładowych danych wyjściowych:

    hamster-78f9dcdd4c-hf7gk   1/1     Running   0          24s
    hamster-78f9dcdd4c-j9mc7   1/1     Running   0          24s
    
  4. Wyświetl rezerwacje procesora i pamięci na jednym z zasobników używając polecenia kubectl describe. Upewnij się, że zastąpisz <example-pod> jednym z identyfikatorów zasobników zwróconych w wynikach z poprzedniego kroku.

    kubectl describe pod hamster-<example-pod>
    

    Dane wyjściowe powinny wyglądać podobnie do następujących przykładowych danych wyjściowych:

     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>
    

    Zasobnik ma 100 milicpu i 50 mibibajtów pamięci zarezerwowanej w tym przykładzie. W przypadku tej przykładowej aplikacji zasobnik potrzebuje mniej niż 100 milicpu do uruchomienia, więc nie ma dostępnej pojemności procesora. Zasobniki również rezerwują mniej pamięci, niż jest potrzebne. Wdrożenie systemu Vertical Pod Autoscaler vpa-recommender analizuje zasobniki hostujące aplikację chomika, aby sprawdzić, czy wymagania dotyczące procesora CPU i pamięci są odpowiednie. Jeśli potrzebne są korekty, vpa-updater ponownie uruchomi zasobniki ze zaktualizowanymi wartościami.

  5. Monitoruj zasobniki przy użyciu polecenia kubectl get.

    kubectl get --watch pods -l app=hamster
    
  6. Po uruchomieniu nowego zasobnika chomika można wyświetlić zaktualizowane rezerwacje zasobów CPU i pamięci przy użyciu kubectl describe. Upewnij się, że zastąpisz <example-pod> jednym z identyfikatorów zasobników wygenerowanych w danych wyjściowych z poprzedniego kroku.

    kubectl describe pod hamster-<example-pod>
    

    Dane wyjściowe powinny wyglądać podobnie do następujących przykładowych danych wyjściowych:

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

    W poprzednich danych wyjściowych widać, że rezerwacja procesora wzrosła do 587 milicpu, czyli ponad pięciokrotnie w stosunku do oryginalnej wartości. Pamięć wzrosła do 262 144 kilobajtów, czyli około 250 mibibajtów lub pięć razy więcej niż oryginalna wartość. Ten zasobnik był niedostatecznie wyposażony, a narzędzie Vertical Pod Autoscaler poprawiło szacunek na znacznie bardziej odpowiednią wartość.

  7. Wyświetl zaktualizowane zalecenia z VPA przy użyciu polecenia kubectl describe do opisania informacji o zasobie hamster-vpa.

    kubectl describe vpa/hamster-vpa
    

    Dane wyjściowe powinny wyglądać podobnie do następujących przykładowych danych wyjściowych:

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

Ustawianie żądań automatycznego skalowania zasobnika pionowego

Obiekt VerticalPodAutoscaler automatycznie ustawia żądania zasobów na zasobnikach z updateMode równym Auto. Możesz ustawić inną wartość w zależności od wymagań i testowania. W tym przykładzie utworzymy i przetestujemy manifest wdrożenia z dwoma zasobnikami, z których każdy uruchamia kontener, który żąda 100 miliCPU i 50 MiB pamięci, a następnie ustawia updateMode wartość na Recreate.

  1. Utwórz plik o nazwie azure-autodeploy.yaml i skopiuj go w następującym manifeście:

    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. Utwórz zasobnik za pomocą polecenia kubectl create.

    kubectl create -f azure-autodeploy.yaml
    

    Po kilku minutach polecenie zostanie wykonane i zwróci informacje o klastrze w formacie JSON.

  3. Wyświetl uruchomione zasobniki przy użyciu kubectl get polecenia .

    kubectl get pods
    

    Dane wyjściowe powinny wyglądać podobnie do następujących przykładowych danych wyjściowych:

    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. Utwórz plik o nazwie azure-vpa-auto.yaml i skopiuj go w następującym manifeście:

    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"
    

    Wartość targetRef.name określa, że każdy pod kontrolowany przez wdrożenie o nazwie vpa-auto-deployment należy do VerticalPodAutoscaler. Wartość updateModeRecreate oznacza, że kontroler pionowego automatycznego skalowania zasobników może usunąć zasobnik, dostosować żądania zasobów CPU i pamięci, a następnie utworzyć nowy zasobnik.

  5. Zastosuj manifest do klastra za pomocą polecenia kubectl apply.

    kubectl create -f azure-vpa-auto.yaml
    
  6. Poczekaj kilka minut, a następnie wyświetl uruchomione zasobniki za pomocą polecenia kubectl get.

    kubectl get pods
    

    Dane wyjściowe powinny wyglądać podobnie do następujących przykładowych danych wyjściowych:

    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. Uzyskaj szczegółowe informacje o jednym z uruchomionych zasobników za pomocą polecenia kubectl get. Pamiętaj, aby zastąpić <pod-name> nazwą jednego z zasobników z poprzedniego wyniku.

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

    Dane wyjściowe powinny wyglądać podobnie do następujących przykładowych danych wyjściowych, które pokazują, że kontroler VPA zwiększył żądanie pamięci do 262144k, a żądanie procesora CPU do 25 miliCPU:

    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. Uzyskaj szczegółowe informacje na temat Pionowego Autoskalowacza Zasobników i jego zaleceń dotyczących procesora i pamięci przy użyciu polecenia kubectl get.

    kubectl get vpa vpa-auto --output yaml
    

    Dane wyjściowe powinny wyglądać podobnie do następujących przykładowych danych wyjściowych:

     recommendation:
      containerRecommendations:
      - containerName: mycontainer
        lowerBound:
          cpu: 25m
          memory: 262144k
        target:
          cpu: 25m
          memory: 262144k
        uncappedTarget:
          cpu: 25m
          memory: 262144k
        upperBound:
          cpu: 230m
          memory: 262144k
    

    W tym przykładzie wyniki w atrybucie target określają, że nie trzeba zmieniać celu procesora ani pamięci, aby kontener działał optymalnie. Jednak wyniki mogą się różnić w zależności od aplikacji i jej wykorzystania zasobów.

    Pionowy Autoskaler Zasobników używa atrybutów lowerBound oraz upperBound, aby zdecydować, czy usunąć zasobnik i zamienić go na nowy zasobnik. Jeśli zasobnik ma żądania mniejsze niż dolna granica lub większa niż górna granica, narzędzie Vertical Pod Autoscaler usuwa zasobnik i zastępuje go zasobnikem spełniającym atrybut docelowy.

Dodatkowy rekomendator dla Vertical Pod Autoscaler

Rekomendator dostarcza rekomendacji dotyczących wykorzystania zasobów na podstawie ich konsumpcji w czasie rzeczywistym. Usługa AKS wdraża Rekomendator, gdy klaster włącza VPA. Możesz wdrożyć dostosowany moduł rekomendacji lub dodatkowy moduł rekomendacji z tym samym obrazem co domyślny. Zaletą dostosowanego modułu rekomendacji jest możliwość dostosowania logiki rekomendacji. Dzięki dodatkowi rekomendatora można podzielić VPAs na partycje, aby używać różnych Rekomendatorów.

W poniższym przykładzie utworzymy dodatkowy moduł polecający, zastosujemy go do istniejącego klastra usługi AKS i skonfigurujemy obiekt VPA, aby używał dodatkowego modułu zalecającego.

  1. Utwórz plik o nazwie extra_recommender.yaml i skopiuj go w następującym manifeście:

    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. extra-recomender.yaml Wdróż przykład narzędzia Vertical Pod Autoscaler przy użyciu kubectl apply polecenia .

    kubectl apply -f extra-recommender.yaml 
    

    Po kilku minutach polecenie zostanie wykonane i zwróci informacje o klastrze w formacie JSON.

  3. Utwórz plik o nazwie hamster-extra-recommender.yaml i skopiuj go w następującym manifeście:

    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" 
    

    Jeśli memory parametr nie jest określony w controlledResourceselemecie , moduł rekomendacji nie odpowiada na zdarzenia OOM. W tym przykładzie ustawiamy tylko procesor CPU w elemencie controlledValues. controlledValues Umożliwia wybranie, czy żądania zasobów kontenera mają być aktualizowane przy użyciuRequestsOnly opcji , czy też zarówno żądań zasobów, jak i limitów przy użyciu RequestsAndLimits opcji . Domyślna wartość to RequestsAndLimits. Jeśli używasz opcji RequestsAndLimits, żądania są obliczane na podstawie rzeczywistego użycia, a limity są obliczane na podstawie współczynnika żądania do limitu obecnie działającego poda.

    Jeśli na przykład zaczniesz od modułu, który wymaga 2 procesorów CPU i ustala limity do 4 procesorów CPU, VPA zawsze ustawia limit na dwa razy więcej niż wymagania. Ta sama zasada dotyczy pamięci. W przypadku korzystania z RequestsAndLimits trybu może on służyć jako schemat dla początkowych żądań i limitów zasobów aplikacji.

    Obiekt VPA można uprościć dzięki trybowi Auto i zaleceniom obliczeniowym dotyczącym zarówno CPU, jak i pamięci.

  4. hamster-extra-recomender.yaml Wdróż przykład przy użyciu kubectl apply polecenia .

    kubectl apply -f hamster-extra-recommender.yaml
    
  5. Monitoruj pody przy użyciu polecenia [kubectl getkubectl-get.

    kubectl get --watch pods -l app=hamster
    
  6. Po uruchomieniu nowego zasobnika chomika, wyświetl zaktualizowane rezerwacje CPU i pamięci przy użyciu polecenia kubectl describe. Upewnij się, że zastąpisz <example-pod> jednym z identyfikatorów zasobnika.

    kubectl describe pod hamster-<example-pod>
    

    Dane wyjściowe powinny wyglądać podobnie do następujących przykładowych danych wyjściowych:

    State:          Running
      Started:      Wed, 28 Sep 2022 15:09:51 -0400
    Ready:          True
    Restart Count:  0
    Requests:
      cpu:        587m
      memory:     262144k
    Environment:  <none>
    
  7. Wyświetl zaktualizowane zalecenia VPA, używając polecenia kubectl describe.

    kubectl describe vpa/hamster-vpa
    

    Dane wyjściowe powinny wyglądać podobnie do następujących przykładowych danych wyjściowych:

    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
    

Rozwiązywanie problemów z pionowym autoskalerem zasobników

Jeśli wystąpią problemy z Pionowym Autoskalatorem Zasobników, możesz rozwiązać problemy związane ze składnikami systemu i niestandardową definicją zasobów w celu zidentyfikowania problemu.

  1. Sprawdź, czy wszystkie składniki systemowe są uruchomione przy użyciu następującego polecenia:

    kubectl get pods|grep vpa
    

    Dane wyjściowe powinny zawierać trzy zasobniki: rekomendator, aktualizator i kontroler przyjęć, wszystkie ze stanem Running.

  2. Dla każdego zasobnika zwróconego w poprzednich danych wyjściowych sprawdź, czy składniki systemowe rejestrują wszelkie błędy przy użyciu następującego polecenia:

    kubectl logs [pod name] | grep -e '^E[0-9]\{4\}'
    
  3. Sprawdź, czy niestandardowa definicja zasobu została utworzona przy użyciu następującego polecenia:

    kubectl get customresourcedefinition | grep verticalpodautoscalers
    

Następne kroki

Aby dowiedzieć się więcej na temat obiektu VPA, zobacz dokumentację interfejsu API pionowego automatycznego skalowania zasobników.