Разверните OpenClaw в облаке в один клик
Вход/ Регистрация
На главную
Облачные сервисы

TWC Karpenter

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

Он похож на встроенный механизм автомасштабирования нод, но работает более гибко: анализирует поды в статусе Pending, подбирает подходящую конфигурацию и создает ноду под текущую нагрузку. При снижении нагрузки неиспользуемые ноды автоматически удаляются.

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

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

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

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

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

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

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

Установка

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

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

Scr 20260408 Oszq

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

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

    
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 настроен корректно и работает.

Была ли статья полезна?
Ваша оценка очень важна
Пока нет комментариев