Коли берешся перевезти сервіси з віртуалок на 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 інфраструктура робить з їхніми чергуваннями. Таке не вигадаєш.
А яку міграцію найдужче саботувала ваша команда — і чи вдалося їх переконати?