C++/Go/Python
Game Developer

Масштабирование деплойментов с помощью prometheus и keda

В Kubernetes есть возможность горизонтально масштабировать нагрузку, т.е. увеличивать количество подов до требуемого.

HPA (Horizontal Pod Autoscaling) используя метрики ресурсов (сpu или memory) и фиксированный алогритм, учитывающий среднее значение метрики между всеми подами, способен масштабировать количество подов в развертывании (deployments).

К сожалению, низкое использование ресурсов (utilization) может быть одновременно с высокой насыщенностью нагрузки (saturation) приложения. Простой иллюстрацией служит Page Downloader:

  1. Очередь из ссылок на html-страницы для скачивания.
  2. Пул воркеров, который занимается скачиванием страниц.

Сами воркеры не будут значительно использовать cpu и memory ресурсы. Но скорость обработки очереди напрямую зависит от количества этих воркеров в пуле. Как увеличить пул воркеров, взависимости от размер очереди?

И тут на помощь нам придет keda и prometheus.

Как это работает?

Пощупать пример можно в репозитории k8s-keda-autoscaling-example.

В примере есть простое приложение на flask и rq. На web страничке можно добавить задачу в очередь, которые симулируют долгую операцию без значительного исспользования CPU.

КАРТИНКА

экспортер метрик о состоянии очереди эскпортирует метрику о количестве ждущих обработки задач в очереди. Keda проверяет эту метрику и реагирует на увеличение повышением количество реплик воркеров в пуле воркеров.

М ыможем реагировать на любые prometheus метрики. Например, аналогичным образом можно воспользоваться kafka-exporter и реагировать на увеличение размера очереди в kafka.

Если скрость обработки задачи не критична, можно по умолчанию выставить количество реплик в 0. Как только задачи появятся в очереди, keda подымет воркеры.

Замечания

  • Масштабировать так же можно и вертикально.
  • Важно отметить, что в kubernetes v1.23 будет доступна возможность масштабировать используя кастомных метрики.
  • Когда очередь опустет, будет понижено количество реплик, что приведет к остановке некоторых подов. Нужно понимать, что в этот момент эти поды могут обрабатывать задачу. Нужно корректно реагировать на эту ситуацию

Полезные ссылки

  • https://github.com/zifter/k8s-keda-autoscaling-example
  • https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/
  • https://habr.com/ru/company/flant/blog/541642/
  • https://docs.aws.amazon.com/eks/latest/userguide/vertical-pod-autoscaler.html
  • https://github.com/kubernetes/autoscaler/tree/master/vertical-pod-autoscaler
  • https://github.com/kedacore/keda
  • https://keda.sh/docs/2.6/concepts/scaling-deployments/