Истории успеха наших клиентов — лучшие проекты
Вход/ Регистрация
На главную
25eb9e0a-a5a8-472a-ace7-940b8bd2adf0
Облачные сервисы

Автомасштабирование до нуля нод

Автоматическое масштабирование группы нод до нуля позволяет экономить ресурсы, когда они не используются. Это удобно для разовых задач — например, Job — или стейдж-окружений, которые неактивны ночью.

Масштабирование до нуля нод — это частный случай автомасштабирования. Поэтому принципы работы, ограничения и требования, описанные для обычного автомасштабирования, действуют и здесь.

Требования

Чтобы масштабирование до нуля работало, в кластере должна быть еще хотя бы одна группа с 1–2 постоянно активными нодами. Эти ноды нужны для системных компонентов Kubernetes

Настройка подов

Чтобы автоскейлер мог запускать ноды в нужной группе, укажите ID этой группы в манифесте через nodeSelector или nodeAffinity.

Как найти ID группы

  1. Перейдите в панель управления кластером.
  2. Откройте вкладку «Ресурсы».
  3. Нажмите на три точки рядом с нужной группой и выберите «Редактировать группу».

Scr 20250820 Kpwe

  1. 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 хотя бы с одной группой нод.

Создание группы нод с масштабированием до нуля

  1. Перейдите во вкладку «Ресурсы» в панели управления.
  2. Нажмите «Добавить группу».
  3. Выберите конфигурацию воркер-нод.
  4. Включите переключатель «Автомасштабирование» и установите минимальное количество нод равным 0.

Scr 20250820 Luzj

После создания группы появится одна нода, которая будет автоматически удалена, если на ней не запущены пользовательские поды.

Теперь в кластере есть две группы:

  • группа с активными нодами, которые не масштабируются в 0;
  • группа с включенным масштабированием до 0. В нашем примере ее ID — 54289.

Scr 20250820 Lxah

Проверка существующих нод

Выполните команду:

    
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, так как в группе пока нет нод. Перейдите в раздел «Ресурсы» панели управления. Вы увидите, что началось создание ноды в группе с автомасштабированием. 

Scr 20250820 Mugx

После ее создания проверьте список нод:

    
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
Была ли статья полезна?
Ваша оценка очень важна
Пока нет комментариев