Когда берёшься перевезти сервисы с виртуалок на 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 инфраструктура делает с их дежурными неделями. Такое не придумаешь.

А какую миграцию сильнее всего саботировала ваша команда — и удалось ли их переубедить?