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 МБ) или увеличить целевое использование памяти, чтобы это еще больше уменьшило масштаб.
(Простое нахождение ниже целевого значения само по себе не приведет к уменьшению масштабирования, вы должны быть ниже целевого значения, чтобы эта формула произвела более низкое число. Это помогает избежать сбоев, если нагрузка находится прямо около порогового значения, которое вызовет масштабирование в в одну или другую сторону.)