Skip to content

Почему 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

Ищите строки: - ConditionsAbleToScale=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.


🛠️ Как диагностировать

  1. Посмотреть описание: bash kubectl describe hpa <имя-hpa>
  2. Проверить метрики: bash kubectl top pods
  3. Проверить логи контроллера HPA (часть kube-controller-manager).
  4. Использовать 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 — там почти всегда указана точная причина.