Налаштування GitOps для базової інфраструктури (Bootstrap)

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

GitOps bootstrap: де ламається базова інфраструктура

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

Так ручне налаштування середовищ стає єдиним джерелом правди, і живе воно в голові одного-двох інженерів.

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

Або навпаки: правка закріплюється, стенд розходиться з продуктивом, і перевірки перестають щось доводити.

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

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

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

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

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

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

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

Тільки після цього контролер синхронізує середовище — і той самий опис відкочується реверсом правки, а не збиранням «як було» з пам'яті. Ми збираємо таку схему на Argo CD, тому що вона однаково працює і для першого розгортання, і для подальших правок.

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

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

Варіанти GitOps bootstrap: від ручного збирання до автоматизації

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

Різниця проявляється не на старті, а на другій-третій ітерації, коли середовище потрібно підняти заново або привести до еталонного вигляду.

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

Як переходять між режимами

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

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

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

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

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

Артефакти: репозиторії, політики доступу, регламенти

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

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

  • Опис середовищ — які контури є (розробка, передпродуктив, продуктив), чим вони відрізняються за складом сервісів, що виноситься в змінні, а що задається накладенням на спільну базу.
  • Політики доступу — ролі й права всередині кластера, окремі облікові записи для автоматики, прив'язка «хто і в яку гілку вливає зміни», явна заборона правок в обхід репозиторію.
  • Регламент випуску змін — шлях правки від гілки до застосування: обов'язкові перевірки, узгодження, порядок просування між контурами, точка неповернення.
  • Процедура відкату — як повернути попередній стан, за який час, які зміни відкочуються тільки вручну і чому.
  • Управління секретами — де зберігаються, хто і як отримує доступ, як проходить ротація і що робити при витоку.
  • Документація з інфраструктури — схема контурів, карта залежностей між сервісами, перелік зовнішніх точок входу й порядок підключення нового компонента.
  • Матриця відповідальності — хто погоджує зміни, хто чергує, кому ескалюється розходження фактичного стану з описаним.

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

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

Ситуація до

Замовник — продуктовий відділ з трьома середовищами: розробка, передпрод, продакшн. Базовий контур — кластер, мережа, права доступу, секрети — піднімали вручну за чек-лістом з вікі.

Нове середовище збиралося три-чотири дні, а розходження між продакшном і передпродом спливали вже під час інциденту.

Що змінили

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

Будь-яка зміна проходить перевірку плану в pull request, а розходження з реальним станом контур усуває сам.

Що стало

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

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

Чим декларативне постачання відрізняється від класичного конвеєра?

Класичний конвеєр відповідає на питання «що зробити»: зібрати артефакт, прогнати перевірки, розкласти по серверах і виконати команди в потрібному порядку.

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

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

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

Критерій Класичний конвеєр Декларативне постачання
Джерело істини порядок кроків і скрипти опис стану в репозиторії
Повторний запуск залежить від поточного стану ідемпотентний
Розходження шукають вручну виявляються звіркою
Відкат повтор окремих кроків повернення попередньої ревізії

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

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

Технічні сумніви: доступи, відкати, ручні правки

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

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

Що робити із середовищами, які налаштовували руками?

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

Як відкочується невдала зміна?

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

Хто відповідає за термінові правки?

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

Що буде, якщо репозиторій або агент недоступні?

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

З чого почнемо: схема, доступи й порядок робіт

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

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

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

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

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

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

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

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