Как работает вертикальное масштабирование (VPA)

Vertical Pod Autoscaler (VPA) позволяет автоматизировать управление ресурсами контейнеров и значительно повысить эффективность работы приложений. VPA полезен в ситуациях, когда заранее неизвестно, сколько ресурсов потребуется приложению. При использовании VPA и включении соответствующего режима работы, запрашиваемые ресурсы устанавливаются на основе фактического потребления ресурсов, полученных от системы мониторинга. Также возможно настроить систему таким образом, чтобы она только рекомендовала ресурсы, не внося изменений автоматически.

Работа VPA с лимитами

VPA управляет запрашиваемыми ресурсами (requests) контейнера, но не управляет ограничениями (limits), если явно не указано в его политике.

VPA рассчитывает рекомендуемые значения на основе данных о потреблении ресурсов контейнером. Это поведение может повлиять на соотношение requests и limits:

  • Если запрашиваемые ресурсы и лимиты равны, то VPA изменяет только ресурсы, оставляя лимиты неизменными.
  • Если лимиты не указаны, VPA обновляет только ресурсы.
  • Если лимиты заданы, но не управляются VPA, соотношение ресурсов/лимитов может измениться.
  1. Пример 1. В кластере имеется:

    • Объект VPA:

      apiVersion: autoscaling.k8s.io/v1
      kind: VerticalPodAutoscaler
      metadata:
        name: test2
      spec:
        targetRef:
          apiVersion: "apps/v1"
          kind: Deployment
          name: test2
        updatePolicy:
          updateMode: "Initial"
      
    • Под с ресурсами:

      resources:
      limits:
        cpu: 2
      requests:
        cpu: 1
      

      Если контейнер будет потреблять 1 CPU, VPA порекомендует 1,168 CPU. В данном случае, соотношение между запросами и лимитами будет равно 100%. При пересоздании пода VPA изменит ресурсы на следующие:

      resources:
      limits:
        cpu: 2336m
      requests:
        cpu: 1168m
      
  2. Пример 2. В кластере имеется:

    • VPA:

      apiVersion: autoscaling.k8s.io/v1
      kind: VerticalPodAutoscaler
      metadata:
        name: test2
      spec:
        targetRef:
          apiVersion: "apps/v1"
          kind: Deployment
          name: test2
        updatePolicy:
          updateMode: "Initial"
      
    • Под с ресурсами:

      resources:
      limits:
        cpu: 1
      requests:
        cpu: 750m
      

      В данном случае соотношение реквестов и лимитов будет 25%. Если VPA порекомендует 1,168 CPU, ресурсы контейнера будут изменены на:

      resources:
       limits:
         cpu: 1557m
       requests:
         cpu: 1168m
      

Если не ограничивать ресурсы, VPA может выставить слишком большие ресурсы, что может привести к проблемам.

Для предотвращения этого можно:

  • Использовать параметр maxAllowed в VPA:

    apiVersion: autoscaling.k8s.io/v1
    kind: VerticalPodAutoscaler
    metadata:
      name: my-app-vpa
    spec:
      targetRef:
        apiVersion: "apps/v1"
        kind: Deployment
        name: my-app
      updatePolicy:
        updateMode: "Auto"
      resourcePolicy:
        containerPolicies:
        - containerName: hamster
          minAllowed:
            memory: 100Mi
            cpu: 120m
          maxAllowed:
            memory: 300Mi
            cpu: 350m
          mode: Auto
    
  • Настроить Limit Range в кластере:

    apiVersion: autoscaling.k8s.io/v1
    kind: LimitRange
    metadata:
      name: my-app-vpa
    spec:
      limits:
      - default:
          cpu: 2
          memory: 4Gi
        defaultRequest:
          cpu: 500m
          memory: 256Mi
        type: Container
    

Мониторинг VPA в Grafana

Для эффективного управления ресурсами с помощью Vertical Pod Autoscaler (VPA) рекомендуется использовать Grafana-дашборды. Они позволяют отслеживать текущий статус VPA, его настройки, а также процент подов, на которых он активирован.

Grafana предоставляет несколько уровней детализации информации о VPA. Основные дашборды:

  • Main / Namespace — отображает информацию об использовании VPA на уровне пространства имен.
  • Main / Namespace / Controller — детализирует данные VPA для конкретных контроллеров.
  • Main / Namespace / Controller / Pod — самый детальный уровень, отображает информацию о каждом отдельном поде.

При мониторинге VPA в Grafana используются следующие ключевые столбцы:

  • VPA type — показывает текущее значение updatePolicy.updateMode, которое определяет режим работы VPA для данного пода и отображается в дашбордах:
    • Main / Namespace
    • Main / Namespace / Controller
    • Main / Namespace / Controller / Pod
  • VPA % (Процент подов с включенным VPA) — показывает процент подов в пространстве имен, на которых включен VPA. Позволяет быстро определить, сколько подов в кластере автоматически масштабируются с помощью VPA.

Примеры настройки VPA

  1. Пример минимального ресурса VerticalPodAutoscaler:

    apiVersion: autoscaling.k8s.io/v1
    kind: VerticalPodAutoscaler
    metadata:
     name: my-app-vpa
    spec:
      targetRef:
        apiVersion: "apps/v1"
        kind: StatefulSet
        name: my-app
    
  2. Пример полного ресурса VerticalPodAutoscaler:

    apiVersion: autoscaling.k8s.io/v1
    kind: VerticalPodAutoscaler
    metadata:
      name: my-app-vpa
    spec:
      targetRef:
        apiVersion: "apps/v1"
        kind: Deployment
        name: my-app
      updatePolicy:
        updateMode: "Auto"
      resourcePolicy:
        containerPolicies:
        - containerName: hamster
          minAllowed:
            memory: 100Mi
            cpu: 120m
          maxAllowed:
            memory: 300Mi
            cpu: 350m
          mode: Auto