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

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

«Працює» — це не стратегія надійності

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

Нічого з цього не видно на дашборді аптайму. У цьому і пастка. Віртуалки-сніжинки — це single points of failure, сховані за гарною статистикою, і чути це ніхто не хоче. Особливо від новачка. Справжній спротив був не технічним. Він був про зміни й про небажання визнати, що нинішня схема — крихка.

Крок перший — не Kubernetes. Крок перший — контейнери.

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

Тому крок перший — це контейнеризація, і до Kubernetes вона поки що стосунку не має:

  • Multi-stage Dockerfile — щоб середовище збірки не протікало в рантайм-образ.
  • Мінімальні базові образи — менша поверхня атаки, швидший pull, менше сюрпризів.
  • Кожен образ версіонується і лежить у Google Artifact Registry, тож будь-який деплой відстежується до конкретного артефакту.
  • Паритет середовищ між dev, staging і prod. У цьому й був весь сенс: контейнер — це контракт, який каже, що застосунок скрізь поводиться однаково.

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

Архітектура GKE: не «задеплой і молись»

GKE зʼявився лише тоді, коли фундамент був уже міцним. І живий кластер зовсім не схожий на навчальний:

  • Node pools, розділені за типом навантаження — compute-heavy сервіси окремо від I/O-bound, щоб вони не билися за ті самі ресурси.
  • Horizontal pod autoscaling за реальними метриками застосунку, а не лише за CPU. CPU — лінивий проксі; про потребу масштабуватися кажуть глибина черги й latency запитів.
  • Network policies для ізоляції сервіс-до-сервісу, щоб скомпрометований под не міг спілкуватися з усім підряд.
  • Притомні requests і limits, щоб один галасливий сервіс не морив голодом решту.

Що реально змінилося

  • Час деплою — з годин до хвилин.
  • Вартість інфраструктури привели до норми через autoscaling, а не оплату пікового навантаження 24/7.
  • Нуль серверів-сніжинок. Будь-який сервіс відтворюється з Dockerfile і Helm-чарта.
  • Вмирає нода — Kubernetes переносить поди. Паніки о 3-й ночі й ритуалів «збери по памʼяті» більше немає.

Kubernetes ніколи не був метою

Ось до чого я весь час повертаюся. Kubernetes — це не «модна технологія», яку впроваджують, щоб звучати сучасно. І контейнери — теж не про моду. Контейнер — це контракт: застосунок поводиться однаково в мене на ноутбуці, у staging і в проді. GKE просто тримає цей контракт чесним на масштабі й переносить навантаження, коли залізо відмовляє. Метою був не Kubernetes. Метою було надійно ганяти софт — без геройства.

Найприємніше? Команда, яка впиралася найдужче, тепер сама проводить тренінги з kubectl для новачків. Люди, які найміцніше трималися за «не чіпай», стали найгучнішими адвокатами, щойно відчули, що self-healing інфраструктура робить з їхніми чергуваннями. Таке не вигадаєш.

А яку міграцію найдужче саботувала ваша команда — і чи вдалося їх переконати?