03 · Платформа: DevOps, k8s, сеть, хранилище3.7 · Argo CD и Argo Workflows3.7.1средний

GitOps и Argo CD

Зачем это нужно

До GitOps: Jenkins собрал образ → кто-то kubectl apply или helm upgrade с ноутбука. Через месяц непонятно, что реально в prod — drift, «у меня работало», нет audit trail. GitOps: желаемое состояние кластера хранится в Git; контроллер (Argo CD) непрерывно синхронизирует кластер с repo.

Для ML это означает: версия модели в values, chart inference, HTTPRoute — всё через Merge Request. Rollback = revert commit, не ручной patch Pod'а.

Основные идеи

Git как single source of truth. Репозиторий gitops-ml-prod содержит Helm charts, Kustomize overlays, или plain manifests. Tag образа scorer:128 — строка в values-prod.yaml, не «запомнили на созвоне».

Pull vs push. CI (Jenkins) push'ит образ в registry и обновляет Git (MR с новым tag). Argo CD pull'ит Git и apply в кластер. CI не держит kubeconfig prod — меньше риска утечки.

Argo CD — основные сущности.

Сущность Смысл
Application Связь: Git repo + path + cluster/namespace
Sync Применить манифесты из Git
Health Deployment ready? PVC bound?
Sync status Synced / OutOfSync
Revision commit SHA в Git

Application (упрощённо):

apiVersion: argoproj.io/v1alpha1 kind: Application metadata: name: scorer-prod namespace: argocd spec: project: ml source: repoURL: https://git.mdp.ru/ml/scorer-chart.git path: . targetRevision: main helm: valueFiles: - values-prod.yaml destination: server: https://kubernetes.default.svc namespace: ml-prod syncPolicy: automated: prune: true selfHeal: true

Automated sync + selfHeal. Кто-то kubectl edit deployment — Argo вернёт состояние из Git. Prune удалит ресурсы, убранные из Git (осторожно с PVC).

App of Apps / ApplicationSet. Platform team ставит десятки Application одним parent chart — каждый ML-сервис = отдельный Application.

Связь с OpenGitOps. Принципы: declarative, versioned, immutable artifacts, software agents, closed loop — описаны на opengitops.dev; Argo CD — популярная реализация для Kubernetes.

Helm + Argo. Argo рендерит Helm при sync; не нужен отдельный helm upgrade в CI. Jenkins только обновляет values в Git.

Как это выглядит на практике

Типичный release inference-модели:

  1. Jenkins: test → build registry/ml/scorer:129 → push.

  2. Bot или инженер: MR в scorer-chart, image.tag: "129", model.key: scorer/v44/....

  3. Review + merge в main.

  4. Argo CD detect OutOfSync → sync → rolling update Deployment.

  5. UI Argo: зелёный health, revision = merge commit.

Ручной sync (учебный кластер):

argocd app get scorer-dev argocd app sync scorer-dev kubectl rollout status deployment/scorer -n ml-dev

OutOfSync не всегда плохо. Временный debug patch — Argo покажет diff. SelfHeal откатит через минуту — для экспериментов отключайте selfHeal или sync вручную.

Secrets в GitOps. Не коммитьте plain secrets. Паттерны: Sealed Secrets, External Secrets Operator, SOPS — platform MDP выбирает один; вы монтируете готовый Secret из chart template.

Что сделать после занятия

  • Найдите Application своего сервиса в Argo CD UI и выпишите Git repo + path.

  • Сделайте осознанное изменение в values (replicas +1), merge — наблюдайте sync.

  • Объясните разницу: Jenkins обновляет Git vs Jenkins делает kubectl apply.

Официальные материалы