VK Cloud

Argo CD в Managed Kubernetes: автоматизация релизов по GitOps

7 июля 2026 г.
шпрингер.png
Елена Шпрингер
Автор статьи
_blog_head_109.png

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-запуском.

погоржельский2.jpg

Статья подготовлена вместе с экспертом

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

GitOps: что это и чем отличается от CI/CD

GitOps — операционная модель, в которой желаемое состояние системы описывается декларативно и хранится в Git. OpenGitOps формулирует четыре базовых принципа: система должна быть декларативной, состояние — версионированным и неизменяемым, агенты должны автоматически получать объявления желаемого состояния из источника, а фактическое состояние должно непрерывно сверяться с желаемым.

Классический CI/CD часто строится как цепочка «собрать образ → прогнать тесты → выполнить deploy-команду». Такой pipeline полезен и остаётся необходимым: CI компилирует код, запускает тесты, собирает контейнер, публикует артефакт и проверяет качество. Но если последняя стадия CI напрямую меняет кластер, появляется несколько рисков:

  • права на кластер приходится выдавать CI-системе;
  • история релиза размазана между Git, логами pipeline и состоянием Kubernetes;
  • ручные изменения через kubectl могут незаметно разойтись с тем, что лежит в репозитории;
  • откат зависит от того, как именно написан pipeline и сохранились ли старые параметры;
  • разные команды постепенно создают разные способы доставки.

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: какие компоненты участвуют в релизе

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

Какие задачи Argo CD закрывает на практике

Автоматическая выкатка изменений из Git

Когда команда включает 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

Self-heal и защита от drift

В Kubernetes часть изменений может появляться в обход Git: срочная ручная правка, эксперимент в namespace, некорректная команда, сторонний controller. Если такие изменения не возвращать к декларативному описанию, среда постепенно перестаёт быть воспроизводимой. Self-heal включает автоматическую реакцию на расхождение live-состояния и Git-состояния: если кто-то изменил объект в кластере, Argo CD снова применяет target-состояние.

Для SRE это практический механизм синхронизации кластера с Git. Источник правды находится в репозитории, а не в наборе разовых kubectl edit. Self-heal лучше внедрять постепенно: сначала включить сравнение и алерты, затем автоматическое исправление для безопасных сервисов, и только после этого — для критичных workload'ов с понятными исключениями.

spec: syncPolicy: automated: selfHeal: true

Rollback и восстановление после неудачного релиза

В 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 и как затем возвращается штатная политика синхронизации.

Наблюдаемость и SRE-операции

Argo CD не заменяет Prometheus, Grafana, логирование и трассировку, но даёт отдельный слой наблюдаемости за доставкой. Команда видит sync status, health status, diff, историю операций и события. Метрики Argo CD документированы отдельно и могут стать частью общего SRE-мониторинга релизов.

Практически полезно отслеживать:

  • количество OutOfSync-приложений по проектам и окружениям
  • долю failed sync и причины ошибок
  • время от merge в manifest repository до успешного sync
  • drift по критичным namespace'ам
  • частоту ручных изменений и emergency rollback
  • доступность API Server и задержки Repository Server при генерации manifests

Масштабирование на несколько сервисов и кластеров

Для одного сервиса достаточно отдельного Application. Когда сервисов десятки, а окружений несколько, ручное создание объектов становится источником ошибок. ApplicationSet шаблонизирует Applications и генерирует их из списка, Git-структуры или сведений о кластерах. Это удобно для platform team: единый шаблон задаёт стандартные labels, project, sync policy и путь в репозитории, а команды добавляют новый сервис через небольшое изменение в декларативной конфигурации.

Подключение аддона VK Cloud Managed Kubernetes

Если в вашем проекте доступен аддон Argo CD для VK Cloud Managed Kubernetes, подключение можно планировать как часть подготовки к GitOps. Ниже — безопасная последовательность шагов без неподтверждённых утверждений о версиях, цене, SLA и конкретных параметрах реализации.

  1. Откройте проект VK Cloud и перейдите к нужному кластеру Managed Kubernetes.
  2. Найдите раздел аддонов или расширений кластера.
  3. Выберите аддон Argo CD.
  4. Запустите подключение и дождитесь завершения установки.
  5. Проверьте, что в кластере появились ресурсы Argo CD и доступен интерфейс или endpoint, предусмотренный выбранным способом подключения.
  6. Настройте доступы: пользователи, группы, роли, service account и ограничения по namespace'ам.
  7. Подключите Git-репозитории с манифестами и создайте первый Application.

Что стоит проверить до включения в production:

  • кто администрирует Argo CD и какие роли есть у команд разработки
  • где хранится manifest repository и как защищены ветки
  • какие namespace'ы и кластеры разрешены конкретному AppProject
  • как выполняется доступ к приватным репозиториям
  • есть ли требования к сетевой доступности Git из кластера
  • как организованы backup, audit logs и восстановление конфигурации
  • как меняются параметры аддона при обновлениях кластера

Пошаговая настройка первого Application

Пример ниже рассчитан на команду, которая уже имеет кластер Managed Kubernetes, установленный Argo CD и репозиторий с манифестами приложения. Пример намеренно короткий: он показывает структуру Application, но не претендует на полный production-манифест.

Шаг 1. Подготовьте структуру manifest repository

Один из рабочих вариантов — хранить приложение и окружения отдельно:

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 и ревью владельцев сервиса.

Шаг 2. Опишите Application

Минимальный 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 может ссылаться на зарегистрированный внешний кластер.

Шаг 3. Добавьте sync policy

Для 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.

Шаг 4. Примените Application

Если вы управляете 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 и другие ресурсы.

Шаг 5. Проверьте сценарий изменения

Сделайте тестовое изменение в manifest repository: например, обновите тег образа в stage overlay. После merge Argo CD должен увидеть расхождение и синхронизировать Application. В runbook зафиксируйте:

  • где смотреть diff перед sync;
  • кто подтверждает production-синхронизацию;
  • как временно остановить auto-sync;
  • как выполняется rollback;
  • какие алерты срабатывают при failed sync;
  • как отличать ошибку манифеста от ошибки кластера.

Рекомендации и ограничения для production

Разделяйте 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 доказывает, что выпуск воспроизводимо применён к нужной среде.

Частые ошибки внедрения

  1. Слишком ранний production auto-sync. Команда включает автоматическую синхронизацию везде, не имея rollback-runbook и алертов. Лучше начать с dev/stage, а production подключать после нескольких стабильных циклов.
  2. Один default project для всех. Это быстро на старте, но плохо для безопасности и аудита. Разделяйте проекты по командам, средам или доменам.
  3. Смешивание ручных правок и GitOps. Если engineer регулярно чинит объекты через kubectl edit, Git перестает быть источником правды. Введите правило: постоянные изменения идут через Git, emergency — документируются и затем фиксируются в Git.
  4. Нет владельца manifest repository. Без code owners и review легко случайно поменять production overlay. Назначьте владельцев директорий и правила approvals.
  5. Слишком большие Applications. Один Application на весь кластер усложняет diff и rollback. Лучше группировать ресурсы по сервисам или логическим доменам.

Заключение

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. Тогда релизы превращаются из набора ручных команд в управляемый процесс с аудитом, воспроизводимостью и понятной зоной ответственности.

FAQ

Argo CD заменяет CI/CD?

Нет. CI по-прежнему нужен для сборки, тестов, security checks и публикации артефактов. Argo CD отвечает за CD-часть в GitOps-модели: сравнение желаемого состояния из Git с кластером и синхронизацию.

Можно ли использовать Argo CD только для Kubernetes?

Argo CD ориентирован на Kubernetes и работает с Kubernetes manifests, Helm, Kustomize и похожими способами описания ресурсов. Для внешних систем обычно используют дополнительные controllers или отдельные инструменты.

Что выбрать для production: manual sync или automated sync?

Зависит от зрелости команды и критичности сервиса. Частая схема: dev и stage используют automated sync, production — manual sync или automated sync с дополнительными ограничениями. После накопления практики можно автоматизировать больше этапов.

Как делать rollback в GitOps?

Предпочтительный путь — revert изменения в Git и sync кластера с новой версией желаемого состояния. Для срочного восстановления можно использовать argocd app rollback APPNAME [ID], но после этого нужно синхронизировать Git с выбранным состоянием.

Что делать, если Argo CD постоянно показывает OutOfSync?

Проверьте diff. Причина может быть в ручных изменениях, mutating webhooks, controllers, autogenerated fields или несовпадении Helm/Kustomize output. После анализа либо исправьте manifests, либо настройте diff customization, либо исключите объект из управления этим Application.

Нужен ли ApplicationSet с первого дня?

Не обязательно. Для одного-двух сервисов достаточно Application. ApplicationSet становится полезен, когда нужно одинаково создавать Applications для многих кластеров, окружений или сервисов.

Оставьте заявку, чтобы получить консультацию

Наши специалисты свяжутся с вами в ближайшее время и ответят на все вопросы.

section-subscribe_2x.png

            Узнавайте о выходе новых статей в блоге первыми!

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

            section-subscribe_2x.png
              section-subscribe_2x.png
              Теги: kubernetes, VK Cloud
              Ссылка скопирована
              Поделиться

              Почитать по теме

              _blog_head_72.png
              14 июля

              Отказоустойчивый кластер Kubernetes: мультизона, реплики и бэкап

              _blog_head_172.png
              8 июля

              GPU Operator в Managed Kubernetes: запуск GPU-вычислений без ручной настройки драйверов

              _blog_head_102.png
              24 июня

              Как устроен Cilium: eBPF-технологии в сетевой подсистеме Kubernetes

              40+ готовых сервисов