Реализация автоматического масштабирования ресурсов по нагрузке
Автомасштабирование — это способность инфраструктуры автоматически добавлять или убирать ресурсы в ответ на изменение нагрузки. Без него — либо переплачиваешь за ресурсы в спокойное время, либо сайт падает при пиковых нагрузках. Правильно настроенное масштабирование решает оба варианта одновременно.
Уровни масштабирования
Вертикальное (Scale Up): увеличение мощности одного инстанса. Автоматически — через AWS Graviton Flex (ограничено), в основном требует ручного вмешательства или останова. Подходит для stateful компонентов (БД).
Горизонтальное (Scale Out): добавление новых инстансов/подов. Предпочтительно для stateless сервисов. Работает мгновенно без останова.
Метрики для масштабирования
Что масштабировать — важнее, как. Выбор неправильной метрики даёт масштабирование не вовремя.
| Метрика | Когда использовать | Недостатки |
|---|---|---|
| CPU Utilization | Compute-intensive задачи | Запаздывает: масштабирование начинается после деградации |
| Request Rate (RPS) | Web-серверы, API | Нужна baseline calibration |
| Queue Depth | Async обработка | Оптимальна для queue-based архитектур |
| Response Time (P95) | SLO-ориентированный подход | Самая точная, сложнее настроить |
| Custom business metric | Специфические сценарии | Требует дополнительной интеграции |
AWS Auto Scaling Group
resource "aws_autoscaling_group" "app" {
name = "app-asg"
min_size = 2
max_size = 20
desired_capacity = 3
vpc_zone_identifier = var.private_subnet_ids
launch_template {
id = aws_launch_template.app.id
version = "$Latest"
}
health_check_type = "ELB"
health_check_grace_period = 60
target_group_arns = [aws_lb_target_group.app.arn]
}
# Target Tracking: держать CPU на 60%
resource "aws_autoscaling_policy" "cpu_tracking" {
name = "cpu-tracking"
autoscaling_group_name = aws_autoscaling_group.app.name
policy_type = "TargetTrackingScaling"
target_tracking_configuration {
predefined_metric_specification {
predefined_metric_type = "ASGAverageCPUUtilization"
}
target_value = 60.0
scale_in_cooldown = 300
scale_out_cooldown = 60
}
}
Scale-out cooldown (60s) должен быть меньше scale-in cooldown (300s) — быстро реагируем на рост, медленно убираем ресурсы (даём нагрузке устояться).
Kubernetes Horizontal Pod Autoscaler (HPA)
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: app-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: app
minReplicas: 2
maxReplicas: 50
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 60
- type: Pods
pods:
metric:
name: http_requests_per_second
target:
type: AverageValue
averageValue: "100"
Кастомная метрика http_requests_per_second — из Prometheus через kube-state-metrics + Prometheus Adapter.
KEDA: масштабирование по внешним источникам
KEDA (Kubernetes Event-Driven Autoscaling) масштабирует поды по метрикам из внешних систем: Redis, RabbitMQ, Kafka, SQS.
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: queue-processor
spec:
scaleTargetRef:
name: worker-deployment
minReplicaCount: 1
maxReplicaCount: 30
triggers:
- type: rabbitmq
metadata:
host: amqp://rabbitmq:5672/
queueName: tasks
queueLength: "50" # 1 под на каждые 50 сообщений в очереди
Масштабирование до нуля подов при пустой очереди — экономит ресурсы.
Predictive scaling
AWS Predictive Scaling предугадывает нагрузку на основе исторических данных (требует минимум 14 дней) и заблаговременно добавляет ресурсы. Эффективно для паттернов с регулярным пиком (утренний трафик, дневной пик бизнес-активности).
resource "aws_autoscaling_policy" "predictive" {
name = "predictive"
autoscaling_group_name = aws_autoscaling_group.app.name
policy_type = "PredictiveScaling"
predictive_scaling_configuration {
mode = "ForecastAndScale"
scheduling_buffer_time = 300 # Запустить за 5 минут до предсказанного пика
max_capacity_breach_behavior = "IncreaseMaxCapacity"
metric_specification {
target_value = 60
predefined_scaling_metric_specification {
predefined_metric_type = "ASGAverageCPUUtilization"
}
predefined_load_metric_specification {
predefined_metric_type = "ASGTotalNetworkIn"
}
}
}
}
Тест масштабирования
Нагрузочный тест перед запуском в продакшен:
# k6 для генерации нагрузки
k6 run --vus 1000 --duration 10m script.js
# Наблюдать в реальном времени
watch -n5 "aws autoscaling describe-auto-scaling-groups \
--auto-scaling-group-names app-asg \
--query 'AutoScalingGroups[0].Instances[*].InstanceId' \
--output table"
Проверять: время реакции на рост нагрузки, отсутствие downtime при scale-out, корректное дренирование соединений при scale-in.
Sроки реализации
- ASG с Target Tracking (AWS) — 2-3 дня
- HPA + Prometheus Adapter (Kubernetes) — 3-5 дней
- KEDA для queue-based workloads — 2-3 дня
- Predictive scaling — 1-2 дня (после 14 дней данных)
- Нагрузочное тестирование + тюнинг cooldown — 2-3 дня







