GitOps Toolchain — Argo CD vs Flux
GitOps mení definíciu "ako sa veci dostanú do produkcie": Git repo je single source of truth, cluster sám seba opravuje smerom k tomu, čo je v Gite. Tento článok je orientovaný na voľbu nástroja, nie na vysvetlenie samotného konceptu (k tomu pozri GitOps). Pozrieme sa na dvoch zrelých kandidátov — Argo CD a Flux v2 — a kedy ktorý dáva zmysel.
Stručne: čo robia oba nástroje
Obidva nástroje žijú vnútri Kubernetes clusteru a porovnávajú želaný stav (manifesty v Gite) so skutočným stavom (objekty v API serveri). Keď nájdu drift, buď ho ohlásia, alebo ho automaticky zaplátajú podľa nastavenia. Tým sa CI pipeline zbavuje úlohy deploy-eru a stáva sa len generátorom artefaktov + commitov.
Argo CD — architektúra
Argo CD je centralizovaná aplikácia, ktorú nasadíš do clustera (alebo do management clustera, ak chceš multi-cluster topológiu).
Hlavné komponenty:
- argocd-server — gRPC + HTTP API + web UI (the bit users actually see).
- argocd-repo-server — stateless worker, ktorý generuje manifesty z Git repa (Kustomize / Helm / plain YAML / Jsonnet / vlastný plugin).
- argocd-application-controller — porovnáva
ApplicationCR s reálnym stavom v cluster-i a aplikuje zmeny. - argocd-applicationset-controller — generuje
ApplicationCR z templates (matica clusterov × prostredí). - argocd-notifications-controller — Slack / Teams / e-mail / webhook na zmenu stavu Application.
Datový tok: git push → repo-server pulls → renders manifests → controller compares → API server.
Argo CD App-of-Apps pattern
Pre väčšie prostredia sa zaviedol vzor App-of-Apps: jeden root Application, ktorý ukazuje na priečinok plný ďalších Application CR-iek. Tým dokážeš spravovať aj stovky aplikácií ako jeden git tree. Modernejšia varianta je ApplicationSet s generátormi (list, cluster, git, matrix), ktorá nahrádza ručne písané "child" Application objekty.
Flux v2 — architektúra
Flux v2 je opačný extrém — namiesto monolitickej aplikácie je to sada controller-ov, každý s jednou zodpovednosťou. Nasadíš ich cez flux install alebo flux bootstrap a žijú v flux-system namespace.
- source-controller — ťahá zdroje (
GitRepository,OCIRepository,HelmRepository,Bucket) do internej cache. - kustomize-controller — aplikuje
KustomizationCR (vie aj plain YAML, nemusíš mať kustomization.yaml). - helm-controller —
HelmReleaseCR, beží proti renderu z source-controller-u (žiadnyhelm installso štátom vhelmbinarke). - notification-controller — provider/alert CR-ky, prepojené s Slack / GitHub Checks / Webhook.
- image-reflector-controller + image-automation-controller — voliteľný pár pre image automation: skenuje registry tag-y a vie automaticky commitnúť bump verzie späť do Gitu (
ImageUpdateAutomationCR).
Flux používa GitOps Toolkit SDK, ktorý je verejné API — vlastné controller-y môžu konzumovať GitRepository rovnako ako oficiálne.
Feature porovnanie
| Schopnosť | Argo CD | Flux v2 |
|---|---|---|
| Multi-tenant UI | ✅ vstavané | ❌ (CLI / CR-ky, doplnkové UI Weave GitOps alebo Capacitor) |
| Helm support | ✅ render-only (nepoužíva Tiller / Helm release storage) | ✅ plný (vlastný HelmRelease, history v cluster-i) |
| Kustomize support | ✅ | ✅ |
| Multi-cluster z jedného controllera | ✅ (registrácia kubeconfig-ov) | ❌ (každý cluster má vlastný Flux; orchestrácia cez fleet/carvel/Argo CD) |
| ApplicationSet (matrix generator) | ✅ vstavané | čiastočne — kombinácia Kustomization + image automation |
| Image auto-update (registry → git PR/commit) | ❌ (treba externý nástroj, napr. Argo CD Image Updater) | ✅ priamo cez image-automation-controller |
| Hook-y / sync waves | ✅ sync waves + sync hooks | ✅ dependsOn + post-build substitution |
| RBAC granularita | per-project, per-app | per-namespace, per-CR (Kubernetes RBAC + Flux SA) |
| Sealed / encrypted secrets | externe — SOPS, Sealed Secrets, External Secrets | rovnaké externé možnosti, integrovaný SOPS dešifrovanie v Kustomization.spec.decryption |
| Webhook trigger | ✅ /api/webhook | ✅ Receiver CR (Git / Helm / Generic / Bitbucket / Quay) |
| Notification provider | argocd-notifications | notification-controller (Slack, MS Teams, GitHub Checks, generic webhook, Telegram) |
Pozn.: Tabuľka je platná pre Argo CD 2.13+ a Flux 2.4+. Featurey pribúdajú rýchlo — vždy si over v príslušnom release-note.
Kedy si vybrať Argo CD
Argo CD sa najlepšie cíti v prostredí, kde:
- chceš UI pre tímy, ktoré neradi otvárajú PR-ku len aby videli, čo sa deje;
- riadiš veľa clusterov z jedného miesta (centrálny Argo CD + viacero
clusterkubeconfig-ov); - máš organizačnú maticu prostredia × tenanti a ApplicationSet ti ušetrí stovky riadkov YAML;
- chceš enforce-nuté manuálne sync (Argo CD vie zostať v
OutOfSynca čakať, kým ho niekto klikne).
Typický signál: "PM-ka sa pýta, ktorá verzia je v staging-u — chcem aby si to vedela pozrieť sama".
Kedy si vybrať Flux
Flux je doma tam, kde:
- CRD-first prístup ti vyhovuje (
HelmRelease,Kustomization,ImageUpdateAutomationako YAML, žiadne click-ops); - chceš automatický image bump bez externého Updater-a;
- platform team je menší, každý cluster spravuje sám seba;
- preferuješ GitOps Toolkit ako základ pre vlastné controllery (Flagger, Capsule, Karmada všetky stavajú na ňom);
- chceš integrovaný SOPS dešifrovaní v
Kustomization.
Typický signál: "chcem aby tag latest v ECR automaticky znamenal nový deploy, bez toho aby som tam medzi tým robil PR rukou".
Migration patterns
Z monolitického CI/CD push (Jenkins → kubectl apply) → GitOps
- Zafrízuj manuálne
kubectl apply— najprv to musí prestať fungovať mimo Gitu, inak budeš večne riešiť drift. - Reverse-engineer aktuálny stav do manifestov.
kubectl get -o yaml+ odstráneniestatus:,creationTimestamp,resourceVersion, kontrolery cleanupy. Použiteľný nástroj:konfigurealebokubectl-neat. - Importuj postupne — najprv jeden namespace, daj ho pod Argo CD / Flux, sleduj drift.
- Až keď je drift = 0, prepni sync na
automated: { prune: true, selfHeal: true }.
Z Argo CD → Flux v2 (alebo opačne)
- Začni paralelným nasadením druhého controllera v test cluster-i.
- Preformuluj manifesty na Kustomize, ak ešte nie sú — obidva nástroje to vedia.
- V starom nástroji nastav
prune: false, v novomprune: false— počas tranzície bude oboje "vedieť" o objektoch, ale nezasahovať agresívne. - Postupne odoberaj jeden namespace zo starého a pridávaj do nového.
- Po overení odstráň prvého a zapni
prune: truena druhom.
Anti-pattern: "big-bang" prepnutie cez weekend. Vždy budeš mať jeden objekt, ktorý zabudol kto, a nový controller ho rozhodí.
Observability
| Otázka | Argo CD | Flux v2 |
|---|---|---|
| Synced / OutOfSync prehľad | UI /applications |
flux get all -A + Capacitor / Weave GitOps |
| Drift detail | UI diff viewer (živý) | flux diff kustomization <name> |
| Audit trail | argocd app history, k8s events |
Git history (zo source-controller-u) + k8s events |
| Prometheus metriky | argocd-server, argocd-app-controller exportéry |
každý controller exportuje gotk_* metriky |
| Notifikácie | argocd-notifications (Trigger + Template CR) | notification-controller (Alert + Provider CR) |
Pre obidva platí: CR-ky sú objekty v API serveri, takže ich Prometheus + alertmanager vie čítať cez kube-state-metrics ako každý iný resource.
Zhrnutie
Žiadny z týchto nástrojov nie je "lepší" v absolútnom zmysle — ide o trade-offy. Argo CD vyhráva, keď chceš central UI a multi-cluster z jedného miesta. Flux vyhráva, keď chceš čisto CRD-driven prístup a integrovanú image automatizáciu. Ak nemáš silný dôvod ani na jednu stranu, začni Fluxom (menší overhead, lepšie zapadá do platform teamu), a prejdi na Argo CD keď začneš mať väčšie organizačné požiadavky na UI a multi-tenant view.
Ďalšie zdroje
- Argo CD docs
- Flux docs
- CNCF GitOps Working Group — opengitops.dev
- Prepojené články: GitOps, ArgoCD, Kubernetes, Helm