Реалізація автоматичного масштабування ресурсів за навантаженням
Автомасштабування — це здатність інфраструктури автоматично додавати або видаляти ресурси у відповідь на зміни навантаження. Без нього — або переплачуєте за ресурси у спокійний час, або сайт падає при пікових навантаженнях. Правильно налаштоване масштабування вирішує обидві проблеми одночасно.
Рівні масштабування
Вертикальне (Scale Up): збільшення потужності одного інстансу. Автоматично — через AWS Graviton Flex (обмежено), в основному вимагає ручного втручання або зупинення. Придатне для stateful компонентів (БД).
Горизонтальне (Scale Out): додавання нових інстансів/подів. Переважно для stateless сервісів. Працює миттєво без простоїв.
Метрики для масштабування
Що масштабувати важливіше, ніж як. Неправильний вибір метрики призводить до несвоєчасного масштабування.
| Метрика | Коли використовувати | Недоліки |
|---|---|---|
| CPU Utilization | Обчислювальні завдання | Запізнюється: масштабування починається після деградації |
| Request Rate (RPS) | Веб-сервери, API | Потрібна калібровка базової лінії |
| Queue Depth | Асинхронна обробка | Оптимальна для архітектур на основі черг |
| Response Time (P95) | SLO-орієнтований підхід | Найточніша, складніша для налаштування |
| Користувальницька метрика | Специфічні сценарії | Вимагає додаткової інтеграції |
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 повідомлень у черзі
Масштабування до нуля подів при порожній черзі економить ресурси.
Прогнозне масштабування
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"
Перевірити: час реакції на ріст навантаження, відсутність простоїв під час масштабування, коректне дренування з'єднань під час масштабування.
Часова шкала реалізації
- ASG з Target Tracking (AWS) — 2-3 дні
- HPA + Prometheus Adapter (Kubernetes) — 3-5 днів
- KEDA для queue-based навантажень — 2-3 дні
- Прогнозне масштабування — 1-2 дні (після 14 днів даних)
- Нагрузочне тестування + настроювання cooldown — 2-3 дні







