k8s autoscaler в Яндекс облаке работает не так как вы думаетe

Если мы посмотрим в параметры k8s autoscaler во “взрослых” облаках, то сможем обнаружить следующие настройки “из коробки”

AZURE:

SettingDefault value
scan-interval10 seconds
scale-down-delay-after-add10 minutes
scale-down-delay-after-deletescan-interval
scale-down-delay-after-failureThree minutes
scale-down-unneeded-time10 minutes
scale-down-unready-time20 minutes
ignore-daemonsets-utilizationfalse
daemonset-eviction-for-empty-nodesfalse
daemonset-eviction-for-occupied-nodestrue
scale-down-utilization-threshold0.5
max-graceful-termination-sec600 seconds
balance-similar-node-groupsfalse
expanderrandom
skip-nodes-with-local-storagefalse
skip-nodes-with-system-podstrue
max-empty-bulk-delete10 nodes
new-pod-scale-up-delay0 seconds
max-total-unready-percentage45%
max-node-provision-time15 minutes
ok-total-unready-countThree nodes

AWS:

ParameterDefault
scan-interval10 seconds
max-empty-bulk-delete10
scale-down-delay-after-add10 minutes
scale-down-delay-after-deletescan-interval
scale-down-delay-after-failure3 minutes
scale-down-unneeded-time10 minutes
scale-down-unready-time20 minutes
scale-down-utilization-threshold0.5
scale-down-non-empty-candidates-count30
scale-down-candidates-pool-ratio0.1
scale-down-candidates-pool-min-count50

Дефолтные настройки которые приедут в кластер если вы использовали helm можно посмотреть в официальном репозитории на Github

Нам интересен параметр skip-nodes-with-local-storage

If true, cluster autoscaler doesn’t delete nodes with pods with local storage, for example, EmptyDir or HostPath

Это означает, что любые сущности использующие в своей работе EmptyDir, а встречается их довольно много, не дадут нодам вашего кластера поскейлиться “вниз”

Возможно, такое поведение оправдано из “коробки”, разработчики автоскейлера оставляют этот параметр именно таким, что бы обезопаситься от лишних приколов с удалением каких либо файлов при скейлинге ваших нод

  • Azure по умолчанию использует skip-nodes-with-local-storage=fale
  • Aws использует дефолтный параметр, но оставляет вам возможность изменить его по своему усмотрению
  • Yandex Cloud использует все настройки “по умолчанию” и не дает вам возможности хоть как-то на них влиять

Если в вашем кластере есть сущности использующие EmptyDir, то автоскейлер можно считать сломанным, ноды будут скейлится только “вверх” к увеличению костов и никогда “вниз” к их уменьшению… удобно да?

Вариантов решения проблемы несколько:

  • Полностью отказаться от автоскейлинга (так сделал я)
  • Использовать descheduler (кажется, решение костыльно и привносит еще больше непредсказуемости в поведение)

При должном давлении на тех. поддержку Яндекс может поменять для вас эту настройку (хоть и говорят, что не могут), но при условии отказа от любого SLA по тем кластерам в которых они это сделали :facepalm: