
Статья подготовлена вместе с экспертом
Станислав Погоржельский, технологический евангелист VK Cloud&Data

Argo CD в Kubernetes переводит управление релизами из ручных команд и разрозненных CI-скриптов в GitOps-процесс: Git хранит желаемое состояние, а контроллер регулярно приводит к нему кластер. Для DevOps- и SRE-команд это меньше дрейфа конфигураций, прозрачная история изменений, воспроизводимые релизы и единый способ развёртывать приложения в тестовых, stage- и production-средах. GitOps-автоматизация не заменяет инженерную дисциплину, но даёт ей технический контур — ревью pull request, декларативные манифесты, автоматическую сверку и контролируемое применение изменений.
В Managed Kubernetes такой подход особенно удобен: команда концентрируется на приложениях, окружениях, политиках доступа и наблюдаемости, а не на обслуживании базового control plane. Если в вашем проекте Argo CD доступен как аддон VK Cloud Managed Kubernetes, его можно рассматривать как быстрый старт для GitOps-практики без ручной установки всех компонентов. Детали конкретной версии, стоимости, SLA и внутренней реализации аддона в этой статье не утверждаются — их нужно сверять с актуальной документацией и условиями сервиса перед внедрением.
Ниже разберём, чем GitOps отличается от классического CI/CD, как устроен Argo CD, какие задачи он закрывает на практике, как подключить аддон в Managed Kubernetes VK Cloud, как описать первый Application и какие ограничения учесть перед production-запуском.

Станислав Погоржельский, технологический евангелист VK Cloud&Data
GitOps — операционная модель, в которой желаемое состояние системы описывается декларативно и хранится в Git. OpenGitOps формулирует четыре базовых принципа: система должна быть декларативной, состояние — версионированным и неизменяемым, агенты должны автоматически получать объявления желаемого состояния из источника, а фактическое состояние должно непрерывно сверяться с желаемым.
Классический CI/CD часто строится как цепочка «собрать образ → прогнать тесты → выполнить deploy-команду». Такой pipeline полезен и остаётся необходимым: CI компилирует код, запускает тесты, собирает контейнер, публикует артефакт и проверяет качество. Но если последняя стадия CI напрямую меняет кластер, появляется несколько рисков:
GitOps меняет границу ответственности. CI по-прежнему собирает и проверяет артефакты, но не обязан напрямую деплоить в кластер. После успешной сборки он может обновить manifest repository: например, изменить тег образа в Helm values, Kustomize overlay или plain YAML. Далее Argo CD замечает изменение в Git, сравнивает желаемое состояние с live-состоянием кластера и выполняет sync.


Главное отличие не в том, что CI/CD больше не нужен, а в том, где выполняется изменение production-среды. В GitOps изменение проходит через Git: pull request, ревью, политики ветвления, подпись коммитов, аудит. Кластер не ждёт внешнюю deploy-команду из CI, а сам подтягивает описание состояния через доверенный контроллер. Если нужно понять, почему в production появилась новая версия, достаточно посмотреть историю манифестов, синхронизаций и событий Application.
Argo CD — декларативный GitOps CD-инструмент для Kubernetes. В базовом контуре участвуют три ключевых компонента: API Server, Repository Server и Application Controller. В установках также встречаются UI, CLI, Redis, Dex или другой провайдер аутентификации, но для понимания релиза достаточно этих трёх ролей.

API Server предоставляет gRPC/REST API для Web UI, CLI и внешних систем. Он управляет приложениями и статусами, запускает операции sync и rollback, работает с credential-данными репозиториев и кластеров, отвечает за аутентификацию, делегирование auth во внешние identity provider, RBAC и обработку Git webhook-событий.
Repository Server работает с исходными репозиториями: хранит локальный кэш Git-репозитория с манифестами и генерирует Kubernetes manifests по входным данным — URL репозитория, revision, path, параметрам Helm values или другим настройкам шаблонизации. Если команда использует Helm chart, Kustomize overlay или Jsonnet, именно этот слой превращает исходники конфигурации в итоговые объекты Kubernetes.
Application Controller — Kubernetes-контроллер, который непрерывно наблюдает за приложениями, сравнивает live-состояние с target-состоянием из репозитория, определяет OutOfSync и может выполнять корректирующие действия. С точки зрения эксплуатации это сердце GitOps: он обнаруживает drift, показывает health ресурсов, применяет sync-политики, запускает lifecycle hooks и удерживает кластер ближе к описанному в Git состоянию.
Application — основная сущность Argo CD. В ней указываются минимум два блока: source — ссылка на желаемое состояние в Git, и destination — целевой кластер и namespace. Вокруг Application строятся права, sync-политики, история операций, health и сравнение версий. Для нескольких похожих окружений поверх Application можно использовать ApplicationSet: controller генерирует Applications из шаблона и данных генератора, что удобно для мультикластерных и мультиокружённых сценариев.
Когда команда включает automated sync, Argo CD применяет изменения без ручного нажатия Sync в UI. Pull request обновляет манифесты, Argo CD фиксирует OutOfSync, получает желаемое состояние и приводит кластер к нему. Такой режим хорошо подходит для dev и stage, а в production его часто ограничивают дополнительными правилами: обязательным ревью, sync windows, ручным approve или progressive delivery через отдельные инструменты.
Фрагмент Application с включённым автоматическим sync:
spec: syncPolicy: syncPolicy: automated: enabled: true
Если ресурсы удаляются из Git, Argo CD по умолчанию не удаляет их из кластера автоматически. Для этого есть prune, который стоит включать осознанно и после проверки, что репозиторий служит полным источником состояния приложения.
spec: syncPolicy: automated: prune: true
В Kubernetes часть изменений может появляться в обход Git: срочная ручная правка, эксперимент в namespace, некорректная команда, сторонний controller. Если такие изменения не возвращать к декларативному описанию, среда постепенно перестаёт быть воспроизводимой. Self-heal включает автоматическую реакцию на расхождение live-состояния и Git-состояния: если кто-то изменил объект в кластере, Argo CD снова применяет target-состояние.
Для SRE это практический механизм синхронизации кластера с Git. Источник правды находится в репозитории, а не в наборе разовых kubectl edit. Self-heal лучше внедрять постепенно: сначала включить сравнение и алерты, затем автоматическое исправление для безопасных сервисов, и только после этого — для критичных workload'ов с понятными исключениями.
spec: syncPolicy: automated: selfHeal: true
В GitOps есть два распространённых способа rollback. Первый — вернуть Git к предыдущему желаемому состоянию: revert commit, pull request, sync. Этот путь согласуется с моделью Git как source of truth: история остаётся понятной, а причина rollback видна в репозитории.
Второй — команда argocd app rollback APPNAME [ID], которая откатывает Application к предыдущей развёрнутой версии или к версии по History ID. Такой откат полезен при инциденте, когда важна скорость восстановления. После оперативного действия нужно привести Git в соответствие с тем, что фактически должно остаться в кластере, иначе следующий sync может снова применить нежелательное состояние.
Штатный rollback через историю конфликтует с включённым automated sync — это ограничение документации Argo CD. Поэтому для production-процедур стоит заранее описать runbook: кто временно отключает auto-sync при аварийном откате, как выбирается History ID, как фиксируется revert в Git и как затем возвращается штатная политика синхронизации.
Argo CD не заменяет Prometheus, Grafana, логирование и трассировку, но даёт отдельный слой наблюдаемости за доставкой. Команда видит sync status, health status, diff, историю операций и события. Метрики Argo CD документированы отдельно и могут стать частью общего SRE-мониторинга релизов.
Практически полезно отслеживать:
Для одного сервиса достаточно отдельного Application. Когда сервисов десятки, а окружений несколько, ручное создание объектов становится источником ошибок. ApplicationSet шаблонизирует Applications и генерирует их из списка, Git-структуры или сведений о кластерах. Это удобно для platform team: единый шаблон задаёт стандартные labels, project, sync policy и путь в репозитории, а команды добавляют новый сервис через небольшое изменение в декларативной конфигурации.
Если в вашем проекте доступен аддон Argo CD для VK Cloud Managed Kubernetes, подключение можно планировать как часть подготовки к GitOps. Ниже — безопасная последовательность шагов без неподтверждённых утверждений о версиях, цене, SLA и конкретных параметрах реализации.
Что стоит проверить до включения в production:
Пример ниже рассчитан на команду, которая уже имеет кластер Managed Kubernetes, установленный Argo CD и репозиторий с манифестами приложения. Пример намеренно короткий: он показывает структуру Application, но не претендует на полный production-манифест.
Один из рабочих вариантов — хранить приложение и окружения отдельно:
apps/ payments-api/ base/ deployment.yaml service.yaml overlays/ dev/ kustomization.yaml stage/ kustomization.yaml prod/ kustomization.yaml
CI после сборки образа может обновлять только нужный overlay: например, менять image tag в apps/payments-api/overlays/stage. В production изменение проходит через pull request и ревью владельцев сервиса.
Минимальный Application содержит project, source и destination
apiVersion: argoproj.io/v1alpha1 kind: Application metadata: name: payments-api-stage namespace: argocd spec: project: default source: repoURL: https://git.example.com/platform/manifests.git targetRevision: main path: apps/payments-api/overlays/stage destination: server: https://kubernetes.default.svc namespace: payments-stage
Здесь repoURL указывает на репозиторий с желаемым состоянием, targetRevision — на ветку, тег или commit, path — на директорию окружения, destination — на целевой кластер и namespace. Для приложений внутри того же кластера часто используется https://kubernetes.default.svc, но в мультикластерных схемах destination может ссылаться на зарегистрированный внешний кластер.
Для stage можно включить automated sync, prune и self-heal:
spec: syncPolicy: automated: enabled: true prune: true selfHeal: true syncOptions: - CreateNamespace=true
CreateNamespace=true удобен в тестовых окружениях, но в production namespaces часто создаются отдельным платформенным процессом: с quotas, network policies, labels, policies и владельцами. Поэтому не переносите параметры из stage в production без review.
Если вы управляете Argo CD декларативно, Application можно хранить в Git и применить стандартным Kubernetes-механизмом:
kubectl apply -n argocd -f payments-api-stage-application.yaml
После этого в Argo CD UI появится Application. Если автоматическая синхронизация выключена, выполните первый sync вручную и проверьте diff, health и события. Если sync включен, убедитесь, что объект перешел в Synced и Healthy, а в namespace появились ожидаемые Deployment, Service, ConfigMap и другие ресурсы.
Сделайте тестовое изменение в manifest repository: например, обновите тег образа в stage overlay. После merge Argo CD должен увидеть расхождение и синхронизировать Application. В runbook зафиксируйте:
Разделяйте application code и manifests. Для небольших команд допустим monorepo, но на масштабе удобнее разделять репозиторий приложения и manifest repository. Кодовый репозиторий отвечает за сборку и тесты, manifest repository — за желаемое состояние окружений. Так проще ограничить права: разработчики могут менять код, а production-манифесты проходят отдельное ревью platform team или владельцев сервиса.
Используйте AppProject как границу доступа. AppProject ограничивает, какие репозитории, кластеры, namespace'ы и resource kinds доступны конкретной группе Applications. Это особенно важно в Managed Kubernetes, где один кластер обслуживает несколько команд. Начните с принципа минимальных прав и расширяйте по запросу.
Не включайте prune без понимания владения ресурсами. prune: true удаляет ресурсы, которые исчезли из Git и относятся к Application. Это удобно для чистоты среды, но опасно, если часть объектов создаётся другими controllers или ручным процессом. Перед включением проверьте resource tracking, labels, ownership и список объектов в diff.
Включайте self-heal постепенно. Self-heal защищает от drift, но может мешать emergency-действиям, если runbook не описан. Например, инженер временно меняет replicas вручную для стабилизации, а Argo CD возвращает старое значение. Решение не в том, чтобы отказаться от дисциплины, а в том, чтобы описать процесс: временная правка должна либо быстро попасть в Git, либо auto-sync/self-heal временно отключается ответственным инженером с записью в incident timeline.
Продумайте секреты. Не храните plaintext-секреты в Git. Используйте подход, совместимый с вашей политикой безопасности: External Secrets, Sealed Secrets, SOPS или другой механизм. Argo CD должен получать уже безопасное декларативное описание, а не становиться местом хранения чувствительных данных без контроля.
Настройте наблюдаемость Argo CD. Для production недостаточно зелёной иконки в UI. Настройте сбор метрик, алерты на failed sync, рост OutOfSync, недоступность repository, ошибки генерации manifests и деградацию Application Controller. Метрики Argo CD документированы отдельно и могут стать частью общего SRE-мониторинга релизов.
Описывайте исключения явно. В реальных кластерах есть операторы, admission controllers, service mesh, policy engines. Они могут добавлять поля в объекты или менять live-состояние. Если Argo CD постоянно показывает лишний diff, настройте diff customization или измените манифесты так, чтобы желаемое состояние отражало реальность.
Не превращайте Argo CD в единственный контроль качества. Argo CD применяет желаемое состояние, но не гарантирует качество приложения. До изменения манифеста должны пройти unit-тесты, security scan, проверка контейнерного образа, policy validation и review. Хорошая схема: CI доказывает, что артефакт можно выпускать, GitOps доказывает, что выпуск воспроизводимо применён к нужной среде.
Argo CD в Managed Kubernetes даёт DevOps- и SRE-командам понятную модель релизов: желаемое состояние хранится в Git, изменения проходят через review, контроллер сравнивает cluster state с manifest repository и применяет sync. В связке с Managed Kubernetes VK Cloud это сокращает операционные усилия на старте GitOps-практики, особенно если Argo CD подключается как аддон по условиям вашего проекта.
Для успешного внедрения установки инструмента недостаточно. Нужно разделить ответственность CI и GitOps, описать структуру репозиториев, настроить AppProject и RBAC, аккуратно включить automated sync, prune и self-heal, подготовить rollback-runbook, подключить метрики и обучить команды читать diff. Тогда релизы превращаются из набора ручных команд в управляемый процесс с аудитом, воспроизводимостью и понятной зоной ответственности.
Нет. CI по-прежнему нужен для сборки, тестов, security checks и публикации артефактов. Argo CD отвечает за CD-часть в GitOps-модели: сравнение желаемого состояния из Git с кластером и синхронизацию.
Argo CD ориентирован на Kubernetes и работает с Kubernetes manifests, Helm, Kustomize и похожими способами описания ресурсов. Для внешних систем обычно используют дополнительные controllers или отдельные инструменты.
Зависит от зрелости команды и критичности сервиса. Частая схема: dev и stage используют automated sync, production — manual sync или automated sync с дополнительными ограничениями. После накопления практики можно автоматизировать больше этапов.
Предпочтительный путь — revert изменения в Git и sync кластера с новой версией желаемого состояния. Для срочного восстановления можно использовать argocd app rollback APPNAME [ID], но после этого нужно синхронизировать Git с выбранным состоянием.
Проверьте diff. Причина может быть в ручных изменениях, mutating webhooks, controllers, autogenerated fields или несовпадении Helm/Kustomize output. После анализа либо исправьте manifests, либо настройте diff customization, либо исключите объект из управления этим Application.
Не обязательно. Для одного-двух сервисов достаточно Application. ApplicationSet становится полезен, когда нужно одинаково создавать Applications для многих кластеров, окружений или сервисов.
Наши специалисты свяжутся с вами в ближайшее время и ответят на все вопросы.

Будем держать в курсе новостей и облачных трендов




