Почему HPA не масштабируется?
Если Horizontal Pod Autoscaler в Kubernetes не масштабируется, это может быть вызвано множеством причин. Давайте разберёмся по шагам, почему HPA может не работать так, как ожидается.
🔍 1. Проверьте статус HPA
Выполните команду:
kubectl get hpa
Пример вывода:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
my-app-hpa Deployment/my-app <unknown>/50% 1 10 1 2m
Обратите внимание на поле TARGETS:
- Если указано <unknown>
, значит метрики не собираются.
- Если значения не достигают порога — масштабирование не запускается.
🚫 Распространённые причины, почему HPA не масштабируется
✅ 1. Не настроены метрики (Metrics Server)
HPA требует сборщика метрик, например Metrics Server. Без него HPA не может получать данные о нагрузке (CPU, память).
Решение: Установите Metrics Server:
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
Проверьте, работает ли он:
kubectl top nodes
kubectl top pods
Если эти команды не работают — проблема в Metrics Server.
✅ 2. Неправильные или отсутствующие ресурсы в Pod'ах
HPA не будет масштабировать, если у контейнеров не указаны requests для CPU/памяти.
Пример неправильно:
resources:
limits:
cpu: "500m"
Должно быть:
resources:
requests:
cpu: "200m"
memory: "256Mi"
limits:
cpu: "500m"
memory: "512Mi"
💡 HPA использует requests как базу для расчёта использования (например,
usage / request = % использования
).
✅ 3. Целевые метрики не достигнуты
HPA масштабируется только при превышении порога.
Например, если вы установили:
targetCPUUtilizationPercentage: 80
А текущее использование — 40%, то масштабирования не будет.
Проверьте:
kubectl top pods
и сравните с порогами в HPA.
✅ 4. Ограничения min/max replicas
HPA не может масштабироваться за пределы minReplicas
и maxReplicas
.
Пример:
minReplicas: 1
maxReplicas: 3
Если уже 3 реплики, а нагрузка растёт — масштабирование остановится.
✅ 5. Стабилизационный период (Cooldown)
После увеличения количества подов есть окно стабилизации (обычно 5 минут), чтобы избежать частых колебаний. В это время HPA не будет уменьшать количество подов, даже если нагрузка упала.
✅ 6. Кастомные или внешние метрики не работают
Если вы используете custom metrics (например, количество запросов, очередь Kafka), нужно: - Установить Prometheus Adapter или k8s-prometheus-adapter - Проверить, доступны ли метрики через API:
kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1" | jq .
✅ 7. Ошибки в конфигурации HPA
Проверьте YAML HPA:
kubectl describe hpa my-hpa
Ищите строки:
- Conditions
→ AbleToScale=False
- Reason: FailedGetResourceMetric
, InvalidSelector
, NotFound
и т.д.
Пример ошибки:
Events:
Warning FailedComputeMetricsReplicas 3m (x10) horizontal-pod-autoscaler failed to get cpu utilization: did not receive metrics for any ready pods
✅ 8. Pod'ы не готовы (Not Ready)
Если новые Pod'ы не переходят в статус Ready
(из-за liveness/readiness проб, ошибок запуска и т.п.), HPA может не учитывать их при расчёте.
Проверьте:
kubectl get pods
kubectl describe pod <имя-под>
✅ 9. Версия HPA
Убедитесь, что используется актуальная версия:
apiVersion: autoscaling/v2
(вместо v1
или v2beta2
)
В v2
можно использовать более гибкие правила, включая multiple metrics.
🛠️ Как диагностировать
- Посмотреть описание:
bash kubectl describe hpa <имя-hpa>
- Проверить метрики:
bash kubectl top pods
- Проверить логи контроллера HPA (часть kube-controller-manager).
- Использовать
kubectl get --raw "/apis/metrics.k8s.io/v1beta1/pods"
для просмотра сырых метрик.
✅ Пример рабочего HPA (v2)
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: my-app-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: my-app
minReplicas: 1
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 80
🔧 Совет: Всегда начинайте с kubectl describe hpa
— там почти всегда указана точная причина.