Налаштування Docker Swarm: оркестрація контейнерів без Kubernetes

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

Docker Swarm: що ламається при ручному керуванні контейнерами

Коли сервіси піднімають вручну, кожен запуск — це docker run по SSH або docker compose up на конкретній машині.

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

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

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

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

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

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

Далі розбираємо, як це закривається на практиці: що налаштовується до першого docker stack deploy, де вузькі місця і як проходить оновлення без вікна недоступності.

Що дає оркестрація контейнерів: ефект в експлуатації

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

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

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

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

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

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

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

Вибір між одним сервером і кластером — це вибір класу відмов, а не розміру навантаження. У Docker Swarm один вузол означає, що зупинка машини кладе всі сервіси до ручного втручання, а оновлення ядра чи перезапуск демона перетворюється на вікно недоступності.

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

Варіант Коли підходить Обмеження
Один сервер Навантаження вкладається в один вузол, короткі простої допустимі, важливий швидкий запуск Точка відмови: падіння машини зупиняє все; немає кворуму керуючих вузлів і реплік між серверами; обслуговування = простій
Свій кластер на своїх серверах Потрібен контроль над ядром, дисковими томами і мережею, є вимоги до розміщення даних Відмовостійкість керуючих вузлів, оновлення хостів, резервне копіювання стану кластера і чергування — на вашому боці
Керований кластер Своєї команди експлуатації немає, навантаження змінюється, важлива швидкість виходу в продакшн Обмежений доступ до вузлів і демона, не всі привілейовані режими і хостові томи доступні, прив'язка до API провайдера

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

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

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

Порядок впровадження: від аудиту до передачі в експлуатацію

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

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

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

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

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

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

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

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

Що показували заміри до переходу

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

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

Що змінили

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

Сервіси отримали health-check і правило перезапуску: завдання, що впало, переплановується на живий вузол без участі людини. Оновлення випускаємо через rolling update — по кілька реплік за раз, з очікуванням готовності і автовідкатом на попередній образ, якщо перевірки не пройшли. Реєстр образів чистимо за правилом зберігання останніх збірок.

Після переходу простій при відмові вузла скоротився до 20-40 секунд — трафік перехоплюють репліки на живих вузлах.

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

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

Чим Docker Swarm відрізняється від Kubernetes і коли він доречний

Різниця не в тому, який оркестратор «потужніший», а в ціні супроводу.

Docker Swarm — частина движка контейнеризації: кластер збирається з кількох вузлів однією командою, сервіси описуються декларативно (образ, кількість реплік, правила розміщення), а стан керуючих вузлів реплікується між ними.

Kubernetes — окрема платформа з розширюваною моделлю API, власним планувальником і великим набором розширень; її потрібно ставити, оновлювати і обслуговувати як самостійну систему.

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

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

Критерій Docker Swarm Kubernetes
Поріг входу Кластер з кількох команд, декларація сервісів Набір маніфестів, ролі доступу, окремі компоненти
Супровід Керуючі вузли реплікують стан самі Оновлення компонентів і версій API за регламентом
Масштаб Десятки вузлів, однорідне навантаження Сотні вузлів, кілька незалежних команд
Розширюваність Драйвери мереж і сховищ Оператори, власні типи ресурсів

Звідси критерій вибору. При 3-10 вузлах, однорідних сервісах без локального стану і відсутності окремої команди на платформу Swarm дає оркестрацію вбудованими засобами. Якщо сервіс один, оркестратор не потрібен узагалі — достатньо файлу Compose і системного юніта автозапуску.

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

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

Технічні сумніви: відмовостійкість, оновлення, відкат

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

Що станеться, якщо вузол вийде з ладу?

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

Як оновлення проходить без простою?

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

Як відкотити невдалий реліз?

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

Що входить у підтримку кластера після запуску?

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

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

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

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

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

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

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

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

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