Налаштування Kubernetes Autoscaling (KEDA — Event-Driven Autoscaling)

Сплеск замовлень обвалює чергу, а потужності простоюють у затишші. Ми налаштовуємо автомасштабування на KEDA під ключ: навантаження зростає — ресурси підключаються самі, спад — вивільняються. Обробка піків прискорюється в рази, а команда не зростає.
Часті запитання

KEDA: чому черги зростають, а вузли простоюють

Потік подій перевищує швидкість обробки — і черга завдань зростає швидше, ніж воркери встигають її розбирати.

Штатне автомасштабування в цей момент дивиться на споживання процесора й пам’яті, а обробник, який чекає відповіді від зовнішньої системи або бази, майже не навантажує ядро. З погляду метрик усе гаразд, вузли завантажені на третину, а завдання продовжують накопичуватися.

Метрики споживання до того ж усереднюються за вікном і доходять до контролера із затримкою. Поки значення оновиться, спрацює правило й підніметься новий екземпляр, минає кілька хвилин — за цей час черга зростає в рази, а частина завдань іде на повторну обробку. Затримку реакції на пік у такому сценарії вимірюють десятками хвилин.

Єдиним важелем залишається ручне додавання вузлів: черговий бачить зростання черги на дашборді й масштабує вручну. Поки нові вузли готові приймати навантаження, пік уже минув — і потужності простоюють до наступного сплеску. Тому між піками інфраструктура працює вхолосту, а в момент сплеску все одно не встигає.

Подієве автомасштабування усуває цей розрив: метрикою стає не споживання ресурсів, а довжина черги завдань і частота надходження подій. KEDA опитує джерело подій безпосередньо й тримає рівно стільки обробників, скільки потрібно для розбору черги, — аж до нуля в простої. Нижче розбираємо, як це закривається і що потрібно передбачити заздалегідь.

Що дає масштабування за подіями

Сигнал для масштабування зазвичай беруть із завантаження процесора й пам’яті — це усереднені величини із затримкою в хвилини. Черга за цей час встигає зрости, а поди вже гасяться на спаді.

KEDA змінює джерело рішення: замість утилізації він читає довжину черги, лаг споживача й частоту надходження подій, тому вміє масштабувати навантаження до нуля реплік і повертати його назад.

Чотири ефекти, які видно в метриках:

  • Час реакції на навантаження. Екземпляри обробників піднімаються під фактичний потік подій, а не під прогноз за середнім завантаженням, — сплеск розбирається помітно раніше.
  • Утилізація кластера. У простої робочі навантаження йдуть у нуль реплік, і звільнені ресурси дістаються іншим задачам: частка простоюючих потужностей падає без ручних розкладів.
  • Знятий клас відмов. Накопичувач зростає — зростає число обробників, тому завдання перестають губитися через переповнення черги або обрив за таймаутом.
  • Передбачуване споживання ресурсів. Профіль масштабування описаний правилами й порогами, а отже потрапляє в планування ємності та у звітність за навантаженням.

Окремо варто зафіксувати межі: мінімальне й максимальне число реплік, крок масштабування, вікно охолодження після спаду. Без них автомасштабування перетворюється на гойдалки, які ламають і стабільність, і передбачуваність споживання.

Режими автомасштабування: KEDA і штатні механізми

У кластері зазвичай співіснують кілька механізмів масштабування, і вибирають їх за джерелом сигналу: черга, споживання ресурсів, календар або нестача місця під поди.

KEDA закриває масштабування за зовнішніми подіями, штатний механізм — за метриками ресурсів, розклад і рівень вузлів вирішують окремі задачі.

Практичне питання — що першим помічає зростання навантаження. Якщо це довжина черги або лаг споживача, метрики ресурсів спрацюють пізніше: під уже перевантажений, а масштаб ще не зріс. Нижче — за яких умов кожен варіант виправданий і де в нього межа.

Варіант Коли підходить Обмеження
Зовнішні події (KEDA) Черги, потоки, лаг споживача, лічильники в БД Потрібен робочий тригер і метрика в джерелі; за його недоступності — запасний сценарій
Метрики ресурсів (штатний механізм) Рівномірне навантаження на процесор і пам’ять, вебсервіси Реакція за фактом споживання: на сплеску поди додаються із затримкою
Розклад Передбачувані піки: звіти, нічні задачі, робочі години Не реагує на позапланове зростання, потребує ручної правки за зміни графіка
Рівень вузлів Не вистачає місця під нові поди, різнорідні задачі Повільніше за поди: вузол готується хвилинами; потрібні ліміти ресурсів і коректний відбір вузлів

Шари доповнюють один одного: подієвий тригер швидко піднімає число подів, ресурсний утримує базовий рівень, рівень вузлів добирає ємність. Далі — як зібрати це без конфліктів між механізмами.

Етапи впровадження: від аудиту навантаження до передачі

Порядок робіт однаковий і для одного сервісу, і для десятка: спочатку вимірюємо, потім проєктуємо, і тільки згодом вмикаємо автомасштабування в проді. Сліпе копіювання чужих порогів дає або простоюючі репліки, або лавину подій на першому ж піку.

  1. Зняття профілю навантаження. Збираємо метрики за чергами, часом обробки задачі та добовою динамікою запитів за репрезентативний період. На виході — таблиця піків і провалів, за якою видно, де ручне масштабування вже не встигає.

  2. Проєктування правил і пріоритетів. Визначаємо, які сигнали керують числом реплік, а які лише інформують чергового. За кількох джерел задаємо пріоритет: правило на довжину черги перекриває правило за утилізацією.

  3. Розрахунок порогів масштабування. Рахуємо, за якого значення метрики додаємо репліку і за якого прибираємо, із запасом на час запуску застосунку. Пороги розводимо, щоб число реплік не коливалося на межі.

  4. Налаштування KEDA і джерел подій. Підключаємо тригери до черг і брокера, задаємо межі мінімум–максимум, вікно стабілізації та поведінку за недоступності джерела. Окремо описуємо холодний старт, коли подій немає взагалі.

  5. Перевірка під навантаженням. Проганяємо профіль на стенді, що повторює прод, і дивимося фактичну реакцію: скільки реплік піднялося, за який час, чи був відкат. Підсумок — звіт із графіками до і після.

  6. Передача в експлуатацію. Віддаємо конфігурації, схеми правил та інструкцію черговій зміні: як перевести сервіс на ручне керування, куди дивитися при завислій черзі, які оповіщення критичні. Зміни порогів оборотні, тому відкат до попередніх значень займає хвилини.

Що залишається в команди: конфігурації KEDA і регламенти

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

Ми передаємо команді не «працюючий автоскейлінг», а те, чим можна керувати самостійно: без читання чужої голови і без запиту до нас за кожної зміни порога.

  • Конфігурації тригерів. Маніфести з описом джерела подій, порога спрацювання, інтервалу опитування й періоду затухання — а також поведінка за недоступності метрики та правила масштабування до нуля.
  • Схема потоків подій. Звідки надходить сигнал навантаження, через якого посередника, що відбувається з накопиченими повідомленнями під час переходу в нуль реплік і за зворотного розвороту.
  • Політики доступу й ролі. Сервісні облікові записи для читання метрик, межі прав контролера за просторами імен, обмеження на ручне втручання в масштаб.
  • Інструкція з експлуатації. Як подивитися поточний масштаб і причину рішення, як тимчасово зафіксувати число реплік, як відкотити конфігурацію до попередньої.
  • Регламент чергової зміни. Які алерти критичні, що робити при «залипшому» масштабуванні, де межа між очікуванням і ескалацією.
  • Перевірки в конвеєрі складання. Валідація маніфестів, контроль меж мінімуму й максимуму реплік, навантажувальний тест на поведінку під піком.

Кожен артефакт лежить у репозиторії поруч із кодом, проходить рев'ю і відкочується як звичайна зміна. Пороги й правила змінюються в міру зростання навантаження — без нас і без зупинки сервісу.

Кейс: обробка замовлень під піковим навантаженням

Магазин із сезонними розпродажами: обробник замовлень працював на фіксованому числі екземплярів, розрахованому на середній потік.

У пікові години черга замовлень зростала швидше, ніж розбиралася, час очікування обробки сягав десятків хвилин, а черговий вручну піднімав потужності — і все одно не завжди встигав. Уночі ті самі потужності простоювали майже повністю.

Метрика До Після
Довжина черги на піку сотні нерозібраних замовлень тримається в межах десятків
Час очікування обробки десятки хвилин менше хвилини
Ручні втручання чергового за добу 4–6 підйомів потужності нуль
Простоюючі потужності поза піками близько двох третин виділеного менше однієї п'ятої

Що зробили

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

Додали шкалу від нуля для нічних вікон, вікна стабілізації — щоб короткий сплеск не викликав ривків, і верхню межу екземплярів як захист від неконтрольованого зростання при збої джерела подій.

Сценарії масштабування описали декларативно і поклали поруч із конфігурацією сервісу, тому зміна порогів не потребує правок коду і проходить звичайний цикл перевірки.

Черговий перестав бути частиною контуру масштабування: втручання залишилося тільки на аварійні ситуації, а потужності тепер виділяються під фактичний потік замовлень.

Чим KEDA відрізняється від штатного автомасштабування

Штатний автомасштабувальник спирається на завантаження процесора й пам’яті — це непрямий сигнал. Метрики надходять із затримкою, коли навантаження вже навалилося, а обробники черг часто й узагалі не навантажують процесор: вони чекають відповіді зовнішньої системи. У підсумку репліки додаються пізно, а частина піднятих простоює.

KEDA змінює джерело сигналу. Він підписується на зовнішню чергу, брокер повідомлень або потік подій і читає її безпосередньо: скільки повідомлень чекає, наскільки відстали споживачі завдань.

Масштабування стартує за фактом появи роботи, а не за нагрівом заліза, тому сплеск розбирають ті самі екземпляри, що вже підняті.

Друга відмінність — зниження до нуля. Штатний автомасштабувальник не опускається нижче одного екземпляра, KEDA вміє уводити в нуль і піднімати з нуля за першим повідомленням.

Для нічних вікон, рідкісних регламентних задач і тестових контурів це знімає постійний фон невикористаних ресурсів.

Третя — місце в загальній схемі. KEDA не замінює штатне рішення, а доповнює його: він лише постачає метрику, а число реплік, як і раніше, визначає штатний автомасштабувальник. Тригерів задається кілька — черга, розклад, навантаження — і береться той, що потребує більше реплік.

На практиці це знімає ручне чергування на піках: репліки з'являються під фактичний обсяг завдань, а не під найгірший сценарій. Окремо перевіряємо поведінку за недоступного джерела метрик — без цього автомасштабування саме стає точкою відмови.

Технічні сумніви: обмеження й сумісність

Сумніви щодо автомасштабування з'являються, коли налаштування переходить у робочий контур: що вже є в кластері й як поводитиметься система, якщо джерело метрик замовкне. Ось чотири питання, які ставлять інженери, і те, як ми їх закриваємо.

Чи стане KEDA на поточний кластер без перебудови?

Ставиться як звичайний компонент у власному просторі імен і спирається на штатний автомасштабувальник кластера — той самий, що вже розводить застосунки за навантаженням. Додатково описуються власні типи ресурсів, що пов'язують об'єкт із джерелом метрик.

Потрібні лише права на читання метрик і правку цільових об'єктів: оновлення кластера й заміна наявного автомасштабування не потрібні, перемикання йде по одному застосунку.

Що робити, якщо метрика надходить неповно або із затримкою?

Джерело може віддавати не всі значення: частина черг без лічильника, затримка опитування, вікно агрегації. На цей випадок задаємо правило — не гасити копії за порожнім значенням, утримувати поточне число і підстраховуватися порогом за процесором і розкладом для відомих піків. Автомасштабування залишається робочим за часткової відмови метрик, а не залипає на мінімумі.

Як відкотитися, якщо поведінка не влаштує?

Конфігурація живе в репозиторії і застосовується звичайним розгортанням. Достатньо зняти прив'язку до джерела метрик у конкретного застосунку — і об'єкт повертається під штатне масштабування за навантаженням, а правила за числом копій і вікна стабілізації залишаються. Поди при цьому не перестворюються, відкат одного застосунку не зачіпає інші.

Чи не зросте навантаження на систему метрик?

Кожен масштабований об'єкт опитує джерело зі своїм інтервалом, і за замовчуванням він вищий за реальну швидкість реакції. Ми зводимо частоту до потрібної, вмикаємо кеш значень і вікно стабілізації, щоб рішення не смикалися на коротких сплесках. Навантаження на систему метрик зростає передбачувано, а не пропорційно числу застосунків.

Обговоримо задачу: що потрібно для оцінки й плану

Щоб повернутися з оцінкою обсягу робіт і планом упровадження, нам потрібні вихідні дані про кластер, навантаження й поточні процеси. Чим конкретніші ввідні, тим менше припущень у строках: майже всі правки після старту спричинені деталями, яких не вистачило на етапі оцінки.

Що запитуємо на старті:

  • Архітектура кластера: де розміщений, скільки робочих вузлів, хто керує керівним шаром.
  • Тригери: які метрики мають запускати масштабування — довжина черги, відставання споживача, число завдань в очікуванні.
  • Що масштабуємо: перелік сервісів і черг, межі реплік і вимоги до часу реакції.
  • Розгортання: як сервіси потрапляють у кластер, які середовища є і чим вони відрізняються.
  • Обмеження: квоти провайдера, стеля вузлів, вікна обслуговування, вимоги до доступності.
  • Спостережуваність: що вже збирається за метриками й логами, на які пороги орієнтуються чергові.
  • Доступи й ролі: як організуємо доступ до кластера й репозиторіїв, хто на вашому боці приймає результат.
  • Критерії готовності: що вважаємо успіхом — реакцію на сплеск, поведінку за відмови споживача, повернення до попередніх налаштувань.

Порядок взаємодії простий: розбір задачі з вашими інженерами, доступи до стенда, пілот подієвого автомасштабування на одному сервісі з вимірами до і після, потім поетапне вмикання на інші черги. Опишіть задачу — повернемося з оцінкою й планом.

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

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

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