GitOps это способ управлять инфраструктурой и приложениями, при котором желаемое состояние описано декларативно в git, а агент внутри кластера постоянно приводит реальность к этому описанию. Деплой превращается в коммит: поменяли тег образа в репозитории, через минуту кластер обновился.
Четыре принципа (OpenGitOps)
- Декларативность: описываем, что должно быть (манифесты, Helm, Kustomize), а не шаги, как это сделать.
- Версионируемость и неизменяемость: состояние хранится в git, каждое изменение это коммит с автором и историей.
- Автоматическое вытягивание: агент сам забирает изменения из git.
- Непрерывная сверка (reconciliation): агент постоянно сравнивает кластер с git и исправляет расхождения.
Push против pull
- Push: CI-пайплайн после сборки сам делает
kubectl applyилиhelm upgrade. CI нужен доступ к кластеру с широкими правами, а ручное изменение в кластере никто не заметит. - Pull (GitOps): CI только собирает образ и обновляет тег в git. Агент в кластере (ArgoCD, Flux) видит коммит и применяет. Кластер не открыт наружу, CI не хранит kubeconfig, дрейф обнаруживается автоматически.
ArgoCD
Основной объект ArgoCD это Application: откуда брать манифесты и куда применять.
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: billing
namespace: argocd
spec:
project: default
source:
repoURL: https://git.example.ru/platform/deploy.git
targetRevision: main
path: apps/billing/overlays/prod
destination:
server: https://kubernetes.default.svc
namespace: billing
syncPolicy:
automated:
prune: true # удалять из кластера то, что удалили из git
selfHeal: true # откатывать ручные правки в кластере
syncOptions:
- CreateNamespace=true
У приложения два статуса:
- Sync:
Synced(кластер совпадает с git) илиOutOfSync. - Health:
Healthy,Progressing,Degraded,Missing,Suspended. Это про то, работают ли ресурсы, а не совпадают ли они с git.
Приложение может быть Synced, но Degraded: манифесты применены, а поды падают.
По умолчанию ArgoCD опрашивает git примерно раз в три минуты; чтобы реагировать быстрее, настраивают вебхук из git-сервера.
Дрейф и self-heal
Дрейф: кто-то сделал kubectl edit руками, и кластер разошёлся с git. С selfHeal: true ArgoCD вернёт как в git. Без него приложение станет OutOfSync, и это видно в интерфейсе. Срочный фикс в GitOps тоже делают коммитом, иначе его откатит агент.
Много приложений и окружений
- App of apps: одно корневое Application указывает на каталог с другими Application.
- ApplicationSet: шаблон, который генерирует Application по списку, кластерам или каталогам в git. Удобно для «сервис × окружение».
- Окружения: отдельные каталоги (
overlays/dev,overlays/prod) или отдельные репозитории. Продвижение релиза это коммит, меняющий тег образа в каталоге следующего окружения, часто через merge request с ревью. - Sync waves: аннотация
argocd.argoproj.io/sync-waveзадаёт порядок применения, а хукиPreSyncиPostSyncзапускают, например, миграции перед обновлением.
Секреты в GitOps
Секреты в открытом виде в git класть нельзя. Варианты:
- Sealed Secrets: в git шифрованный SealedSecret, расшифровать может только контроллер в кластере.
- SOPS: шифрование значений в файлах ключом KMS или age.
- External Secrets Operator: в git только ссылка, значение приходит из Vault или облачного хранилища секретов.
Отдельный репозиторий для деплоя
Часто код приложения и манифесты разделяют: CI приложения собирает образ и коммитит новый тег в deploy-репозиторий. Так история деплоев не смешивается с историей кода, а права на прод выдаются на deploy-репозиторий.
Частые ошибки
- Ручные правки в кластере при включённом selfHeal: они исчезнут через минуту.
prune: trueбез понимания: удалили файл из git, удалился и ресурс (вместе с PVC, если он там описан).- Тег
latestв манифестах: git не меняется, и ArgoCD не видит, что надо обновить. - Секреты в git открытым текстом.
Что спросят на собесе
- Чем GitOps отличается от деплоя из CI через kubectl.
- Что такое Sync и Health в ArgoCD и чем они отличаются.
- Как в GitOps откатиться на прошлую версию.
- Как хранить секреты, если всё в git.
- Как продвигать релиз между окружениями.