Как посмотреть рекомендации Vertical Pod Autoscaler?

После создания custom resource VerticalPodAutoscaler посмотреть рекомендации VPA можно следующим образом:

kubectl describe vpa my-app-vpa

В секции status будут такие параметры:

  • Target — Количество ресурсов, которое будет оптимальным для Pod’а (в пределах resourcePolicy).
  • Lower Bound — Минимальное рекомендуемое количество ресурсов для более или менее (но не гарантированно) хорошей работы приложения.
  • Upper Bound — Максимальное рекомендуемое количество ресурсов. Скорее всего ресурсы выделенные сверх этого значения идут в мусорку и совсем никогда не нужны приложению.
  • Uncapped Target — Рекомендуемое количество ресурсов в самый последний момент, т.е. данное значение считается на основе самых крайних метрик, не смотря на историю ресурсов за весь период.

Как Vertical Pod Autoscaler работает с лимитами?

Пример 1

У нас есть VPA объект:

---
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
  name: test2
spec:
  targetRef:
    apiVersion: "apps/v1"
    kind: Deployment
    name: test2
  updatePolicy:
    updateMode: "Initial"

И есть Pod с такими ресурсами:

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

В данном случае если контейнер будет потреблять, к примеру 1 CPU целиком и VPA порекомендует данному контейнеру 1.168 CPU, то вычисляется ratio между requets и limits. В данном случае он будет равен 100%. В этом случае, при пересоздании Pod’а VPA модифицирует Pod и проставит такие ресурсы:

resources:
  limits:
    cpu: 2336m
  requests:
    cpu: 1168m

Пример 2

У нас есть VPA объект:

---
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
  name: test2
spec:
  targetRef:
    apiVersion: "apps/v1"
    kind: Deployment
    name: test2
  updatePolicy:
    updateMode: "Initial"

И есть Pod с такими ресурсами:

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

В данном случае соотношение requests и limits будет равным 25% и если VPA порекомендует для контейнера 1.168 CPU, то VPA изменит ресурсы контейнера таким образом:

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

Если вам необходимо ограничить максимальное количество ресурсов, которое может быть заданно для limits контейнера, то необходимо использовать в спецификации объекта VPA: maxAllowed или использовать Limit Range объект Kubernetes.