Karpenter — это контроллер для Kubernetes, который автоматически создает и удаляет воркер-ноды в зависимости от нагрузки в кластере.
Он похож на встроенный механизм автомасштабирования нод, но работает более гибко: анализирует поды в статусе Pending, подбирает подходящую конфигурацию и создает ноду под текущую нагрузку. При снижении нагрузки неиспользуемые ноды автоматически удаляются.
При увеличении нагрузки в кластере Karpenter:
- отслеживает поды, которые не удалось разместить;
- анализирует их требования и подбирает подходящую конфигурацию ноды;
- создает новую ноду через API и размещает на ней поды.
При этом Karpenter не использует заранее заданные размеры групп нод, а подбирает конфигурацию под текущую рабочую нагрузку. Это позволяет точнее выбирать тип инстанса и эффективнее использовать ресурсы.
При снижении нагрузки он анализирует использование нод и может:
- удалять неиспользуемые ноды;
- консолидировать нагрузку, перенося поды на меньшее количество узлов;
- отключать избыточные или менее эффективные по стоимости ноды.
По сравнению с Cluster Autoscaler, Karpenter:
- быстрее реагирует на изменение нагрузки;
- подбирает конфигурацию ноды под конкретную рабочую нагрузку;
- поддерживает консолидацию и оптимизацию ресурсов;
- позволяет снизить затраты за счет более точного подбора конфигурации;
- тесно интегрируется с облачным провайдером и использует его API для управления нодами.
Установка
Для установки в кластере должна быть хотя бы одна воркер-нода с конфигурацией не менее 2 vCPU и 4 ГБ RAM.
Перейдите в раздел «Дополнения» в панели управления кластером, найдите «TWC Karpenter» и откройте карточку аддона.

Нажмите кнопку «Установить» и дождитесь завершения установки.
Проверить состояние можно командой:
kubectl get pods -n karpenter
Пример вывода:
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:
apiVersion: karpenter.k8s.timeweb.cloud/v1alpha1
kind: NodeClass
metadata:
name: default
spec:
labels:
environment: production
managed-by: karpenter
Для более гибкой настройки можно указать дополнительные параметры.
Расширенный пример nodeclass.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 вида:
https://timeweb.cloud/my/kubernetes/<cluster-id>/<node-group-id>/edit
Значение <node-group-id> в этом URL и есть идентификатор группы нод.
Примените манифест:
kubectl apply -f nodeclass.yaml
NodePool
После создания NodeClass необходимо настроить NodePool.
Этот ресурс определяет требования к нодам, которые будет создавать Karpenter. Здесь задаются параметры, по которым подбирается подходящая конфигурация: тип инстанса, зона, архитектура и другие ограничения.
Создайте файл nodepool.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 только те конфигурации, которые используются в этих группах.
Примените манифест:
kubectl apply -f nodepool.yaml
После применения манифестов убедитесь, что ресурсы созданы:
kubectl get nodeclass kubectl get nodepool
Пример вывода:
NAME READY AGE default True 3d22h NAME NODECLASS NODES READY AGE default default 1 True 3d22h
Пример использования
Создадим deployment с запросами ресурсов.
Создайте файл inflate.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"
Примените манифест:
kubectl apply -f inflate.yaml
Увеличьте количество подов:
kubectl scale deployment inflate --replicas=15
Если ресурсов текущих нод недостаточно, часть подов перейдет в статус Pending. После этого Karpenter создаст новую ноду, и поды начнут создаваться.
Проверить процесс можно командами:
kubectl get pods kubectl get nodes
При появлении новых нод в списке при выполнении kubectl get nodes можно считать, что Karpenter настроен корректно и работает.