Как добавить автоскалирование в Kubernetes
Что проверяют
Понимаете ли вы, что автоскейлинг в Kubernetes работает на нескольких уровнях: число подов, ресурсы подов и узлы кластера. Следом обычно спрашивают, по какой метрике масштабироваться, если CPU не отражает нагрузку, и почему HPA показывает <unknown> вместо метрик.
Как отвечать
Каркас по уровням:
- HPA: меняет число реплик Deployment или StatefulSet. API
autoscaling/v2, аv2beta2из старых примеров удалён в 1.26 и в современном кластере не применится. Для CPU и памяти нужен Metrics Server. Быстрый старт:kubectl autoscale deployment my-app --cpu-percent=60 --min=2 --max=10; - VPA: подбирает
requestsиlimits. Ставится отдельно и вместе с HPA по той же метрике CPU или памяти не используется, иначе они борются; - узлы: Cluster Autoscaler или Karpenter добавляют ноды, когда поды висят в
Pendingиз-за нехватки ресурсов, и убирают пустые. Без этого HPA упрётся в ёмкость кластера.
Детали HPA, которые отличают практика. Процент утилизации считается от requests: без них HPA не работает, а заниженные requests держат реплики на максимуме. Нужное число реплик равно текущему, умноженному на отношение фактической метрики к целевой, с округлением вверх. Пересчёт по умолчанию раз в 15 секунд, на уменьшение HPA выжидает окно стабилизации в 5 минут, и оба направления настраиваются в блоке behavior.
Если нагрузку лучше отражает очередь или RPS, метрики из Prometheus подключают через Prometheus Adapter или ставят KEDA: она масштабирует по длине очереди Kafka или RabbitMQ и умеет опускать реплики до нуля.
Проверка: kubectl describe hpa показывает текущие метрики и события, нагрузку дают через k6 или hey.
Где спотыкаются
Оставляют spec.replicas в манифесте под GitOps. Каждая синхронизация Argo CD откатывает число реплик, выставленное HPA.
Масштабируют по CPU сервис, который упирается в базу или внешний API. Реплик становится больше, а латентность не падает, и база получает ещё больше соединений.
Забывают про readiness-пробу и прогрев. Новые поды получают трафик до готовности, а JIT и прогрев кэшей на старте раздувают CPU и провоцируют лишний скейлинг.