Автоматическое масштабирование группы нод до нуля позволяет экономить ресурсы, когда они не используются. Это удобно для разовых задач — например, Job — или стейдж-окружений, которые неактивны ночью.
Масштабирование до нуля нод — это частный случай автомасштабирования. Поэтому принципы работы, ограничения и требования, описанные для обычного автомасштабирования, действуют и здесь.
Требования
Чтобы масштабирование до нуля работало, в кластере должна быть еще хотя бы одна группа с 1–2 постоянно активными нодами. Эти ноды нужны для системных компонентов Kubernetes
Настройка подов
Чтобы автоскейлер мог запускать ноды в нужной группе, укажите ID этой группы в манифесте через nodeSelector
или nodeAffinity
.
Как найти ID группы
- Перейдите в панель управления кластером.
- Откройте вкладку «Ресурсы».
- Нажмите на три точки рядом с нужной группой и выберите «Редактировать группу».
-
ID группы будет указан в URL, например:
https://timeweb.cloud/my/kubernetes/1048329/54289/edit
Здесь:
1048329
— ID кластера,54289
— ID группы узлов.
Пример с nodeSelector
:
nodeSelector:
k8s.timeweb.cloud/cluster-node-group-id: "54289"
Пример с nodeAffinity
:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: k8s.timeweb.cloud/cluster-node-group-id
operator: In
values:
- "54289"
Когда масштабирование до нуля не сработает
Автоскейлер не сможет удалить последнюю ноду в группе в следующих случаях:
- У пода установлена аннотация:
cluster-autoscaler.kubernetes.io/safe-to-evict: "false"
- Поды нельзя переместить на другие узлы из-за ограничений планировщика.
- Есть
PodDisruptionBudget
, который не позволяет удалить поды без превышения лимита. - Под не управляется контроллером (
Deployment
,StatefulSet
,Job
,ReplicaSet
).
Практический пример
В этом примере создадим группу узлов с включенным масштабированием до нуля, запустим в ней Job и посмотрим, как кластер автоматически создаст ноду для выполнения задачи и удалит ее после завершения.
Предварительные требования
Существующий кластер Kubernetes хотя бы с одной группой нод.
Создание группы нод с масштабированием до нуля
- Перейдите во вкладку «Ресурсы» в панели управления.
- Нажмите «Добавить группу».
- Выберите конфигурацию воркер-нод.
- Включите переключатель «Автомасштабирование» и установите минимальное количество нод равным 0.
После создания группы появится одна нода, которая будет автоматически удалена, если на ней не запущены пользовательские поды.
Теперь в кластере есть две группы:
- группа с активными нодами, которые не масштабируются в 0;
- группа с включенным масштабированием до 0. В нашем примере ее ID —
54289
.
Проверка существующих нод
Выполните команду:
kubectl get nodes
Пример вывода:
NAME STATUS ROLES AGE VERSION
worker-192.168.0.25 Ready <none> 21h v1.33.3+k0s
worker-192.168.0.8 Ready <none> 22h v1.33.3+k0s
Создание Job
Создайте файл job.yaml
со следующим содержимым:
apiVersion: batch/v1
kind: Job
metadata:
name: hello-job
spec:
ttlSecondsAfterFinished: 30
template:
metadata:
name: hello-job
spec:
restartPolicy: Never
nodeSelector:
k8s.timeweb.cloud/cluster-node-group-id: "54289"
containers:
- name: hello
image: busybox
command:
- sh
- -c
- 'i=0; while [ $i -lt 10 ]; do echo "Hello from job"; sleep 30; i=$((i+1)); done'
resources:
requests:
cpu: "50m"
memory: "32Mi"
limits:
cpu: "100m"
memory: "64Mi"
Это задание запускает контейнер с образом busybox
, который выводит сообщение в лог 10 раз с интервалом 30 секунд.
Обратите внимание: в секции nodeSelector
указан ID группы нод (54289
).
Примените манифест:
kubectl apply -f job.yaml
Проверьте список подов:
kubectl get pod
Пример вывода:
NAME READY STATUS RESTARTS AGE
hello-job-s7ktd 0/1 Pending 0 4s
Под находится в статусе Pending
, так как в группе пока нет нод. Перейдите в раздел «Ресурсы» панели управления. Вы увидите, что началось создание ноды в группе с автомасштабированием.
После ее создания проверьте список нод:
kubectl get nodes
Пример вывода:
NAME STATUS ROLES AGE VERSION
worker-192.168.0.25 Ready <none> 21h v1.33.3+k0s
worker-192.168.0.6 Ready <none> 7m v1.33.3+k0s
worker-192.168.0.8 Ready <none> 22h v1.33.3+k0s
worker-192.168.0.6
— это новая нода, созданная для Job.
Проверьте под снова:
kubectl get pod
Пример вывода:
NAME READY STATUS RESTARTS AGE
hello-job-s7ktd 1/1 Running 0 5m30s
Теперь под запущен.
Завершение задания и удаление ноды
После выполнения Job на ноду, где она запускалась, будет установлен тейнт. Посмотрите его командой:
kubectl describe node worker-192.168.0.6
Найдите строку:
Taints: DeletionCandidateOfClusterAutoscaler=1755679271:PreferNoSchedule
Это означает, что нода помечена на удаление. Через 2 минуты после установки тейнта она будет удалена.
Проверьте это:
kubectl get nodes