Kubernetes HPA не масштабируется, как ожидалось

Что произошло: я настроил ГПА со следующими деталями:

apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: api-horizontalautoscaler
  namespace: develop
spec:
  scaleTargetRef:
    apiVersion: extensions/v1beta1
    kind: Deployment
    name: api-deployment
  minReplicas: 1
  maxReplicas: 4
  metrics:
  - type: Resource
    resource:

      name: memory
      targetAverageValue: 400Mib

Я ожидал, что произойдет: количество модулей увеличилось до 3, когда мы добавили некоторую нагрузку, а средняя память превысила 400, что и ожидалось. Теперь средний объем памяти снизился примерно до 300, а количество модулей все еще не уменьшилось, хотя они были ниже целевого значения уже пару часов.образ

Через день:образ

Я ожидал, что модули уменьшатся, когда память упадет ниже 400

Окружающая среда:

  • Версия Kubernetes (с использованием kubectl version):
Client Version: version.Info{Major:"1", Minor:"13", GitVersion:"v1.13.9", GitCommit:"3e4f6a92de5f259ef313ad876bb008897f6a98f0", GitTreeState:"clean", BuildDate:"2019-08-05T09:22:00Z", GoVersion:"go1.11.5", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"13", GitVersion:"v1.13.10", GitCommit:"37d169313237cb4ceb2cc4bef300f2ae3053c1a2", GitTreeState:"clean", BuildDate:"2019-08-19T10:44:49Z", GoVersion:"go1.11.13", Compiler:"gc", Platform:"linux/amd64"}re configuration:
  • ОС (например: cat /etc/os-release):
> cat /etc/os-release
NAME="Ubuntu"
VERSION="18.04.3 LTS (Bionic Beaver)"
  • Ядро (например, uname -a): x86_64 x86_64 x86_64 GNU/Linux

Мне очень хотелось бы знать, почему это так. Любую необходимую информацию я буду рад предоставить.

Благодаря!

2 ответа

Решение

Есть две вещи, на которые стоит обратить внимание:

  • Версия API:

Бета-версию, которая включает поддержку масштабирования памяти и настраиваемых показателей, можно найти в autoscaling/v2beta2. Новые поля, представленные в autoscaling/v2beta2 сохраняются как аннотации при работе с autoscaling/v1.

В autoscaling/v2beta2был представлен в K8s 1.12, поэтому, несмотря на то, что вы используете 1.13 (а это уже 6 основных версий), он должен работать нормально (однако рекомендуется обновление до более новой версии). Попробуйте изменить свой apiVersion: к autoscaling/v2beta2.

--horizontal-pod-autoscaler-downscale-stabilization: Значение этого параметра - это продолжительность, которая указывает, как долго автомасштабатор должен ждать, прежде чем другая операция масштабирования может быть выполнена после завершения текущей. Значение по умолчанию - 5 минут (5m0s).

Проверьте значение этого конкретного флага после изменения предложенного выше API.

Формула того, как HPA решает, сколько модулей нужно запустить, находится в документации Horizontal Pod Autoscaler:

desiredReplicas = ceil[currentReplicas * ( currentMetricValue / desiredMetricValue )]

С числами, которые вы даете, currentReplicas это 3, currentMetricValue составляет 300 МБ, а desiredMetricValue составляет 400 МБ, поэтому это сокращается до

desiredReplicas = ceil[3 * (300 / 400)]
desiredReplicas = ceil[3 * 0.75]
desiredReplicas = ceil[2.25]
desiredReplicas = 3

Вам необходимо дополнительно уменьшить нагрузку (среднее использование памяти ниже 266 МБ) или увеличить целевое использование памяти, чтобы это еще больше уменьшило масштаб.

(Простое нахождение ниже целевого значения само по себе не приведет к уменьшению масштабирования, вы должны быть ниже целевого значения, чтобы эта формула произвела более низкое число. Это помогает избежать сбоев, если нагрузка находится прямо около порогового значения, которое вызовет масштабирование в в одну или другую сторону.)

Другие вопросы по тегам