<div><img src="https://top-fwz1.mail.ru/counter?id=3548135;js=na" style="position:absolute;left:-9999px;" alt="Top.Mail.Ru" /></div>
Публичное облако на базе VMware с управлением через vCloud Director
Вход / Регистрация
На главную
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
Была ли статья полезна?
Ваша оценка очень важна
Пока нет комментариев