k8s autoscaler в Яндекс облаке работает не так как вы думаетe
Если мы посмотрим в параметры k8s autoscaler во “взрослых” облаках, то сможем обнаружить следующие настройки “из коробки”
AZURE:
Setting | Default value |
---|---|
scan-interval | 10 seconds |
scale-down-delay-after-add | 10 minutes |
scale-down-delay-after-delete | scan-interval |
scale-down-delay-after-failure | Three minutes |
scale-down-unneeded-time | 10 minutes |
scale-down-unready-time | 20 minutes |
ignore-daemonsets-utilization | false |
daemonset-eviction-for-empty-nodes | false |
daemonset-eviction-for-occupied-nodes | true |
scale-down-utilization-threshold | 0.5 |
max-graceful-termination-sec | 600 seconds |
balance-similar-node-groups | false |
expander | random |
skip-nodes-with-local-storage | false |
skip-nodes-with-system-pods | true |
max-empty-bulk-delete | 10 nodes |
new-pod-scale-up-delay | 0 seconds |
max-total-unready-percentage | 45% |
max-node-provision-time | 15 minutes |
ok-total-unready-count | Three nodes |
AWS:
Parameter | Default |
---|---|
scan-interval | 10 seconds |
max-empty-bulk-delete | 10 |
scale-down-delay-after-add | 10 minutes |
scale-down-delay-after-delete | scan-interval |
scale-down-delay-after-failure | 3 minutes |
scale-down-unneeded-time | 10 minutes |
scale-down-unready-time | 20 minutes |
scale-down-utilization-threshold | 0.5 |
scale-down-non-empty-candidates-count | 30 |
scale-down-candidates-pool-ratio | 0.1 |
scale-down-candidates-pool-min-count | 50 |
Дефолтные настройки которые приедут в кластер если вы использовали 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: