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

# TWC Karpenter

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

Karpenter — это контроллер для Kubernetes, который автоматически создает и удаляет воркер-ноды в зависимости от нагрузки в кластере.

Он похож на встроенный [механизм автомасштабирования нод](https://timeweb.cloud/docs/k8s/kubernetes-autoscaling/kubernetes-autoscaler), но работает более гибко: анализирует поды в статусе Pending, подбирает подходящую конфигурацию и создает ноду под текущую нагрузку. При снижении нагрузки неиспользуемые ноды автоматически удаляются.

При увеличении нагрузки в кластере Karpenter:

-   отслеживает поды, которые не удалось разместить;
-   анализирует их требования и подбирает подходящую конфигурацию ноды;
-   создает новую ноду через API и размещает на ней поды.

При этом Karpenter не использует заранее заданные размеры групп нод, а подбирает конфигурацию под текущую рабочую нагрузку. Это позволяет точнее выбирать тип инстанса и эффективнее использовать ресурсы.

При снижении нагрузки он анализирует использование нод и может:

-   удалять неиспользуемые ноды;
-   консолидировать нагрузку, перенося поды на меньшее количество узлов;
-   отключать избыточные или менее эффективные по стоимости ноды.

По сравнению с Cluster Autoscaler, Karpenter:

-   быстрее реагирует на изменение нагрузки;
-   подбирает конфигурацию ноды под конкретную рабочую нагрузку;
-   поддерживает консолидацию и оптимизацию ресурсов;
-   позволяет снизить затраты за счет более точного подбора конфигурации;
-   тесно интегрируется с облачным провайдером и использует его API для управления нодами.

## Установка

> [!NOTE]
> Для установки в кластере должна быть хотя бы одна воркер-нода с конфигурацией не менее 2 vCPU и 4 ГБ RAM.

Перейдите в раздел «Дополнения» в панели управления кластером, найдите «TWC Karpenter» и откройте карточку аддона.

![Scr 20260408 Oszq](https://content.timeweb.com/assets/e5cba43d-8cad-437a-9a08-2f40e8da2631.png?width=2108&height=1666)

Нажмите кнопку «Установить» и дождитесь завершения установки.

Проверить состояние можно командой:

```bash
kubectl get pods -n karpenter
```

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

```bash
NAME                                               READY   STATUS    RESTARTS   AGE
karpenter-provider-timeweb-cloud-dc96f8664-dbcb6   1/1     Running   0          3d21h
```

Если под находится в статусе `Running`, установка прошла успешно.

## Использование

Перед использованием необходимо создать группы нод, которые сможет использовать Karpenter.

Аддон не создает группы нод автоматически. Создайте одну или несколько групп с нужными конфигурациями, после чего Karpenter сможет использовать их для масштабирования.

При создании группы отключите автомасштабирование и автохилинг. Karpenter самостоятельно управляет количеством нод и их состоянием, поэтому эти механизмы должны быть отключены.

### NodeClass

Для настройки дополнения сначала создайте манифест `nodeclass.yaml`. Ресурс `NodeClass` описывает, какую группу нод использовать и какие параметры применять к создаваемым узлам.

Минимальный пример `nodeclass.yaml`:

```yaml
apiVersion: karpenter.k8s.timeweb.cloud/v1alpha1
kind: NodeClass
metadata:
  name: default
spec:
  labels:
    environment: production
    managed-by: karpenter
```

Для более гибкой настройки можно указать дополнительные параметры.

Расширенный пример `nodeclass.yaml`:

```yaml
apiVersion: karpenter.k8s.timeweb.cloud/v1alpha1
kind: NodeClass
metadata:
  name: default
spec:
  nodeGroupID: 12345
  labels:
    environment: production
    managed-by: karpenter
  maxCapacityPerGroup: 10
```

В этом манифесте:

-   `nodeGroupID` задает конкретную группу нод, в которой будут создаваться узлы;
    
-   `labels` позволяет назначить дополнительные метки создаваемым нодам;
    
-   `maxCapacityPerGroup` ограничивает максимальное количество нод в группе.
    

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

Откроется страница с URL вида:

```shell
https://timeweb.cloud/my/kubernetes/<cluster-id>/<node-group-id>/edit
```

Значение `<node-group-id>` в этом URL и есть идентификатор группы нод.

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

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

### NodePool

После создания `NodeClass` необходимо настроить `NodePool`.

Этот ресурс определяет требования к нодам, которые будет создавать Karpenter. Здесь задаются параметры, по которым подбирается подходящая конфигурация: тип инстанса, зона, архитектура и другие ограничения.

Создайте файл `nodepool.yaml` со следующим содержимым:

```yaml
apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
  name: default
spec:
  # Шаблон для новых нод
  template:
    spec:
      nodeClassRef:
        group: karpenter.k8s.timeweb.cloud
        kind: NodeClass
        name: default

      # Требования к нодам
      requirements:
        # Архитектура
        - key: kubernetes.io/arch
          operator: In
          values: ["amd64"]

        # Операционная система
        - key: kubernetes.io/os
          operator: In
          values: ["linux"]

        # Instance type — типы которые могут использоваться
        # Формат: nvme-{cpu}cpu-{ram}ram или highcpu-{cpu}cpu-{ram}ram или dedicatedcpu-{cpu}cpu-{ram}ram или gpu-{cpu}cpu-{ram}ram
        - key: node.kubernetes.io/instance-type
          operator: In
          values: ["nvme-1cpu-2ram", "nvme-2cpu-2ram", "nvme-2cpu-4ram", "nvme-4cpu-8ram", "dedicatedcpu-1cpu-4ram", "dedicatedcpu-2cpu-8ram", "dedicatedcpu-3cpu-12ram", "dedicatedcpu-4cpu-16ram"]

        - key: karpenter.sh/capacity-type
          operator: In
          values: ["on-demand"]

        # Зона доступности
        - key: topology.kubernetes.io/zone
          operator: In
          values: ["spb-3"]

  # Ограничения на ресурсы для всех нод в пуле
  limits:
    cpu: "1000"     # Максимум 1000 CPU по всем узлам
    memory: 1000Gi  # Максимум 1000Gi памяти по всем узлам

  # Политики disruption (consolidationPolicy: WhenEmpty или WhenEmptyOrUnderutilized)
  disruption:
    consolidationPolicy: WhenEmptyOrUnderutilized
    consolidateAfter: 5m
```

В этом манифесте:

-   `nodeClassRef` указывает, какой `NodeClass` использовать для создания нод;
    
-   `requirements` в блоке задаются ограничения на параметры нод;
    
-   `node.kubernetes.io/instance-type` определяет допустимые конфигурации воркеров;
    
-   `kubernetes.io/arch` задает архитектуру нод (поддерживается только `amd64`);
    
-   `kubernetes.io/os` задает операционную систему (поддерживается только `linux`);
    
-   `topology.kubernetes.io/zone` задает зону доступности (поддерживается только `spb-3`);
    
-   `limits` ограничивает суммарные ресурсы всех нод;
    
-   `disruption` управляет удалением неиспользуемых нод.
    

Обратите внимание, что значения в `requirements` должны соответствовать параметрам доступных групп нод. Например, если у вас создано несколько групп нод, укажите в `instance-type` только те конфигурации, которые используются в этих группах.

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

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

После применения манифестов убедитесь, что ресурсы созданы:

```bash
kubectl get nodeclass
kubectl get nodepool
```

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

```shell
NAME      READY   AGE
default   True    3d22h
NAME      NODECLASS   NODES   READY   AGE
default   default     1       True    3d22h
```

### Пример использования

Создадим `deployment` с запросами ресурсов.

Создайте файл `inflate.yaml`:

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: inflate
spec:
  replicas: 1
  selector:
    matchLabels:
      app: inflate
  template:
    metadata:
      labels:
        app: inflate
    spec:
      containers:
        - name: inflate
          image: public.ecr.aws/eks-distro/kubernetes/pause:3.7
          resources:
            requests:
              cpu: "250m"
              memory: "256Mi"
```

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

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

Увеличьте количество подов:

```bash
kubectl scale deployment inflate --replicas=15
```

Если ресурсов текущих нод недостаточно, часть подов перейдет в статус `Pending`. После этого Karpenter создаст новую ноду, и поды начнут создаваться.

Проверить процесс можно командами:

```bash
kubectl get pods
kubectl get nodes
```

При появлении новых нод в списке при выполнении `kubectl get nodes` можно считать, что Karpenter настроен корректно и работает.
