Vertical Pod Autoscaler (VPA) — это инфраструктурный сервис, который позволяет не выставлять точные resource requests, если неизвестно, сколько ресурсов необходимо контейнеру для работы. При использовании VPA, и при включении соответствующего режима работы, resource requests выставляются автоматически на основе потребления ресурсов (полученных данных из Prometheus). Как вариант — возможно только получать рекомендации по ресурсам, без из автоматического изменения.
У VPA есть 3 режима работы:
"Auto"
(default) — в данный момент Auto и Recreate режимы работы делают одно и то же. Однако когда в kubernetes появится Pod in-place resource update, данный режим будет делать именно его."Recreate"
— данный режим разрешает VPA изменять ресурсы у запущенных Pod’ов, т.е. рестартить их при работе. В случае работы одного Pod’а (replicas: 1
) — это приведет к недоступности сервиса, на время рестарта. В данном режиме VPA не пересоздает Pod’ы, которые были созданы без контроллера."Initial"
— VPA изменяет ресурсы Pod’ов только при создании Pod’ов, но не во время работы."Off"
— VPA не изменяет автоматически никакие ресурсы. В данном случае, если есть VPA c таким режимом работы, мы можем посмотреть, какие ресурсы рекомендует поставить VPA (kubectl describe vpa)
Ограничения VPA:
- Обновление ресурсов запущенных Pod’ов — это экспериментальная возможность VPA. Каждый раз, когда VPA обновляет
resource requests
Pod’а, Pod пересоздается. Соответственно, Pod может быть создан на другом узле. - VPA не должен использоваться с HPA по CPU и memory в данный момент. Однако VPA можно использовать с HPA на custom/external metrics.
- VPA реагирует почти на все
out-of-memory
events, но не гарантирует реакцию (почему так — выяснить из документации не удалось). - Производительность VPA не тестировалась на огромных кластерах.
- Рекомендации VPA могут превышать доступные ресурсы в кластере, что может приводить к Pod’ам в состоянии Pending.
- Использование нескольких VPA-ресурсов над одним Pod’ом может привести к неопределенному поведению.
- В случае удаления VPA или его “выключения” (режим
Off
), изменения внесенные ранее VPA не сбрасываются, а остаются в последнем измененном значении. Из-за этого может возникнуть путаница, что в Helm будут описаны одни ресурсы, при этом в контроллере тоже будут описаны одни ресурсы, но реально у Pod’ов ресурсы будут совсем другие и может сложиться впечатление, что они взялись “непонятно откуда”.
Важно! При использовании VPA настоятельно рекомендуется использовать Pod Disruption Budget.
Grafana dashboard
На досках:
Main / Namespace
,Main / Namespace / Controller
,Main / Namespace / Controller / Pod
— столбецVPA type
показывает значениеupdatePolicy.updateMode
;Main / Namespaces
— столбецVPA %
показывает процент Pod’ов с включенным VPA.
Архитектура Vertical Pod Autoscaler
VPA состоит из 3х компонентов:
Recommender
— он мониторит настоящее (делая запросы в Metrics API, который реализован в модулеprometheus-metrics-adapter
) и прошлое потребление ресурсов (делая запросы в Trickster перед Prometheus) и предоставляет рекомендации по CPU и memory для контейнеров.Updater
— проверяет, что у Pod’ов с VPA выставлены корректные ресурсы и если нет, — убивает эти Pod’ы, чтобы контроллер пересоздал Pod’ы с новыми resource requests.Admission Plugin
— задает resource requests при создании новых Pod’ов (контроллером или из-за активности Updater’а).
При изменении ресурсов компонентом Updater это происходит с помощью Eviction API, поэтому учитываются Pod Disruption Budget
для обновляемых Pod’ов.