Налаштування оркестрації контейнерів через Nomad (HashiCorp)

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

Оркестрація контейнерів Nomad: де ламається ручне розгортання

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

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

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

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

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

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

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

Що змінюється після переходу: швидкість викочування та клас відмов

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

Планувальник HashiCorp Nomad піднімає нові екземпляри поряд зі старими, переводить на них трафік і лише потім гасить попередні; у разі невдалої перевірки повертає минулу версію однією командою.

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

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

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

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

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

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

Частка простоїв з вини інфраструктури скорочується в рази — не тому, що збоїв стало менше, а тому що вони перестали бути непоміченими й розтягнутими в часі.

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

Замість оцінки «приблизно тиждень на реліз» з'являються метрики, за якими видно вузьке місце — складання, перевірку готовності або нестачу ресурсів під навантаженням.

Варіанти впровадження: один вузол, кластер, гібридна схема

Оркестрація контейнерів Nomad ставиться і на одну машину, і на кілька — різниця не в можливостях, а в тому, що станеться в разі відмови вузла.

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

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

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

Варіант Коли підходить Обмеження
Один вузол Внутрішній сервіс, пробний запуск, передбачуване навантаження Падіння вузла зупиняє все, оновлення йдуть із простоєм, запасу за навантаженням немає
Кластер, три вузли й більше Продуктивні навантаження, де потрібна безперервність Потрібен кворум, надійна мережа між вузлами та зовнішнє сховище стану
Гібридна схема Частину сервісів поки не можна перенести Різний рівень спостережуваності, різні політики доступу, складніший відкат

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

Порядок робіт: аудит, схема, налаштування, перевірка, передача

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

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

  1. Аудит інфраструктури та інвентаризація сервісів. Збираємо повний перелік процесів, їхні залежності, вимоги до доступності, профілі навантаження та чутливість до затримок. На виході — карта сервісів, за якою видно, що взагалі можна запускати в оркестраторі, а що потребує окремого режиму.
  2. Схема розміщення сервісів. Визначаємо, які завдання йдуть на спільний пул вузлів, а які виносимо окремо — stateful-сервіси, завдання з локальним диском, вузли для важких фонових обробок. Фіксуємо обмеження за ресурсами, правила розподілу та заборони на спільне розміщення конфліктних сервісів.
  3. Проєктування кластера. Рахуємо кількість вузлів під пікове навантаження та запас на відмову одного-двох, визначаємо склад керівного шару та сховище стану. Окремо опрацьовуємо мережеві зони та доступи між сегментами.
  4. Перенесення навантаження. Перевозимо сервіси по одному, починаючи з некритичних: описуємо завдання в конфігурації Nomad, задаємо перевірки працездатності, політики перезапуску та ліміти ресурсів. Кожне перенесення супроводжується порівнянням метрик до і після.
  5. Перевірка на відмову. Планово гасимо вузли, зупиняємо провідний керівний вузол, імітуємо втрату зв'язку між зонами. Дивимося, за який час завдання переїжджають і чи залишається сервіс доступним для користувача.
  6. Перевірка оновлень і відкату. Прогоняємо поетапне оновлення версій, перевіряємо зупинку викочування в разі зростання помилок і повернення на попередній реліз.
  7. Передача кластера команді. Віддаємо схеми, регламенти чергування, порядок додавання сервісів і типові сценарії відновлення, проводимо розбір з інженерами замовника.

Наприкінці робіт у команди залишається не «налаштований кластер», а відтворювана схема розміщення та зрозумілі процедури експлуатації.

Політики доступу до контейнерів, схеми та регламенти

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

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

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

Кейс: три середовища та єдиний контроль викочування

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

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

До: ручні запуски в трьох середовищах

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

Той самий реліз у трьох середовищах збирали по-різному, тому «працює на тесті» нічого не гарантувало.

Після: єдиний контроль викочування

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

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

Час викочування скоротився до 5–8 хвилин, невдалих випусків — менше 2%, відновлення — до 2–3 хвилин автоматикою.

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

Що робити, якщо сервіси вже запущені вручну

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

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

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

Далі кластер Nomad розгортається поряд із поточним контуром і підключається до того самого балансувальника.

Ручний запуск і оркестратор працюють одночасно: перемикання йде по одному сервісу через зміну маршруту, перший отримує 5–10% трафіку, а в разі відхилення метрик правило повертається назад — відкат займає хвилини, а не години.

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

Часті технічні сумніви перед стартом

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

Розбираємо це на проєктуванні — правка в архітектуру тут дешевша, ніж переробка кластера в продакшені.

Що буде в разі повної відмови вузла?

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

Де зберігаються секрети?

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

Чи доведеться переписувати застосунки?

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

Що залишиться в нас після передачі?

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

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

Обговоримо задачу та повернемося з планом переходу

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

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

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

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

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

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

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

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

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