Налаштування Kubernetes Cluster Autoscaler (Node Autoscaling)

Коли поді в Kubernetes зависають у статусі Pending, а нові ноди не з'являються, бізнес втрачає час і гроші. Ми налаштовуємо Cluster Autoscaler та Node Autoscaling так, щоб інфраструктура автоматично реагувала на зростання навантаження. Наша команда бере на себе весь цикл — від діагностики до впровадження та подальшої підтримки, забезпечуючи стабільну роботу кластера.
Часті запитання

Налаштування Kubernetes Cluster Autoscaler (Node Autoscaling)

Після розгортання Kubernetes-кластера з HPA ви помічаєте, що поди масштабуються, але нові ноди не додаються. Логи Cluster Autoscaler мовчать, поди висять у стані Pending. Типова ситуація: на одному з проектів клієнт втратив 3 години продакшн-доступності через неправильну конфігурацію CA. Ми вирішуємо такі проблеми на регулярній основі — за 5 років роботи з k8s на 30+ проектах. Cluster Autoscaler (CA) автоматизує масштабування нод: він додає обчислювальні ресурси, коли поди не можуть бути заплановані через нестачу CPU або пам'яті, і видаляє ноди при зниженні навантаження. Але його поведінка сильно залежить від налаштувань хмарного провайдера та політик планувальника.

CA працює на рівні нод: додає та видаляє ноди залежно від наявності подів у стані Pending через нестачу ресурсів. У зв'язці з HPA або KEDA це повний цикл: навантаження зростає → HPA додає поди → поди не містяться → CA додає ноду → поди запускаються. Однак у реальності процес часто ламається через тонкі налаштування.

Чому нові ноди не з'являються?

Найчастіший сценарій: CA налаштований, поди в Pending, але ноди не додаються. Команда kubectl describe pod <pending-pod> покаже точну причину. Типові причини:

  • Pod не unschedulable через ресурси, а через affinity/taint. Наприклад, якщо под використовує nodeSelector: gpu: "true", а в пулі немає GPU-інстансів, CA не зможе допомогти — він створює ноди тільки з існуючих node groups.
  • PodDisruptionBudget (PDB) блокує скейлінг вниз. CA намагається видалити ноду, переселивши поди, але PDB забороняє евакуацію. Нода залишається, економія ресурсів не відбувається.
  • Scale-down blocked by system pods. CA не видаляє ноди з подами без PDB, standalone pods, подами з анотацією cluster-autoscaler.kubernetes.io/safe-to-evict: "false" або hostPath volumes. Для діагностики використовуйте kubectl describe node <node> | grep -A5 "Annotations".
Приклад діагностики
kubectl get pods --field-selector=status.phase=Pending kubectl describe pod pending-pod-name 

Зверніть увагу на події та умови. Якщо причина — 0/1 nodes are available: 1 Insufficient cpu, то CA повинен спрацювати.

Як Cluster Autoscaler взаємодіє з HPA?

HPA збільшує кількість подів при зростанні навантаження. Коли ресурси поточних нод вичерпані, нові поди переходять у стан Pending, і CA додає ноду. Важливо налаштувати затримки: --scale-down-delay-after-add=10m не дає CA видалити ноду одразу після появи, а --scale-down-unneeded-time=10m — час простою перед видаленням. Це запобігає флуктуаціям при пікових навантаженнях. За нашими даними, правильні затримки знижують кількість зайвих скейлінгів на 40%.

Конфігурація для хмарних провайдерів

AWS (EKS)

command: - ./cluster-autoscaler - --v=4 - --stderrthreshold=info - --cloud-provider=aws - --skip-nodes-with-local-storage=false - --expander=least-waste - --node-group-auto-discovery=asg:tag=k8s.io/cluster-autoscaler/enabled,k8s.io/cluster-autoscaler/my-cluster - --balance-similar-node-groups - --scale-down-delay-after-add=10m - --scale-down-unneeded-time=10m 

--expander=least-waste обирає node group, яка найбільш ефективно використовує ресурси нової ноди. Альтернативи: random, most-pods, priority (за явно заданими пріоритетами node groups).

--balance-similar-node-groups балансує ноди між схожими групами — важливо для multi-AZ деплою, щоб ноди розподілялися між зонами доступності.

GKE (Standard)

На GKE Cluster Autoscaler керується через gcloud при створенні node pool:

gcloud container node-pools create general \
  --cluster=my-cluster \
  --enable-autoscaling \
  --min-nodes=1 \
  --max-nodes=20 \
  --machine-type=n2-standard-4

На bare metal або kubeadm-кластерах CA працює тільки якщо є API для керування нодами — наприклад, через cloud-controller-manager або кастомний провайдер.

Коли варто обрати Karpenter замість Cluster Autoscaler?

На AWS Karpenter — більш гнучке рішення. Він не прив'язаний до заздалегідь створених Auto Scaling Groups: сам обирає тип інстансу на основі потреб подів і запитує його через EC2 API. Різниця: CA додає ноду з фіксованого node pool з конкретним instance type, а Karpenter дивиться на requests всіх pending подів і обирає найдешевший підходящий тип — може бути m5.large, може бути c6i.2xlarge. Spot instances підтримуються нативно.

NodePool Karpenter:

---
apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
  name: general
spec:
  template:
    spec:
      requirements:
        - key: karpenter.sh/capacity-type
          operator: In
          values: ["spot", "on-demand"]
        - key: kubernetes.io/arch
          operator: In
          values: ["amd64"]
      limits:
        cpu: 1000
      disruption:
        consolidationPolicy: WhenUnderutilized
        consolidateAfter: 1m

consolidateAfter: 1m — Karpenter агресивно консолідує: якщо ноди недовантажені, він переселяє поди і прибирає зайві. Це знижує витрати на AWS на 30-50% за нашими оцінками. Karpenter швидше реагує на зміни: консолідація відбувається за хвилину, а не за 10 хвилин як у CA.

Порівняння Cluster Autoscaler та Karpenter

Параметр Cluster Autoscaler Karpenter
Типи інстансів Фіксовані з ASG Динамічний вибір
Spot instances Через ASG Нативна підтримка
Консолідація Базова Агресивна (1 min)
Конфігурація Флаги CA Custom Resource
Провайдери AWS, GCP, Azure AWS (поки)

Типові параметри затримок CA

Параметр Значення за замовчуванням Рекомендоване Опис
scale-down-delay-after-add 10m 10m Затримка після додавання ноди перед можливим видаленням
scale-down-delay-after-delete 0s 10s Затримка після видалення ноди
scale-down-delay-after-failure 3m 3m Затримка після невдалого скейлінгу
scale-down-unneeded-time 10m 5-10m Час простою ноди перед видаленням

Як провести діагностику скейлінгу?

  1. Перевірте статус CA: kubectl get pods -n kube-system | grep cluster-autoscaler.
  2. Подивіться логи: kubectl logs -n kube-system deployment/cluster-autoscaler --tail=50.
  3. Переконайтеся, що metrics-server працює: kubectl top nodes.
  4. Перевірте, що поди мають requests: CA не масштабує поди без requests.
  5. Використовуйте kubectl describe pod <pending-pod> для аналізу подій.

Що входить в роботу з налаштування автокейлінгу

  • Аудит поточної конфігурації кластера та навантаження.
  • Вибір стратегії: CA або Karpenter.
  • Налаштування CA з правильними expander, затримками, балансуванням.
  • Конфігурація PDB для системних подів.
  • Інтеграція з моніторингом (Prometheus+Grafana).
  • Документація з експлуатації та runbook.

Терміни та вартість

Налаштування CA для одного хмарного провайдера з базовими параметрами — від 1 дня. Повне налаштування з multi-AZ, PDB, моніторингом — від 1 до 3 днів. Міграція на Karpenter — від 2 днів. Вартість розраховується індивідуально після аудиту. Звертаючись до нас, ви отримуєте гарантію коректної роботи Cluster Autoscaler у бойових умовах. Зв'яжіться з нами для оцінки вашого проекту — ми допоможемо оптимізувати витрати на хмарні ресурси.

Досвід наших інженерів — 5+ років роботи з Kubernetes, понад 30 успішних проектів з автоматизації інфраструктури. Грамотне налаштування CA економить від $500 до $3,000 щомісяця залежно від масштабу.

Моніторинг

Метрики CA в Prometheus: cluster_autoscaler_nodes_count, cluster_autoscaler_unschedulable_pods_count, cluster_autoscaler_last_activity. Алерт на cluster_autoscaler_errors_total > 0 — сигнал, що CA не може скейлити через помилки API хмарного провайдера. Налаштуйте дашборд в Grafana для візуалізації трендів.

Джерело: офіційна документація Cluster Autoscaler на GitHub

Наші компетенції:

Останні роботи

  • Розробка сайту компанії B2B ADVANCE
    Розробка сайту компанії B2B ADVANCE
    1542
  • Розробка веб-додатків для компанії FEEDME
    Розробка веб-додатків для компанії FEEDME
    1394
  • Розробка веб-сайту для компанії БЕЛФІНГРУП
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    1081
  • Розробка інтернет магазину для компанії FURNORO
    Розробка інтернет магазину для компанії FURNORO
    1369
  • Розробка логотипу компанії B2B Advance
    Розробка логотипу компанії B2B Advance
    816
  • Розробка веб-додатків для компанії Enviok
    Розробка веб-додатків для компанії Enviok
    1142