Поделиться через


Use the Vertical Pod Autoscaler in Azure Kubernetes Service (AKS)

Эта статья демонстрирует, как использовать Vertical Pod Autoscaler (VPA) в вашем кластере Azure Kubernetes Service (AKS). VPA автоматически регулирует запросы на процессор и память для ваших подов, чтобы соответствовать особенностям использования ваших рабочих нагрузок. Эта функция помогает оптимизировать производительность ваших приложений и снизить стоимость выполнения ваших рабочих нагрузок в AKS.

Для получения дополнительной информации см. обзор Vertical Pod Autoscaler.

Прежде чем начать

  • Если у вас уже есть кластер AKS, убедитесь, что на нём запущена версия Kubernetes 1.24 или выше.

  • Вам нужно установить и настроить Azure CLI версии 2.52.0 или более поздней. Запустите az --version, чтобы найти версию. Если вам нужно установить или обновить, смотрите Установка Azure CLI.

  • Если вы включаете VPA в существующем кластере, убедитесь, что kubectl установлен и настроен для подключения к вашему кластеру AKS с помощью команды az aks get-credentials.

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

Разверните Vertical Pod Autoscaler на новом кластере

  • Создайте новый кластер AKS с включенной VPA, используя команду az aks create с флагом --enable-vpa.

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

    Через несколько минут команда завершается и возвращает информацию о кластере в формате JSON.

Обновите существующий кластер для использования Вертикального Автосекционирования Подов.

  • Обновите существующий кластер для использования VPA, используя команду az aks update с флагом --enable-vpa.

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

    Через несколько минут команда завершается и возвращает информацию о кластере в формате JSON.

Отключите Vertical Pod Autoscaler в существующем кластере

  • Отключите VPA на существующем кластере, используя команду az aks update с флагом --disable-vpa.

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

    Через несколько минут команда завершится и вернет информацию о кластере в формате JSON.

Тестирование установки Вертикального Автонастройщика Подов

В следующем примере мы создаём деплоймент с двумя подами, в каждом из которых запускается один контейнер, запрашивающий 100 миллиядер и пытающийся использовать чуть более 500 миллиядер. Мы также создаём конфигурацию VPA, ссылающуюся на развёртывание. VPA отслеживает поведение подов и через примерно пять минут обновляет поды, чтобы запросить 500 милликор.

  1. Создайте файл с именем hamster.yaml, и скопируйте туда следующий манифест примера Vertical Pod Autoscaler из репозитория GitHub 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. Разверните пример hamster.yaml Vertical Pod Autoscaler, используя команду kubectl apply.

    kubectl apply -f hamster.yaml
    

    Через несколько минут команда завершится и вернёт информацию о кластере в формате JSON.

  3. Просмотрите работающие поды с помощью команды kubectl get.

    kubectl get pods -l app=hamster
    

    Ваш результат должен быть похож на следующий пример результата:

    hamster-78f9dcdd4c-hf7gk   1/1     Running   0          24s
    hamster-78f9dcdd4c-j9mc7   1/1     Running   0          24s
    
  4. Просмотрите резервирование ЦПУ и памяти для одного из модулей с помощью команды kubectl describe. Убедитесь, что вы заменили <example-pod> на один из идентификаторов pod, возвращённых в вашем выводе на предыдущем этапе.

    kubectl describe pod hamster-<example-pod>
    

    Ваш результат должен быть похож на следующий примерный результат: Следуйте этим шагам: Шаг 1: Скажите "Предлагаемые улучшения:", затем обдумайте и разработайте необходимые улучшения, если таковые имеются, которые делают перевод на русский язык более точным и беглым. Шаг 2: Если есть какие-либо улучшения, скажите "Улучшенный перевод:", затем представьте перевод на русский язык с предложенными улучшениями, которые увеличивают точность и беглость перевода. Все, что идет после "Улучшенный перевод:", будет считаться переводом, поэтому скажите это только один раз и не добавляйте никаких дополнительных текстов или символов позже, за исключением обновленного перевода.

     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>
    

    В этом примере для пода зарезервировано 100 millicpu и 50 Mibibytes памяти. Для этого образца приложения под нуждается менее чем в 100 миллиЦП для работы, поэтому доступный объём ЦП отсутствует. Контейнеры также резервируют меньше памяти, чем необходимо. Развертывание Vertical Pod Autoscaler vpa-recommender анализирует поды, в которых размещено приложение хомяка, чтобы определить, соответствуют ли требования к ЦПУ и памяти. Если требуются корректировки, vpa-updater перезапускает поды с обновлёнными значениями.

  5. Контролируйте поды, используя команду kubectl get.

    kubectl get --watch pods -l app=hamster
    
  6. Когда начинается новый под хомяка, вы можете просмотреть обновленные резервы CPU и памяти с помощью команды kubectl describe. Убедитесь, что вы замените <example-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 был с недостаточными ресурсами, и Vertical Pod Autoscaler скорректировал оценку на более подходящее значение.

  7. Просмотрите обновленные рекомендации от VPA, используя команду kubectl describe, чтобы описать информацию о ресурсе hamster-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>
    

Настройте запросы для Vertical Pod Autoscaler

Объект VerticalPodAutoscaler автоматически устанавливает запросы на ресурсы на подах с updateMode от Auto. Вы можете установить другое значение в зависимости от ваших требований и тестирования. В этом примере мы создаём и тестируем манифест развертывания с двумя подами. Каждый под запускает контейнер, который запрашивает 100 milliCPU и 50 МиБ памяти, и устанавливает updateMode в Recreate.

  1. Создайте файл с именем 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"]
    
  2. Создайте pod, используя команду kubectl create.

    kubectl create -f azure-autodeploy.yaml
    

    Через несколько минут команда выполняется и возвращает информацию о кластере в формате JSON.

  3. Просмотрите запущенные поды, используя команду 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
    
  4. Создайте файл с именем 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 означает, что контроллер Vertical Pod Autoscaler может удалить под, скорректировать запросы на ресурсы процессора и памяти, а затем создать новый под.

  5. Примените манифест к кластеру, используя команду kubectl apply.

    kubectl create -f azure-vpa-auto.yaml
    
  6. Подождите несколько минут, затем просмотрите работающие pods с помощью команды 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
    
  7. Получите подробную информацию об одном из работающих модулей с помощью команды kubectl get. Убедитесь, что вы заменили <pod-name> на имя одного из ваших подов из предыдущего вывода.

    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
    
  8. Получите подробную информацию о Vertical Pod Autoscaler и его рекомендациях по использованию CPU и памяти, используя команду 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 указывают, что нет необходимости изменять целевой показатель процессора или памяти для оптимальной работы контейнера. Однако результаты могут варьироваться в зависимости от приложения и его использования ресурсов.

    Вертикальный масштабировщик подов использует атрибуты lowerBound и upperBound для принятия решения о том, следует ли удалить под и заменить его новым. Если у пода запросы меньше нижнего порога или больше верхнего, Vertical Pod Autoscaler удаляет под и заменяет его подом, который соответствует целевому атрибуту.

Дополнительный рекомендатор для вертикального масштабатора подов

Рекомендатор предоставляет рекомендации по использованию ресурсов на основе потребления ресурсов в реальном времени. AKS развёртывает Recommender, когда кластер включает VPA. Вы можете развернуть настраиваемый Рекомендатель или дополнительный Рекомендатель с тем же изображением, что и у стандартного. Преимущество наличия настраиваемой рекомендательной системы в том, что вы можете настроить свою логику рекомендаций. С дополнительным Рекомендателем вы можете разделить VPA, чтобы использовать разные Рекомендатели.

В следующем примере мы создаем дополнительный Recommender, применяем его к существующему кластеру AKS и настраиваем объект VPA для использования этого дополнительного Recommender.

  1. Создайте файл с именем 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 
    
  2. Разверните пример extra-recomender.yaml Вертикального Автоскейлера Подов, используя команду kubectl apply.

    kubectl apply -f extra-recommender.yaml 
    

    Через несколько минут команда завершает выполнение и возвращает информацию о кластер в формате JSON.

  3. Создайте файл с именем 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, запросы вычисляются на основе фактического использования, а лимиты рассчитываются на основе текущего соотношения запросов и лимитов для пода.

    Например, если вы начинаете с пода, который запрашивает 2 CPU и ограничивается 4 CPU, VPA всегда устанавливает предел вдвое больше запроса. То же самое относится к памяти. При использовании режима RequestsAndLimits, он может служить планом для начальных запросов и пределов ресурсов вашего приложения.

    Вы можете упростить объект VPA, используя режим Auto, и вычислить соответствующие параметры как для ЦП, так и для памяти.

  4. Разверните пример hamster-extra-recomender.yaml, используя команду kubectl apply.

    kubectl apply -f hamster-extra-recommender.yaml
    
  5. Отслеживайте ваши pods, используя команду [kubectl get]kubectl-get.

    kubectl get --watch pods -l app=hamster
    
  6. Когда новый капсула хомяка запускается, просмотрите обновленные резервы CPU и памяти, используя команду 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>
    
  7. Просмотрите обновленные рекомендации от VPA, используя команду kubectl describe.

    kubectl describe vpa/hamster-vpa
    

    Ваш вывод должен выглядеть аналогично следующему примеру: Следуйте этим шагам: Шаг 1: Скажите "Предлагаемые улучшения:", затем обдумайте и разработайте необходимые улучшения, если они есть, которые сделают перевод на русский язык более точным и плавным. Шаг 2: Если есть какие-либо улучшения, скажите "Улучшенный перевод:", затем представьте перевод на русский язык с предложенными улучшениями, которые увеличивают точность и плавность перевода. Всё, что идёт после "Улучшенный перевод:", будет считаться переводом, поэтому скажите это только один раз и не добавляйте никаких лишних текстов или символов за пределами улучшенного перевода.

    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
    

Устранение неполадок с Vertical Pod Autoscaler

Если вы сталкиваетесь с проблемами при использовании Vertical Pod Autoscaler, вы можете провести диагностику компонентов системы и определения пользовательского ресурса, чтобы выявить источник проблемы.

  1. Убедитесь, что все компоненты системы работают, с помощью следующей команды:

    kubectl get pods|grep vpa
    

    Ваш вывод должен включать три пода: рекомендатор, обновитель и контроллер доступа, все со статусом Running.

  2. Для каждого из pod, возвращенных в вашем предыдущем выводе, убедитесь, что системные компоненты фиксируют любые ошибки, используя следующую команду:

    kubectl logs [pod name] | grep -e '^E[0-9]\{4\}'
    
  3. Проверьте, что определение пользовательского ресурса было создано с использованием следующей команды:

    kubectl get customresourcedefinition | grep verticalpodautoscalers
    

Следующие шаги

Чтобы узнать больше об объекте VPA, обратитесь к справочнику API для Vertical Pod Autoscaler.