Зачем это нужно
До 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-модели:
Jenkins: test → build
registry/ml/scorer:129→ push.Bot или инженер: MR в
scorer-chart,image.tag: "129",model.key: scorer/v44/....Review + merge в
main.Argo CD detect OutOfSync → sync → rolling update Deployment.
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.