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

Что произошло: я настроил 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, а количество модулей до сих пор не уменьшилось, хотя они уже несколько часов ниже целевого уровня. image

Через день: image

Я ожидал, что модули уменьшатся, когда объем памяти упадет ниже 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:
  • OS (e.g: 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

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

Спасибо!


person Suemayah Eldursi    schedule 26.10.2020    source источник


Ответы (2)


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

Бета-версию, которая включает поддержку масштабирования памяти и настраиваемых показателей, можно найти в 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.

person Wytrzymały Wiktor    schedule 26.10.2020
comment
Спасибо! Я попробую и вернусь к вам. Возникли другие приоритеты, и у меня еще не было возможности проверить эту рекомендацию - person Suemayah Eldursi; 03.11.2020
comment
Большое спасибо! теперь это работает так, как я ожидал, и я получил возможность увеличивать и уменьшать масштаб. - person Suemayah Eldursi; 05.11.2020

Формула того, как HPA определяет количество запускаемых модулей, находится в Документация по горизонтальному автоматическому масштабированию модулей:

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 МБ) или увеличить целевое использование памяти, чтобы это еще больше уменьшило масштаб.

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

person David Maze    schedule 26.10.2020
comment
Спасибо за ваш ответ. Это имеет смысл, но на втором снимке экрана, который я показал, память составляет примерно 190 МБ, и это будет означать, что, используя формулу, желаемых реплик должно быть 2. Разве это не так? - person Suemayah Eldursi; 03.11.2020
comment
TBH Я также заметил это, но идея указать, что @DavidMaze может ошибаться в вопросах k8s, просто не кажется мне правильной;) - person Wytrzymały Wiktor; 05.11.2020