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 klastremaz 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.
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"
hamster.yaml
Wdróż przykład narzędzia Vertical Pod Autoscaler przy użyciukubectl apply
polecenia .kubectl apply -f hamster.yaml
Po kilku minutach polecenie zostanie wykonane i zwróci informacje o klastrze w formacie JSON.
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
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.
Monitoruj zasobniki przy użyciu
kubectl get
polecenia .kubectl get --watch pods -l app=hamster
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ść.
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 Auto
updateMode
. 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
.
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"]
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.
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
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 nazwievpa-auto-deployment
należy doVerticalPodAutoscaler
. 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.Zastosuj manifest do klastra przy użyciu
kubectl apply
polecenia .kubectl create -f azure-vpa-auto.yaml
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
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
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 iupperBound
, 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.
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
extra-recomender.yaml
Wdróż przykład narzędzia Vertical Pod Autoscaler przy użyciukubectl apply
polecenia .kubectl apply -f extra-recommender.yaml
Po kilku minutach polecenie zostanie wykonane i zwróci informacje o klastrze w formacie JSON.
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 wcontrolledResources
elemecie , moduł rekomendacji nie odpowiada na zdarzenia OOM. W tym przykładzie ustawiamy tylko procesor CPU w elemeciecontrolledValues
.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życiuRequestsAndLimits
opcji . Domyślna wartość toRequestsAndLimits
. Jeśli używaszRequestsAndLimits
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.hamster-extra-recomender.yaml
Wdróż przykład przy użyciukubectl apply
polecenia .kubectl apply -f hamster-extra-recommender.yaml
Monitoruj zasobniki przy użyciu
[kubectl get
polecenia ]kubectl-get .kubectl get --watch pods -l app=hamster
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>
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.
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
.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\}'
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.
Azure Kubernetes Service