Как работает автоматическое масштабирование в Kubernetes
Ранее вы уже изучали преимущества использования оркестрации контейнеров и в частности платформы Kubernetes. В Kubernetes есть возможность автоматического масштабирования, которая позволяет динамически увеличивать или уменьшать количество нод кластера, количества подов или выделяемых для пода ресурсов.
Этот инструмент даёт системе возможность адаптироваться к изменчивой нагрузке и при этом сохранять требуемые показатели производительности и стабильности. А ещё с помощью Kubernetes возможно оптимизировать использование ресурсов, а соответственно, и затрат на них, что особенно актуально в облачной среде.
Чтобы решить проблемы готовности сервиса «ОнлиСхемы» к резким скачкам и спадам активности пользователей, команда приняла решение перевести своё приложение в облачный Kubernetes. А ещё воспользоваться его механизмами автоматического масштабирования, чтобы оптимизировать расход ресурсов.
Также команда понимает, что на текущий момент находится в условиях непредсказуемого роста нагрузки, поэтому зафиксировать нужное количество ресурсов и количества экземпляров не представляется возможным. Теперь необходимо подобрать нужный механизм.
В этом уроке мы разберём три основных механизма масштабирования, которые предлагает Kubernetes.
Механизмы масштабирования Kubernetes
Механизмы масштабирования Kubernetes не зависят напрямую от внутренней архитектуры приложения: это может быть монолит, микросервисы или что-то другое. Теоретически Kubernetes и механизмы, которые мы будем разбирать, могут быть использованы для деплоймента любого приложения.
Кратко принцип работы каждого механизма можно описать так:
- Horizontal Pod Autoscaler (HPA) — автоматически увеличивает или уменьшает количество подов в зависимости от изменения заданных метрик приложения.
- Vertical Pod Autoscaler (VPA) — автоматически увеличивает или уменьшает запросы и лимиты на ресурсы приложения: процессор и память.
- Cluster Autoscaler — автоматически увеличивает или уменьшает количество нод в кластере на базе запрашиваемых ресурсов всеми подами.
Horizontal Pod Autoscaler (HPA)
HPA мониторит определённые метрики (например, CPU или память) и автоматически регулирует количество подов в Deployment, StatefulSet или ReplicaSet, чтобы поддерживать целевые значения этих метрик. Целевое значение может быть задано в процентах использования ресурсов или как абсолютное значение метрики. HPA использует метрики из Metrics Server или custom metrics, добавленные через адаптеры метрик.
HPA используют, когда требуется автоматически масштабировать количество экземпляров приложения в ответ на изменения нагрузки, не меняя ресурсы, выделенные для каждого пода.
Ещё этот механизм актуален в сценариях, когда производительность приложения может поддерживаться за счёт параллельной обработки запросов. Особенно при обслуживании веб-запросов, очередей сообщений и так далее.
Плюсы использования Horizontal Pod Autoscaler
- Поддерживает нужный уровень производительности даже при внезапных всплесках трафика, за счёт поддержания количества подов, соизмеримого с текущей нагрузкой.
- Помогает оптимизировать расходы, автоматически уменьшая количество подов в периоды низкой нагрузки.
Vertical Pod Autoscaler (VPA)
VPA автоматически применяет наиболее подходящие настройки ресурсов для подов. VPA анализирует исторические и текущие данные о потреблении ресурсов и на их основе корректирует запросы и лимиты ресурсов для подов.
Существует три режима работы VPA: «Off», «Initial» и «Auto». В режиме «Auto» VPA автоматически обновляет запущенные поды с рекомендованными настройками ресурсов. Это требует перезапуска пода, что может нарушить работу некоторых приложений.
Механизм VPA подходит для приложений, чья производительность зависит не от количества экземпляров, а от выделенных им ресурсов, таких как процессор и память. А ещё его используют в сценариях, где сложно или невозможно масштабировать приложение горизонтально.
💡 VPA стоит использовать при работе со stateful-приложениями, так как они, как правило, хуже поддаются горизонтальному масштабированию. Также VPA подходит для выполнения потенциально ресурсоёмких регулярных задач, запускаемых с помощью CronJobs.
Плюсы использования Vertical Pod Autoscaler
- Автоматически настраивает выделенные ресурсы (CPU и память) для подов, улучшая производительность и эффективность приложения без необходимости добавления дополнительных экземпляров.
- Помогает предотвратить проблемы с производительностью, связанные с нехваткой ресурсов.
Cluster Autoscaler
Cluster Autoscaler автоматически регулирует количество нод в кластере в зависимости от нагрузки и доступности ресурсов для подов.
Если существующие поды не могут быть распределены по имеющимся нодам из-за нехватки ресурсов, Cluster Autoscaler добавляет новые ноды. В обратной ситуации он может их удалить.
Такой механизм актуален для приложений, которые сталкиваются с пиковыми нагрузками, сильно превышающими среднюю. И в случаях, когда текущая потребность в ресурсах может сильно изменяться в течение дня.
Преимущества использования
- Обеспечивает всегда достаточное количество ресурсов в кластере для обработки нагрузки.
- Повышает эффективность использования ресурсов, что может существенно снизить общие расходы на инфраструктуру.
Модель нагрузки такова, что сервис в первую очередь имеет дело с ростом активности пользователей, — это ведёт к кратному увеличению количества запросов к бэкенд-приложению.
Исходя из этого, команда понимает, что автоматическим увеличением памяти и процессора для подов делу особо не поможешь, и решает автоматически горизонтально масштабировать приложение с помощью HPA. При этом важно понимать, что уровень активности пользователей в пиковые часы может значительно отличаться от минимального и даже среднего. Поэтому для ещё большей оптимизации используемых ресурсов команда планирует применить Cluster Autoscaler, чтобы в ночные часы ресурсы кластера не расходовались понапрасну.
Метрики для масштабирования подов Kubernetes
Чтобы определить, когда и как Kubernetes должен масштабировать приложение, нужны метрики масштабирования. Kubernetes позволяет настраивать масштабирование на основании встроенных метрик, утилизации процессора и памяти. Отслеживание этих показателей позволяет определить, достаточно ли текущих ресурсов или необходимы дополнительные.
Кастомные метрики
Помимо встроенных метрик в Kubernetes есть возможность использовать кастомные. Они позволяют масштабировать систему на основе требований конкретных приложений или бизнес-метрик, которые недоступны в качестве встроенных метрик. Например, RPS, время отклика или количество непрочитанных сообщений в очереди. Их можно использовать как для HPA, так и для VPA.
Однако кастомные метрики требуют установки и конфигурации дополнительных компонентов в кластер. Чтобы использовать их для масштабирования, необходимо настроить сервер кастомных метрик (например, Prometheus).
В сообществе Kubernetes уже сложились практики, которые позволяют повысить отказоустойчивость и масштабируемость системы с наименьшими потерями.
Лучшие практики
- Избегайте совместного использования HPA и VPAHPA и VPA потенциально совместимы при использовании для одних и тех же подов, только если вы настроите HPA на кастомные или внешние метрики.
- Используйте VPA вместе с Cluster AutoscalerVPA может иногда указать значения запроса ресурсов, которые превышают доступные ресурсы кластера. Тогда повышается вероятность, что ресурсов не хватит и поды перейдут в состояние ожидания. Автомасштабирование кластера решает эту проблему за счёт запуска новых нод в ответ на ожидающие модули.
- Используйте HPA вместе с Cluster AutoscalerЭто позволит согласовывать горизонтальное масштабирование подов с поведением и количеством необходимых нод в кластере.
- Убедитесь, что для всех подов указаны настройки запрашиваемых ресурсовЭто необходимо для правильной работы Cluster Autoscaler.
Далее мы предлагаем настроить HPA и рассмотреть этот механизм как основной инструмент для динамического горизонтального масштабирования.
Как настраивать HPA: практика
Суть работы HPA заключается в бесконечном цикле: проверить метрики, обновить, проверить метрики ещё раз.
Механизм работы HPA
- HPA постоянно опрашивает Metrics server для получения актуальных значений интересующих метрик.
- На основании заданных порогов в собранных данных об использовании ресурсов HPA рассчитает количество необходимых реплик подов, исходя из заданных порогов в манифесте HPA.
- Затем HPA обновляет значение количества реплик в Deployment.
- В зависимости от установленного значения либо разворачиваются дополнительные поды, либо останавливаются запущенные до нужного количества.
- Далее процесс повторяется.
Для получения актуальных значений метрик HPA использует Metrics server. Этот компонент устанавливается отдельно. Он собирает и хранит данные метрик ресурсов (CPU, память и т. д.) от каждого узла и пода, делая эти данные доступными для HPA и других компонентов кластера. Без Metrics server HPA не сможет получить необходимые данные о нагрузке для автоматического масштабирования.
Настройка Horizontal Pod Autoscaler
Чтобы вам было легче выполнить практическую работу, настройте HPA, следуя пошаговой инструкции.
- Поднимите лоĸальный ĸластер Kubernetes в Minikube.
- Аĸтивируйте metrics-server. В Minikube это можно сделать, включив metrics-server при запуске:
BASH
Если Minikube уже был запущен без metrics-server, его можно активировать отдельно:BASH
- Убедитесь, что metrics-server активен. Вы можете проверить статус metrics-server с помощью команды:
YAML
- Определите запросы и лимиты ресурсов приложения. В манифесте Deployment нужно указать запросы (requests) и лимиты (limits) памяти, которые будут использоваться для мониторинга и масштабирования. Для этого потребуется добавить следующий фрагмент в deployment.yaml (значения ресурсов указаны для примера):
YAML
- Напишите манифест Horizontal Pod Autoscaler. Создайте файл hpa.yaml и определите в нём параметры масштабирования:
YAML
- Примените манифест HPA и проверьте его состояние при помощи команд:
YAML
После настройки HPA ваше приложение будет автоматически масштабироваться в зависимости от использования памяти. Если нагрузка на приложение возрастёт и потребление памяти подами превысит указанный порог в 80%, Kubernetes начнёт автоматически увеличивать количество подов вплоть до максимально указанного значения.
Настройка HPA по RPS
Настройка автоматического масштабирования HPA по запросам в секунду (RPS) в Kubernetes предполагает использование кастомных метрик. Для этого обычно требуется интеграция с системой мониторинга, которая предоставляет метрики в Kubernetes (например, Prometheus).
Настройка может быть выполнена в несколько шагов:
- Настройка системы мониторинга (на примере Prometheus)
- Установите Prometheus в вашем кластере. Рекомендуется установку Prometheus в Kubernetes производить с использованием Prometheus Operator через Helm. Лучше всего будет воспользоваться Prometheus Community Helm charts. Можете воспользоваться командами:
YAML
- Напишите и примените Service-манифест для доступа к приложению, установленному на прошлом шаге.
- Настройте Prometheus для сбора метрик вашего приложения. Это может потребовать добавления конфигурации сбора метрик в values.yaml при установке chart или настройки ServiceMonitor/PodMonitor в Prometheus Operator.
- ServiceMonitor можно применить как отдельный манифест или воспользоваться специальной секцией
additionalServiceMonitorsпри настройке Prometheus Operator через Helm.Пример конфигурации Prometheus Operator:YAML
- Интеграция с Prometheus AdapterОн помогает Kubernetes использовать метрики из Prometheus для HPA.
- Установите Prometheus Adapter, который будет служить мостом между Prometheus и Kubernetes API для внешних метрик. Используйте Helm для установки Prometheus Adapter:
- При использовании Helm для установки или обновления Prometheus Adapter вы должны предоставить значения, которые переопределяют базовую конфигурацию. Создайте файл
values.yaml, включив определение для prometheus-adapter:YAML
- Установите Prometheus Adapter при помощи команды
helm intall prometheus-adapter prometheus-community/prometheus-adapter -f values.yaml. - Воспользуйтесь командой
kubectl get --raw /apis/custom.metrics.k8s.io/v1beta1, чтобы убедиться в том, что кастомная метрикаhttp_requests_per_secondстала доступна.
- Настройка HPA для масштабирования по RPS
- Создайте HPA, используя внешние метрики (RPS, полученные от Prometheus через Adapter). Пример манифеста HPA может выглядеть так:
YAML
- Примените созданный HPA в кластере Kubernetes:
Пример манифеста ServiceMonitor:
YAML
Требуемый сервис можно обнаружить посредством лейбла app или же кастомного лейбла (например, prometheus-monitored), который вы можете отразить в манифесте Service.
HPA — гибкий и мощный механизм для автоматизации масштабирования приложений в Kubernetes. Он позволяет приложению сохранять стабильную работу в условиях изменяющихся нагрузок. Используя стандартные или кастомные метрики, разработчики могут точно настроить поведение масштабирования и обеспечить эффективную и экономичную работу приложений в кластере.
Задание 1
Сопоставьте характеристики работы разных механизмов масштабирования с их наименованиями.
Итоги
- Kubernetes даёт системе возможность адаптироваться к изменчивой нагрузке и при этом сохранять требуемые показатели производительности и стабильности. А с помощью механизмов масштабирования, таких как Horizontal Pod Autoscaler, Vertical Pod Autoscaler и Cluster Autoscaler, возможно оптимизировать использование ресурсов.
- Horizontal Pod Autoscaler (HPA) автоматически увеличивает или уменьшает количество подов в зависимости от изменения заданных метрик приложения.
- Vertical Pod Autoscaler (VPA) автоматически увеличивает или уменьшает запросы и лимиты на ресурсы приложения: процессор и память.
- Cluster Autoscaler автоматически увеличивает или уменьшает количество нод в кластере на базе запрашиваемых ресурсов всеми подами.
- Чтобы определить, когда и как Kubernetes должен масштабировать приложение, нужны метрики масштабирования. Kubernetes позволяет проводить масштабирование на основании встроенных метрик (использование процессора и памяти) и кастомных метрик, которые можно настроить на основе требований конкретных приложений или бизнес-метрик. Однако для введения кастомных метрик обычно требуется интеграция с системой мониторинга (например, Prometheus).