Использование автомасштабирования вертикального модуля Pod в Служба Azure Kubernetes (AKS)
В этой статье показано, как использовать вертикальный модуль автомасштабирования Pod (VPA) в кластере Служба Azure Kubernetes (AKS). VPA автоматически настраивает запросы ЦП и памяти для модулей pod в соответствии с шаблонами использования рабочих нагрузок. Эта функция помогает оптимизировать производительность приложений и сократить затраты на выполнение рабочих нагрузок в AKS.
Дополнительные сведения см. в обзоре автомасштабирования вертикального модуля Pod.
Подготовка к работе
Если у вас есть существующий кластер AKS, убедитесь, что он работает под управлением Kubernetes версии 1.24 или более поздней.
Вам потребуется azure CLI версии 2.52.0 или более поздней версии. Чтобы узнать версию, выполните команду
az --version
. Если вам необходимо выполнить установку или обновление, см. статью Установка Azure CLI 2.0.Если включить VPA в существующем кластере, убедитесь, что
kubectl
установлен и настроен для подключения к кластеруaz aks get-credentials
AKS с помощью команды.az aks get-credentials --name <cluster-name> --resource-group <resource-group-name>
Развертывание автомасштабирования вертикального модуля Pod в новом кластере
Создайте новый кластер AKS с включенным VPA с помощью
az aks create
команды с флагом--enable-vpa
.az aks create --name <cluster-name> --resource-group <resource-group-name> --enable-vpa --generate-ssh-keys
Через несколько минут выполнение команды завершается и отображаются сведения о кластере в формате JSON.
Обновление существующего кластера для использования автомасштабирования вертикального модуля Pod
Обновите существующий кластер, чтобы использовать VPA с помощью
az aks update
команды с флагом--enable-vpa
.az aks update --name <cluster-name> --resource-group <resource-group-name> --enable-vpa
Через несколько минут выполнение команды завершается и отображаются сведения о кластере в формате JSON.
Отключение автоматического масштабирования вертикального модуля Pod в существующем кластере
Отключите VPA в существующем кластере
az aks update
с помощью команды с флагом--disable-vpa
.az aks update --name <cluster-name> --resource-group <resource-group-name> --disable-vpa
Через несколько минут выполнение команды завершается и отображаются сведения о кластере в формате JSON.
Проверка установки автомасштабирования pod по вертикали pod
В следующем примере мы создадим развертывание с двумя модулями pod, каждый из которых выполняет один контейнер, который запрашивает 100 милликоров и пытается использовать чуть выше 500 милликоров. Мы также создадим конфигурацию VPA, указывающую на развертывание. VPA наблюдает поведение модулей pod, а через пять минут обновляет модули pod, чтобы запросить 500 милликоров.
Создайте файл с именем
hamster.yaml
и скопируйте в следующем манифесте примера вертикального автомасштабирования Pod из репозитория kubernetes/autoscaler 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
модуля Pod с помощьюkubectl apply
команды.kubectl apply -f hamster.yaml
Через несколько минут выполнение команды завершается и отображаются сведения о кластере в формате JSON.
Просмотрите выполняемые модули pod с помощью
kubectl get
команды.kubectl get pods -l app=hamster
Выходные данные должны выглядеть примерно так:
hamster-78f9dcdd4c-hf7gk 1/1 Running 0 24s hamster-78f9dcdd4c-j9mc7 1/1 Running 0 24s
Просмотрите резервирования ЦП и памяти в одном из модулей pod с помощью
kubectl describe
команды. Убедитесь, что вы замените<example-pod>
один из идентификаторов pod, возвращенных в выходных данных предыдущего шага.kubectl describe pod hamster-<example-pod>
Выходные данные должны выглядеть примерно так:
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>
Модуль pod имеет 100 миллипу и 50 Мибибайт памяти, зарезервированных в этом примере. Для этого примера приложения модуль pod должен выполняться менее 100 миллипусов, поэтому емкость ЦП недоступна. Модули pod также резервирует меньше памяти, чем требуется. Развертывание вертикального модуля Pod Autoscaler vpa-recommender анализирует модули pod, в которых размещено приложение хомячки, чтобы узнать, соответствуют ли требования к ЦП и памяти. Если необходимы корректировки, vpa-updater повторно запускает модули pod с обновленными значениями.
Отслеживайте модули pod с помощью
kubectl get
команды.kubectl get --watch pods -l app=hamster
При запуске нового модуля pod хомяков можно просмотреть обновленные резервирования ЦП и памяти с помощью
kubectl describe
команды. Убедитесь, что вы замените<example-pod>
один из идентификаторов pod, возвращенных в выходных данных предыдущего шага.kubectl describe pod hamster-<example-pod>
Выходные данные должны выглядеть примерно так:
State: Running Started: Wed, 28 Sep 2022 15:09:51 -0400 Ready: True Restart Count: 0 Requests: cpu: 587m memory: 262144k Environment: <none>
В предыдущих выходных данных видно, что резервирование ЦП увеличилось до 587 миллипу, что превышает пять раз исходное значение. Память увеличилась до 262 144 Килобайт, что составляет около 250 Мибибайтов или пять раз исходного значения. Этот модуль pod был недостаточно ресурсоемким, и вертикальный модуль автомасштабирования pod исправил оценку с гораздо более подходящим значением.
Просмотрите обновленные рекомендации из VPA с помощью
kubectl describe
команды, чтобы описать сведения о ресурсе хомяк-vpa.kubectl describe vpa/hamster-vpa
Выходные данные должны выглядеть примерно так:
State: Running Started: Wed, 28 Sep 2022 15:09:51 -0400 Ready: True Restart Count: 0 Requests: cpu: 587m memory: 262144k Environment: <none>
Настройка запросов автомасштабирования pod по вертикали
Объект VerticalPodAutoscaler
автоматически задает запросы ресурсов на pod с помощью объекта updateMode
Auto
. Можно задать другое значение в зависимости от требований и тестирования. В этом примере мы создадим и тестируем манифест развертывания с двумя модулями pod, каждый из которых выполняет контейнер, который запрашивает 100 миллиСП и 50 МиБ памяти и задает значение updateMode
Recreate
.
Создайте файл с именем
azure-autodeploy.yaml
и скопируйте его в следующем манифесте: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"]
Создайте pod с помощью
kubectl create
команды.kubectl create -f azure-autodeploy.yaml
Через несколько минут выполнение команды завершается и отображаются сведения о кластере в формате JSON.
Просмотрите выполняемые модули pod с помощью
kubectl get
команды.kubectl get pods
Выходные данные должны выглядеть примерно так:
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
Создайте файл с именем
azure-vpa-auto.yaml
и скопируйте его в следующем манифесте: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"
Значение
targetRef.name
указывает, что любой модуль, управляемый именемvpa-auto-deployment
развертывания, принадлежитVerticalPodAutoscaler
. ЗначениеupdateMode
Recreate
означает, что контроллер автомасштабирования вертикального модуля pod может удалить модуль pod, настроить запросы ЦП и памяти, а затем создать новый модуль pod.Примените манифест к кластеру
kubectl apply
с помощью команды.kubectl create -f azure-vpa-auto.yaml
Подождите несколько минут, а затем просмотрите выполняемые модули pod с помощью
kubectl get
команды.kubectl get pods
Выходные данные должны выглядеть примерно так:
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
Получите подробные сведения об одном из запущенных модулей pod с помощью
kubectl get
команды. Убедитесь, что вы замените<pod-name>
имя одного из модулей pod из предыдущих выходных данных.kubectl get pod <pod-name> --output yaml
Выходные данные должны выглядеть примерно так, как показано, что контроллер VPA увеличил запрос памяти до 262144k и ЦП-запрос на 25 миллиCPU:
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
Получите подробные сведения о вертикальном автомасштабировании pod и ее рекомендациях по ЦП и памяти с помощью
kubectl get
команды.kubectl get vpa vpa-auto --output yaml
Выходные данные должны выглядеть примерно так:
recommendation: containerRecommendations: - containerName: mycontainer lowerBound: cpu: 25m memory: 262144k target: cpu: 25m memory: 262144k uncappedTarget: cpu: 25m memory: 262144k upperBound: cpu: 230m memory: 262144k
В этом примере результаты в атрибуте
target
указывают, что для оптимального выполнения контейнера не требуется изменять ЦП или целевой объект памяти. Однако результаты могут отличаться в зависимости от использования приложения и его ресурсов.Средство автомасштабирования вертикального модуля pod использует
lowerBound
иupperBound
атрибуты, чтобы решить, следует ли удалить модуль pod и заменить его новым модулем pod. Если модуль pod запрашивает меньше нижней или больше верхней границы, средство автомасштабирования вертикального модуля pod удаляет модуль pod и заменяет его на pod, соответствующий целевому атрибуту.
Дополнительный рекомендуемый параметр для автомасштабирования вертикального модуля Pod
Средство рекомендаций предоставляет рекомендации по использованию ресурсов на основе использования ресурсов в режиме реального времени. AKS развертывает средство рекомендаций при включении VPA кластера. Вы можете развернуть настроенный рекомендуемый или дополнительный рекомендуемый объект с тем же изображением, что и по умолчанию. Преимущество настраиваемого средства рекомендаций заключается в том, что вы можете настроить логику рекомендаций. С помощью дополнительного средства рекомендаций можно секционировать виртуальные платформы для использования различных рекомендаций.
В следующем примере мы создадим дополнительный средство рекомендаций, применим к существующему объекту AKS clust и настроим объект VPA для использования дополнительного средства рекомендаций.
Создайте файл с именем
extra_recommender.yaml
и скопируйте его в следующем манифесте: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
модуля Pod с помощьюkubectl apply
команды.kubectl apply -f extra-recommender.yaml
Через несколько минут выполнение команды завершается и отображаются сведения о кластере в формате JSON.
Создайте файл с именем
hamster-extra-recommender.yaml
и скопируйте его в следующем манифесте: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"
Если
memory
этот параметр не указан,controlledResources
средство рекомендаций не отвечает на события OOM. В этом примере мы устанавливаем только ЦП.controlledValues
controlledValues
позволяет выбрать, следует ли обновлять запросы ресурсов контейнера с помощью параметра или какRequestsOnly
по запросам ресурсов, так и по ограничениям, используя этотRequestsAndLimits
параметр. Значение по умолчанию —RequestsAndLimits
. Если вы используетеRequestsAndLimits
этот параметр, запросы вычисляются на основе фактического использования, а ограничения вычисляются на основе текущего запроса и соотношения ограничений pod.Например, если начать с модуля pod, который запрашивает 2 ЦП и ограничивает 4 ЦП, VPA всегда задает ограничение в два раза больше, чем запросы. Тот же принцип применяется к памяти. При использовании
RequestsAndLimits
режима он может служить схемой для первоначальных запросов и ограничений ресурсов приложения.Вы можете упростить объект VPA с помощью
Auto
рекомендаций по режиму и вычислениям для ЦП и памяти.hamster-extra-recomender.yaml
Разверните пример с помощьюkubectl apply
команды.kubectl apply -f hamster-extra-recommender.yaml
Отслеживайте модули pod с помощью
[kubectl get
команды ]kubectl-get .kubectl get --watch pods -l app=hamster
При запуске нового модуля pod хомяков просмотрите обновленные резервирования ЦП и памяти с помощью
kubectl describe
команды. Убедитесь, что вы замените<example-pod>
один из идентификаторов pod.kubectl describe pod hamster-<example-pod>
Выходные данные должны выглядеть примерно так:
State: Running Started: Wed, 28 Sep 2022 15:09:51 -0400 Ready: True Restart Count: 0 Requests: cpu: 587m memory: 262144k Environment: <none>
Просмотр обновленных рекомендаций из VPA с помощью
kubectl describe
команды.kubectl describe vpa/hamster-vpa
Выходные данные должны выглядеть примерно так:
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
Устранение неполадок с автомасштабированием вертикального модуля Pod
При возникновении проблем с вертикальным автомасштабированием pod можно устранить неполадки с системными компонентами и пользовательским определением ресурсов, чтобы определить проблему.
Убедитесь, что все системные компоненты выполняются с помощью следующей команды:
kubectl --namespace=kube-system get pods|grep vpa
Выходные данные должны содержать три модуля pod: рекомендации, средство обновления и контроллер допуска, все с состоянием
Running
.Для каждого из модулей pod, возвращенных в предыдущих выходных данных, убедитесь, что системные компоненты регистрируют любые ошибки с помощью следующей команды:
kubectl --namespace=kube-system logs [pod name] | grep -e '^E[0-9]\{4\}'
Убедитесь, что определение настраиваемого ресурса было создано с помощью следующей команды:
kubectl get customresourcedefinition | grep verticalpodautoscalers
Следующие шаги
Дополнительные сведения об объекте VPA см. в справочнике по API автомасштабирования вертикальных модулей Pod.
Azure Kubernetes Service