Урок по треку DevOps: CI/CD, IaC, облака 6 мин

GitOps и ArgoCD за 6 минут

Pull-модель, Application и sync, дрейф и self-heal, app of apps, окружения и продвижение релиза.

GitOps это способ управлять инфраструктурой и приложениями, при котором желаемое состояние описано декларативно в git, а агент внутри кластера постоянно приводит реальность к этому описанию. Деплой превращается в коммит: поменяли тег образа в репозитории, через минуту кластер обновился.

Четыре принципа (OpenGitOps)

  1. Декларативность: описываем, что должно быть (манифесты, Helm, Kustomize), а не шаги, как это сделать.
  2. Версионируемость и неизменяемость: состояние хранится в git, каждое изменение это коммит с автором и историей.
  3. Автоматическое вытягивание: агент сам забирает изменения из git.
  4. Непрерывная сверка (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.
  • Как продвигать релиз между окружениями.

Закрепите за 5 минут

После урока в тренажёре 3-5 проверочных вопросов, дальше модуль уходит в повторения.