---
title: "Автомасштабирование кластера Kubernetes до нуля нод"
description: "Автомасштабирование кластера Kubernetes до нуля нод. Документация и инструкции по использованию и настройке облачных сервисов Timeweb Cloud."
---

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

> Полный индекс документации для ИИ-агентов: [llms.txt](https://timeweb.cloud/llms.txt).

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

> [!NOTE]
> Масштабирование до нуля нод — это частный случай [автомасштабирования](https://timeweb.cloud/docs/k8s/kubernetes-autoscaling/kubernetes-autoscaler). Поэтому принципы работы, ограничения и требования, описанные для обычного автомасштабирования, действуют и здесь.

## Требования

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

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

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

В качестве условия можно использовать ID группы воркер-нод или [пользовательский лейбл](https://timeweb.cloud/docs/k8s/kubernetes-autoscaling/kubernetes-autoscaler#ispolzovanie-nodeselector-i-nodeaffinity), заданный для этой группы. Лейблы позволяют гибко управлять размещением подов и не привязываться к конкретным ID.

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

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

![Scr 20250820 Kpwe](https://content.timeweb.com/assets/c5beeff6-63da-44d0-bbee-d34d62e6f6a7.png?width=2012&height=1112)

4.  ID группы будет указан в URL, например:
    

```shell
https://timeweb.cloud/my/kubernetes/1048329/54289/edit
```

Здесь:

-   `1048329` — ID кластера,
-   `54289` — ID группы узлов.

Пример с `nodeSelector`:

```yaml
nodeSelector:
  k8s.timeweb.cloud/cluster-node-group-id: "54289"
```

Пример с `nodeAffinity`:

```yaml
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 и посмотрим, как кластер автоматически создаст ноду для выполнения задачи и удалит ее после завершения.

При создании группы воркер-нод можно сразу задать пользовательские лейблы и использовать их для размещения подов. В этом примере для простоты будем использовать ID группы.

### Предварительные требования

Существующий кластер Kubernetes хотя бы с одной группой нод.

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

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

![Scr 20250820 Luzj](https://content.timeweb.com/assets/d1bb381b-2c90-4046-9bc0-93625989f393.png?width=1032&height=1570)

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

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

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

![Scr 20250820 Lxah](https://content.timeweb.com/assets/e7c2d2a7-576c-41cc-8393-441d4df5826c.png?width=1528&height=704)

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

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

```bash
kubectl get nodes
```

Пример вывода:

```bash
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` со следующим содержимым:

```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`).

Примените манифест:

```bash
kubectl apply -f job.yaml
```

Проверьте список подов:

```bash
kubectl get pod
```

Пример вывода:

```shell
NAME              READY   STATUS    RESTARTS   AGE
hello-job-s7ktd   0/1     Pending   0          4s
```

Под находится в статусе `Pending`, так как в группе пока нет нод. Перейдите в раздел «Ресурсы» панели управления. Вы увидите, что началось создание ноды в группе с автомасштабированием. 

![Scr 20250820 Mugx](https://content.timeweb.com/assets/fb105bee-98cb-4edc-a648-f469b429ab9c.png?width=2010&height=1090)

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

```bash
kubectl get nodes
```

Пример вывода:

```shell
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.

Проверьте под снова:

```shell
kubectl get pod
```

Пример вывода:

```shell
NAME              READY   STATUS    RESTARTS   AGE
hello-job-s7ktd   1/1     Running   0          5m30s
```

Теперь под запущен.

### Завершение задания и удаление ноды

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

```bash
kubectl describe node worker-192.168.0.6
```

Найдите строку:

```yml
Taints:  DeletionCandidateOfClusterAutoscaler=1755679271:PreferNoSchedule
```

Это означает, что нода помечена на удаление. Через 2 минуты после установки тейнта она будет удалена.

Проверьте это:

```shell
kubectl get nodes
```
