ДОПОЛНЕНИЕ: Я не сторонник такого метода, который был описан в статье. Считаю, что практичнее и удобнее использовать ArgoCD. Тем не менее, на одном из проектов использовалась связка git pull - crontab. Мне стало интересно, почему было реализовано именно так, и это сподвигло меня к написанию поста. Для обсуждения прошу в комментарии.
Инфраструктура как код, GitOps, автоматизация — все эти слова давно перестали быть модными терминами и стали частью повседневной жизни инженера. Но вместе с этим появляются и вопросы: а всегда ли нужно внедрять тяжелые инструменты? Например, зачем нужен ArgoCD, если можно просто настроить cron с git pull на нужный сервер?
Попробуем разобраться, в чём разница между этими подходами, какие задачи они решают, где их границы применимости и, главное, в каких случаях cron — это «дешево и сердито», а когда он становится «дешево, но больно».
Что такое cron с git pull?
Самый простой способ автоматизировать обновление состояния кластера или сервера из git — это скрипт, который по расписанию делает git pull, а затем применяет конфигурации. Например, для Kubernetes это может быть kubectl apply -f. Для простого веб-приложения — просто перезапуск сервиса.
Это может выглядеть так:
*/5 * * * * cd /opt/config && git pull && kubectl apply -f .Плюсы:
- Простота. Можно настроить за 10 минут. 
- Минимум зависимостей. Cron есть почти в любой Unix-системе. 
- Полный контроль над тем, что происходит. 
Минусы:
- Нет истории применений, откатов, контроля за тем, что реально изменилось. 
- Нет встроенной проверки состояния (всё ли применилось, запустилось ли приложение, упал ли под). 
- Проблемы при конфликтах — если - git pullне проходит из-за конфликта, обновления зависают.
- Сложно масштабировать и поддерживать при росте количества сервисов. 
- Нет визуализации, нет аудита, нет ролевой модели. 
Что такое ArgoCD?
ArgoCD — это инструмент для внедрения GitOps в Kubernetes. Он синхронизирует состояние кластера с тем, что описано в git-репозитории. Работает в режиме pull: сам ArgoCD периодически опрашивает git и применяет изменения.
Особенности:
- Интерфейс: есть веб-UI, CLI, REST API. 
- Отслеживание состояния — показывает, насколько текущее состояние отличается от желаемого. 
- Поддержка helm, kustomize, jsonnet и plain manifests. 
- Возможность отката к предыдущему коммиту. 
- RBAC: доступ к приложениям можно ограничить. 
- Поддержка множественных кластеров из одного ArgoCD. 
Плюсы:
- Надежная синхронизация. Если кто-то вручную внёс изменения в кластер, ArgoCD всё вернёт как было в git. 
- Видимость. Можно посмотреть, какие приложения в каком состоянии. 
- Безопасность. Можно дать доступ только на просмотр или только на одни приложения. 
- Автоматизация. Простой путь к CI/CD через GitOps. 
Недостатки:
- Более сложная настройка по сравнению с cron. 
- Требует запуска в кластере Kubernetes (или как минимум доступа к нему). 
- Иногда избыточен для маленьких проектов или проектов не в Kubernetes. 
Сравнение подходов
| Критерий | Cron + git pull | ArgoCD | 
|---|---|---|
| Простота | Очень просто | Требует обучения | 
| Масштабируемость | Сложно | Поддерживает десятки кластеров | 
| Надежность | Зависит от скрипта | Высокая, встроенные механизмы | 
| Мониторинг состояния | Только через логи | Встроенный UI, CLI, webhooks | 
| Поддержка Helm и Kustomize | Только вручную | Встроенная | 
| Безопасность | Скрипт работает как root | RBAC, безопасные токены | 
| История изменений | Нет | История синхронизаций | 
| Откаты | Вручную | По кнопке или API | 
| Управление доступом | Нет | Тонкая настройка | 
Где cron уместен?
Есть случаи, когда cron — это нормально. Например:
- Небольшой pet-проект, где 1–2 конфигурационных файла. 
- Не Kubernetes, а просто перезапуск systemd-сервисов. 
- Эксперименты или временные стенды. 
- Когда не хочется тянуть за собой весь Kubernetes и CI/CD стек. 
Но даже тут стоит предусмотреть механизмы:
- Проверка ошибок - git pullи- kubectl apply.
- Уведомления в случае сбоя (например, через - mailили Telegram API).
- Логирование в файл с ротацией. 
- Возможность отката — хотя бы через - git checkoutна конкретный коммит.
Когда cron становится проблемой
Рассмотрим реальный кейс. Допустим, у вас десяток приложений, каждое в своём namespace. На каждое настроен cron, который тянет свой репозиторий и применяет манифесты. Кто-то случайно закоммитил неправильный ingress — поломался доступ ко всем сервисам. Cron отработал — никто не заметил. Разбирайтесь теперь по логам, руками находите коммиты, применяйте kubectl rollout undo, если повезло.
В ArgoCD в этой же ситуации вы бы:
- Увидели в UI, что приложение не синхронизировано или находится в ошибке. 
- Перешли на коммит назад одной кнопкой. 
- Получили уведомление в Slack/Telegram. 
- Могли бы ввести ручное подтверждение перед деплоем в прод. 
Заключение
Cron с git pull — это рабочий и простой подход. Иногда даже оправданный. Но только до тех пор, пока не начинаются проблемы: рост количества сервисов, ошибки в манифестах, необходимость аудита и безопасности. ArgoCD решает все эти задачи из коробки, хотя и требует немного большего порога входа.
Если вы начинаете проект или делаете MVP — начните с cron. Но держите в голове, что это временное решение. Как только инфраструктура станет сложнее, переходите на GitOps-инструменты — ArgoCD, Flux или аналогичные. Это инвестиция в стабильность, масштабируемость и сон DevOps-инженера.
Комментарии (9)
 - Nextusius23.05.2025 10:12- Ну как бы уместно если у вас "голый" git сервер и вы, по каким либо причинам, не можете использовать вообще ничего внутри кубера. - Во всех остальных случаях быстрее и правильнее посадить гит агента в кластер. Любого. Гитлаб ранена, агента гит-верс, агента гит-хаб и т.п. При этом они просто будут встроены в ваш пайп ci/cd. - Если совсем плохо, то Дженкинс агента, но там сам Дженкинс сервер понадобится. 
 
           
 
remzalp
ArgoCD кушает мало, поднимается одним манифестом, если дефолтные настройки годятся - то боли не будет.
А какие побочки я не заметил?
daniilmaibe Автор
Согласен, тоже считаю, что гораздо удобнее и практичнее сделать на основе ArgoCD) Тем не менее, на одном из проектов, куда меня позвали, использовали именно крон.