Короткий ответ
Однозначно правильного решения о переходе нет — миграцию стоит проводить постепенно, начиная с нескольких некритичных сервисов, сохраняя push-based путь как fallback до полного доверия к новой модели, и переход может быть не оправдан для небольшой организации с малым числом кластеров и сервисов, где операционная сложность внедрения и поддержки GitOps-контроллера превышает выгоды от улучшенной безопасности и аудита, которые он даёт.
Как это работает подробнее
при push-based модели CI-система имеет прямой доступ (учётные данные) к продакшен-кластерам для выполнения деплоя, что требует защиты этих учётных данных на стороне CI и создаёт более широкую поверхность атаки (компрометация CI-раннера = потенциальный доступ к проду). Pull-based GitOps убирает эту необходимость — контроллер внутри кластера сам забирает изменения из Git, и кластеру не нужно доверять внешней CI-системе напрямую; взамен добавляется новый компонент (сам GitOps-контроллер) с собственными требованиями к эксплуатации, обновлению и мониторингу.
Пример кода
Текущее состояние: 15 микросервисов, push-based деплой через GitLab CI
с CI-переменной KUBE_CONFIG, дающей прямой доступ к prod-кластеру.
План миграции (черновик для обсуждения):
Фаза 1 (1 месяц): развернуть ArgoCD, перевести 2 некритичных сервиса,
оставить push-путь для остальных как есть.
Фаза 2 (2 месяца): перевести ещё 8 сервисов, обучить команды PR-based
процессу изменений, собрать обратную связь.
Фаза 3: перевести оставшиеся критичные сервисы, отозвать прямой
KUBE_CONFIG доступ у CI-раннеров.Сравнение
- Компромисс. GitOps даёт более строгий аудит, декларативность и меньшую поверхность атаки, но добавляет операционную сложность (ещё один компонент для эксплуатации), требует культурных изменений в команде и не бесплатен с точки зрения времени на внедрение; для организации с 2-3 кластерами и несколькими сервисами выгода может не оправдать затраты, тогда как для организации с десятками кластеров и командами выгоды по безопасности и консистентности обычно перевешивают. Решение должно явно учитывать текущую зрелость процессов, размер платформенной команды и реальные инциденты безопасности, которые организация пытается предотвратить.
Что использовать на практике
- На практике. миграция обычно проходит поэтапно: сначала разворачивают GitOps-контроллер параллельно с существующим push-пайплайном для некритичных сервисов, сравнивают поведение, обучают команды новому процессу (change теперь происходит через PR в манифесты, а не через запуск джобы деплоя), и только после накопления уверенности переводят критичные сервисы, в конце выводя из эксплуатации push-доступы CI к кластерам. Нужно заранее продумать, как обрабатывать экстренные/ручные ситуации (см. вопрос про дрифт) в новой модели, чтобы не создавать соблазн обходить GitOps при любом давлении времени.
- Пример. Задача для обсуждения: кандидату — определить критерии готовности для перехода от Фазы 1 к Фазе 2 (что именно нужно увидеть/измерить, чтобы быть уверенным), и привести аргумент, при каком размере организации этот трёхфазный план был бы избыточен.
Подводные камни
- Частые ошибки. переводят все сервисы сразу без параллельного периода, из-за чего любая проблема с новым GitOps-контроллером становится общекомандным инцидентом; недооценивают культурные изменения — команды, привыкшие «просто запустить деплой», должны научиться новому процессу через Git, что требует времени и объяснения выгод, а не только внедрения инструмента.