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 procesora CPU i pamięci dla zasobników w celu dopasowania ich do wzorców użycia obciążeń. Ta funkcja pomaga zoptymalizować wydajność aplikacji i zmniejszyć koszty uruchamiania obciążeń w usłudze AKS.

Aby uzyskać więcej informacji, zobacz Pionowy narzędzie do automatycznego skalowania zasobników — omówienie.

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łączysz usługę VPA w istniejącym klastrze, upewnij się, że kubectl zainstalowano i skonfigurowano połączenie z klastrem az aks get-credentials usługi AKS przy użyciu polecenia .

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

Wdrażanie narzędzia do automatycznego skalowania zasobników pionowych w nowym klastrze

  • Utwórz nowy klaster usługi AKS z włączoną usługą VPA przy użyciu az aks create polecenia 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 przy użyciu az aks update polecenia 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łączanie narzędzia Autoscaler pionowych zasobników w istniejącym klastrze

  • Wyłącz vpA w istniejącym klastrze przy użyciu az aks update polecenia 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 żąda 100 milicore i próbuje użyć nieco powyżej 500 milicores. Tworzymy również konfigurację VPA wskazującą 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 w następującym manifeście przykładu narzędzia Vertical Pod Autoscaler z repozytorium Kubernetes/autoscaler w usłudze 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. hamster.yaml Wdróż przykład narzędzia Vertical Pod Autoscaler przy użyciu kubectl apply polecenia .

    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 CPU i pamięci na jednym z zasobników przy użyciu kubectl describe polecenia . Upewnij się, że zastąpisz <example-pod> element jednym z identyfikatorów zasobników zwróconych 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:

     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 CPU. Zasobniki również rezerwuje mniej pamięci niż jest to potrzebne. Wdrożenie modułu vpa-recommender vertical pod Autoscaler analizuje zasobniki obsługują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 kubectl get polecenia .

    kubectl get --watch pods -l app=hamster
    
  6. Po uruchomieniu nowego zasobnika chomika można wyświetlić zaktualizowane rezerwacje procesora CPU i pamięci przy użyciu kubectl describe polecenia . Upewnij się, że zastąpisz <example-pod> element jednym z identyfikatorów zasobników zwróconych 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 CPU wzrosła do 587 milicpu, czyli ponad pięć razy więcej niż oryginalna wartość. 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 zasób, a narzędzie Vertical Pod Autoscaler poprawiło oszacowanie o znacznie bardziej odpowiednią wartość.

  7. Wyświetl zaktualizowane zalecenia z vpA przy użyciu polecenia , kubectl describe aby opisać informacje 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 za pomocą elementu AutoupdateMode . 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 przy użyciu kubectl create polecenia .

    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 zasobnik kontrolowany przez wdrożenie o nazwie vpa-auto-deployment należy do VerticalPodAutoscaler. Wartość updateMode Recreate oznacza, że pionowy kontroler autoskalowania zasobnika może usunąć zasobnik, dostosować żądania procesora CPU i pamięci, a następnie utworzyć nowy zasobnik.

  5. Zastosuj manifest do klastra przy użyciu kubectl apply polecenia .

    kubectl create -f azure-vpa-auto.yaml
    
  6. Zaczekaj kilka minut, a następnie 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-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 przy użyciu kubectl get polecenia . Pamiętaj, aby zastąpić <pod-name> ciąg nazwą jednego z zasobników z poprzednich danych wyjściowych.

    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 narzędzia Autoscaler pionowych zasobników i jego zaleceń dotyczących procesora CPU i pamięci przy użyciu kubectl get polecenia .

    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 musi zmieniać procesora CPU ani miejsca docelowego pamięci dla kontenera, aby działał optymalnie. Jednak wyniki mogą się różnić w zależności od aplikacji i jej wykorzystania zasobów.

    Narzędzie Autoscaler pionowych zasobników używa lowerBound atrybutów i 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 moduł polecający do automatycznego skalowania pionowych zasobników

Moduł rekomendacji zawiera zalecenia dotyczące użycia zasobów na podstawie użycia zasobów w czasie rzeczywistym. Usługa AKS wdraża moduł rekomendacji, 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 dodatkowemu rekomendatorowi można podzielić na partycje vpAs, aby używać różnych rekomendacji.

W poniższym przykładzie utworzymy dodatkowy moduł polecający, zastosujemy do istniejącego żądła usługi AKS i skonfigurujemy obiekt VPA tak, 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 elemecie 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 RequestsAndLimits tej opcji, żądania są obliczane na podstawie rzeczywistego użycia, a limity są obliczane na podstawie współczynnika żądań i limitów bieżącego zasobnika.

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

    Obiekt VPA można uprościć przy użyciu Auto trybu i zaleceń obliczeniowych dotyczących procesora CPU 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 zasobniki przy użyciu [kubectl getpolecenia ]kubectl-get .

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

    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 z poziomu kubectl describe vpA przy użyciu polecenia .

    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 autoskalatorem pionowych zasobników

Jeśli wystąpią problemy z pionowym narzędziem do automatycznego skalowania zasobników, możesz rozwiązać problemy ze składnikami systemowymi i niestandardową definicją zasobów, aby zidentyfikować problem.

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

    kubectl --namespace=kube-system 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 --namespace=kube-system 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 narzędzia do automatycznego skalowania zasobników.