🔴 Advanced

ArgoCD — GitOps Continuous Delivery

Čo je ArgoCD a prečo GitOps?

ArgoCD je deklaratívny GitOps continuous delivery nástroj pre Kubernetes. Funguje na jednoduchom princípe — Git repozitár je single source of truth pre definíciu želaného stavu aplikácií a infraštruktúry.

Prečo GitOps?

Tradičný CI/CD push model má niekoľko nevýhod — CI pipeline priamo aplikuje zmeny do clustra, čo vytvára bezpečnostné riziká a sťažuje audit. GitOps tento model obracia:

  • Deklaratívny stav — celá konfigurácia je v Gite
  • Automatická synchronizácia — ArgoCD neustále porovnáva želaný stav (Git) so skutočným stavom (cluster)
  • Audit trail — každá zmena je git commit s autorom, časom a dôvodom
  • Rollback — návrat na predchádzajúcu verziu = git revert
  • Self-healing — ak niekto manuálne zmení niečo v clustri, ArgoCD to deteguje a opraví

Architektúra ArgoCD

ArgoCD beží ako sada microservices priamo v Kubernetes clustri:

Application Controller

Jadro ArgoCD. Neustále monitoruje bežiace aplikácie a porovnáva ich aktuálny stav so želaným stavom definovaným v Git repozitári. Ak deteguje drift (odchýlku), označí aplikáciu ako OutOfSync.

  • Sleduje Kubernetes resources cez watch mechanizmus
  • Vykonáva sync operácie (apply manifestov)
  • Podporuje health checks pre custom resources

Repo Server

Zodpovedá za komunikáciu s Git repozitármi:

  • Klonuje a cachuje repozitáre
  • Generuje Kubernetes manifesty z rôznych zdrojov (Helm, Kustomize, plain YAML, Jsonnet)
  • Beží ako stateless služba — dá sa horizontálne škálovať

API Server

Poskytuje rozhranie pre používateľov a externé systémy:

  • gRPC/REST API pre programový prístup
  • Web UI — prehľadný dashboard so stavom aplikácií
  • CLI (argocd) — plnohodnotný command-line klient
  • SSO integrácia — OIDC, SAML, LDAP
  • Spravuje RBAC politiky a autentifikáciu

Redis

Používa sa ako cache layer pre dáta API servera a aplikačný stav — zrýchľuje odozvu UI a API.

Dex (voliteľný)

Identity provider pre SSO integráciu — ArgoCD ho používa na pripojenie externých identity providerov.


Sync stratégie

ArgoCD ponúka flexibilné stratégie synchronizácie aplikácií:

Auto-Sync

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: my-app
spec:
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
      allowEmpty: false
  • automated — automaticky synchronizuje pri detekcii zmien v Gite
  • selfHeal — opraví manuálne zmeny v clustri (drift correction)
  • allowEmpty — ochrana pred vymazaním všetkých resources pri prázdnom manifeste

Manual Sync

Predvolená stratégia. ArgoCD deteguje zmeny a označí aplikáciu ako OutOfSync, ale čaká na manuálny trigger:

argocd app sync my-app

Vhodné pre produkčné prostredia, kde chcete explicitné schválenie pred deploymentom.

Prune

Prune riadi, čo sa stane s Kubernetes resources, ktoré už nie sú definované v Gite:

  • prune: true — automaticky vymaže osirelé resources
  • prune: false — resources zostanú (bezpečnejšie, ale vyžaduje manuálny cleanup)

Sync Options

syncPolicy:
  syncOptions:
    - CreateNamespace=true
    - PrunePropagationPolicy=foreground
    - PruneLast=true
    - ApplyOutOfSyncOnly=true
    - ServerSideApply=true
  • PruneLast — najprv aplikuje nové resources, potom vymaže staré
  • ServerSideApply — používa server-side apply namiesto kubectl apply
  • ApplyOutOfSyncOnly — synchronizuje len zmenené resources (rýchlejšie)

Application a ApplicationSet

Application

Základná jednotka v ArgoCD — definuje jednu aplikáciu:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: frontend
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/org/app.git
    targetRevision: main
    path: k8s/overlays/production
  destination:
    server: https://kubernetes.default.svc
    namespace: frontend

Kľúčové polia:

  • source — odkiaľ brať manifesty (Git repo, Helm chart)
  • destination — kam deployovať (cluster + namespace)
  • project — AppProject pre izoláciu a RBAC

ApplicationSet

Generátor pre dynamické vytváranie Applications — ideálny pre multi-tenant a multi-cluster scenáre:

apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: microservices
spec:
  generators:
    - git:
        repoURL: https://github.com/org/apps.git
        directories:
          - path: services/*
  template:
    metadata:
      name: '{{path.basename}}'
    spec:
      source:
        repoURL: https://github.com/org/apps.git
        path: '{{path}}'
      destination:
        server: https://kubernetes.default.svc
        namespace: '{{path.basename}}'

Typy generátorov:

  • Git — generuje apps z adresárovej štruktúry alebo súborov v repo
  • Cluster — generuje app pre každý registrovaný cluster
  • Matrix — kombinácia viacerých generátorov (napr. cluster × environment)
  • Pull Request — vytvára preview environments pre každý PR
  • List — statický zoznam parametrov

Multi-cluster management

ArgoCD exceluje v správe viacerých Kubernetes clustrov z jedného miesta:

Registrácia clustrov

# Pridanie clustra cez CLI
argocd cluster add staging-cluster --name staging

# Zobrazenie registrovaných clustrov
argocd cluster list

Hub-and-Spoke model

Jeden centrálny ArgoCD cluster (hub) spravuje aplikácie na viacerých cieľových clustroch (spokes):

  • Centralizovaná správa — jeden dashboard pre všetky prostredia
  • Konzistentný deployment — rovnaké manifesty, rôzne clustre
  • Network requirements — ArgoCD potrebuje prístup k API serverom cieľových clustrov

Best practices pre multi-cluster

  • Používajte ApplicationSet s cluster generátorom pre automatický deployment na všetky clustre
  • Oddeľte konfiguráciu per-cluster cez Kustomize overlays alebo Helm values
  • Nastavte cluster-specific RBAC — obmedzite, kto môže deployovať kam
  • Monitorujte health status každého clustra zvlášť

RBAC a SSO integrácia

RBAC (Role-Based Access Control)

ArgoCD má vlastný RBAC systém definovaný v ConfigMap:

apiVersion: v1
kind: ConfigMap
metadata:
  name: argocd-rbac-cm
data:
  policy.csv: |
    p, role:developer, applications, get, */*, allow
    p, role:developer, applications, sync, */dev-*, allow
    p, role:admin, applications, *, */*, allow
    g, dev-team, role:developer
    g, platform-team, role:admin
  policy.default: role:readonly

Formát: p, role, resource, action, object, effect

  • Resources: applications, clusters, repositories, projects
  • Actions: get, create, update, delete, sync, override
  • Object pattern: project/application s wildcard podporou

SSO integrácia

ArgoCD podporuje SSO cez OIDC (OpenID Connect):

apiVersion: v1
kind: ConfigMap
metadata:
  name: argocd-cm
data:
  oidc.config: |
    name: Keycloak
    issuer: https://keycloak.example.com/realms/devops
    clientID: argocd
    clientSecret: $oidc.keycloak.clientSecret
    requestedScopes:
      - openid
      - profile
      - email
      - groups

Podporované identity providers:

  • Keycloak, Okta, Azure AD — cez OIDC
  • GitHub, GitLab — cez Dex connector
  • LDAP/Active Directory — cez Dex LDAP connector
  • SAML 2.0 — pre enterprise prostredia

Porovnanie s Flux

Aspekt ArgoCD Flux
UI Bohatý web dashboard Žiadne natívne UI (Weave GitOps)
Architektúra Centralizovaný (hub-spoke) Decentralizovaný (per-cluster)
Multi-cluster Natívna podpora Cez Kubernetes API
Helm podpora Helm template → apply Natívny HelmRelease controller
Image automation Externý (Argo Image Updater) Vstavaný Image Automation
Notifications Argo Notifications Flux Notification Controller
RBAC Vlastný RBAC systém Kubernetes RBAC
Krivka učenia Strmšia, viac features Jednoduchší štart
CRDs Application, AppProject, ApplicationSet GitRepository, Kustomization, HelmRelease

Kedy ArgoCD?

  • Potrebujete centrálny dashboard pre všetky clustre
  • Chcete granulárny RBAC nezávislý od Kubernetes RBAC
  • Máte väčšie tímy s rôznymi úrovňami prístupu
  • Preferujete UI-first prístup

Kedy Flux?

  • Preferujete decentralizovaný model (každý cluster si spravuje sám)
  • Chcete natívnu image automation (auto-update pri novom image)
  • Uprednostňujete Kubernetes-natívny prístup (štandardné RBAC)
  • Máte jednoduchšie prostredie s menším počtom tímov

Best Practices

1. Oddeľte app repo a config repo

Držte aplikačný kód a Kubernetes manifesty v separátnych repozitároch. Zmeny v konfigurácii nepotrebujú rebuild image.

2. Používajte AppProjects

Izolujte tímy a prostredia pomocou AppProjects:

apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
  name: team-frontend
spec:
  sourceRepos:
    - 'https://github.com/org/frontend-*'
  destinations:
    - namespace: 'frontend-*'
      server: '*'
  clusterResourceWhitelist:
    - group: ''
      kind: Namespace

3. Sync Waves a Hooks

Riaďte poradie deploymentu pomocou sync waves:

metadata:
  annotations:
    argocd.argoproj.io/sync-wave: "-1"  # deployne sa pred wave 0

Použite hooks pre migrácie, seeding a cleanup:

metadata:
  annotations:
    argocd.argoproj.io/hook: PreSync
    argocd.argoproj.io/hook-delete-policy: HookSucceeded

4. Health Checks pre custom resources

Definujte custom health checks pre CRDs, ktoré ArgoCD natívne nepozná:

apiVersion: v1
kind: ConfigMap
metadata:
  name: argocd-cm
data:
  resource.customizations.health.databases.example.com_PostgreSQL: |
    hs = {}
    if obj.status ~= nil then
      if obj.status.ready == true then
        hs.status = "Healthy"
      else
        hs.status = "Progressing"
      end
    end
    return hs

5. Notifikácie

Nastavte Argo Notifications pre alerting cez Slack, Teams alebo email:

apiVersion: v1
kind: ConfigMap
metadata:
  name: argocd-notifications-cm
data:
  trigger.on-sync-failed: |
    - when: app.status.sync.status == 'OutOfSync'
      send: [app-sync-failed]
  template.app-sync-failed: |
    message: |
      Application {{.app.metadata.name}} sync failed!

6. Ďalšie odporúčania

  • Zapnite auto-prune v non-prod prostrediach, manuálne prune v produkcii
  • Používajte sealed-secrets alebo external-secrets — nikdy necommitujte plain secrets do Gitu
  • Limitujte blast radius — jedno ApplicationSet per tím/prostredie
  • Monitorujte ArgoCD samotný cez Prometheus metriky (argocd-metrics)
  • Pravidelne upgradujte — ArgoCD má rýchly release cyklus s bezpečnostnými patchmi