3.7.1 · блок 3
GitOps и Argo CD
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.