Argo CD en GitOps

GitOps met Argo CD: elke wijziging in je cluster staat eerst in Git

Met Argo CD is Git de bron van waarheid voor wat er in je cluster draait. Geen kubectl apply vanaf een laptop, geen deployscript dat alleen op één machine werkt. Een merge is een deploy, een revert is een rollback, en de geschiedenis van je platform staat in de commitlog. Het vaste team richt Argo CD in voor Magento- en Laravel-platformen en draait het daarna mee.

  • Database-migraties als PreSync-hook, vóór de nieuwe pods starten
  • Eén ApplicationSet voor alle omgevingen, klanten of shops
  • Drift zichtbaar en automatisch hersteld, met SSO en RBAC per team

Wat is GitOps, en wat doet Argo CD precies?

GitOps is een werkwijze waarbij de gewenste toestand van je infrastructuur en applicaties in Git staat. Een controller in het cluster vergelijkt die gewenste toestand continu met wat er werkelijk draait, en trekt het gelijk. Je pusht dus niet naar het cluster. Het cluster haalt op uit Git.

Argo CD is die controller. Het is een CNCF graduated project uit het Argo-ecosysteem, naast Argo Rollouts, Argo Workflows en Argo Events. Argo CD leest Helm-charts, Kustomize-overlays of platte YAML uit een repository, rendert de manifests en past ze toe. Daarna blijft het kijken. Wijkt het cluster af van Git, dan zie je dat direct als OutOfSync in de UI of via een melding in Slack of Teams.

Wat dit oplevert is niet een mooier dashboard. Het levert een audit trail op: wie heeft wat wanneer veranderd, en waarom. Het levert reproduceerbaarheid op: een nieuw cluster opbouwen is Argo CD installeren en naar dezelfde repository wijzen. En het haalt clustertoegang weg bij CI-pipelines, wat securitytechnisch een grote stap is. De pipeline bouwt een image en past een tag aan in Git. Meer niet.

Push-deploys versus GitOps met Argo CD

Het verschil zit niet in de tooling maar in wie toegang heeft tot het cluster, en wat er gebeurt als iemand iets handmatig wijzigt.

OnderwerpPush vanuit CI (kubectl of helm upgrade)GitOps met Argo CD
ClustertoegangDe CI-runner heeft schrijfrechten op productieAlleen Argo CD in het cluster heeft schrijfrechten; CI schrijft naar Git
Handmatige wijziging op het clusterBlijft onopgemerkt tot de volgende deployZichtbaar als drift, optioneel direct teruggezet met selfHeal
Wat draait er nu?Uitzoeken in de pipeline-logsDe commit in Git, zichtbaar per Application in de UI
RollbackEen oude pipeline opnieuw draaien en hopen dat die nog werktGit revert van de tag-wijziging, of een rollback naar een eerdere sync
Nieuw cluster opbouwenAlle pipelines opnieuw tegen het nieuwe cluster draaienArgo CD installeren en naar dezelfde repository wijzen
Meerdere clustersCredentials voor elk cluster in CIEén Argo CD beheert meerdere clusters, of één Argo CD per cluster

Plan een vrijblijvend gesprek over je project

Een half uur via video met de mensen die het werk ook echt doen. Kies hieronder een moment dat jou past.

  • Direct met het vaste team, geen tussenlagen
  • Concrete feedback op je huidige situatie of plannen
  • Eerlijk advies, ook als het antwoord "niet doen" is
  • Indicatie van kosten en tijdlijn
Liever bellen? 0591-239 299
Beschikbaar deze week

Plan een gratis Tech Check

Vrijblijvend jouw uitdagingen bespreken

Of bel direct: 0591-239 299

Repository-indeling: app-code en deploy-config gescheiden

De eerste beslissing is waar de Kubernetes-configuratie staat. Wij houden die bijna altijd in een aparte deploy-repository, los van de applicatiecode. De Magento- of Laravel-repository bouwt een image. De deploy-repository beschrijft welk image waar draait, met welke values en welke resources.

Een aparte repository geeft je een schone geschiedenis van alleen deploys, en je kunt er strengere review-regels op zetten. Wie code mag mergen, bepaalt niet automatisch wat er op productie draait.

Binnen de deploy-repository staan een map met de gedeelde Helm-chart of Kustomize-base, een map per omgeving met values of overlays, en een map met de Argo CD-objecten: AppProjects, Applications en ApplicationSets. Die worden zelf ook door Argo CD beheerd, via het app-of-apps-patroon.

Het image in elke omgeving staat vast op een unieke tag of digest, gekoppeld aan een commit. Nooit latest. Een tag die stilletjes naar een ander image wijst, maakt GitOps zinloos.

Applications en ApplicationSets: één definitie, veel omgevingen

Een Application koppelt één bron in Git aan één doel in een cluster. Een ApplicationSet genereert Applications uit een lijst, een map of een cluster-inventaris. Daarmee schaal je van één shop naar twintig zonder twintig keer hetzelfde te schrijven.

Sync waves en hooks: migraties in de juiste volgorde

Een deploy is meer dan nieuwe pods starten. Bij Magento moet bin/magento setup:upgrade draaien als er nieuwe modules of schemawijzigingen zijn. Bij Laravel moet php artisan migrate --force draaien voordat de nieuwe code de nieuwe kolommen verwacht. De volgorde doet ertoe, en Argo CD geeft je daar twee instrumenten voor: hooks en sync waves.

Hooks bepalen in welke fase een resource wordt toegepast. Met de annotatie argocd.argoproj.io/hook: PreSync draait een Job vóór de rest van de sync. PostSync draait nadat alle resources gezond zijn, bijvoorbeeld voor een cache-warmup of een smoke test. SyncFail draait als de sync mislukt, bijvoorbeeld om een melding te sturen of maintenance mode weer uit te zetten. Met argocd.argoproj.io/hook-delete-policy: BeforeHookCreation ruimt Argo CD de vorige Job op voordat de nieuwe start, zodat je niet tegen een bestaande Job met dezelfde naam aanloopt.

Sync waves bepalen de volgorde binnen een fase. De annotatie argocd.argoproj.io/sync-wave krijgt een getal; lagere waves gaan eerst, en de standaard is 0. Argo CD wacht tot alle resources in een wave gezond zijn voordat de volgende begint. Zo zet je ConfigMaps en ExternalSecrets in wave -1, de migratie-Job als PreSync-hook, de web-Deployment in wave 0 en de queue-workers in wave 1. Workers starten dan pas als de webpods met de nieuwe code gezond zijn.

Bij Magento is er een extra vraag: wat doen de oude pods terwijl setup:upgrade loopt? Die draaien nog oude code tegen een database die op dat moment verandert. Voor kleine releases zonder schemawijziging is dat geen probleem, en kun je de upgrade overslaan als bin/magento setup:db:status meldt dat alles actueel is. Voor releases met schemawijzigingen kiezen we per release: een kort onderhoudsvenster met maintenance mode via een PreSync- en PostSync-hook, of wijzigingen in twee stappen uitrollen zodat oude en nieuwe code allebei met het schema overweg kunnen. Dat laatste is meer werk, maar de shop blijft open.

Bij Laravel ligt het eenvoudiger, mits migraties backward compatible zijn. Een kolom toevoegen kan in dezelfde release. Een kolom hernoemen of verwijderen splitsen we over twee releases. De uitwerking met complete YAML staat in ons artikel over Argo CD sync waves voor migraties.

Drift, selfHeal en wat je Argo CD juist moet laten negeren

Drift is elk verschil tussen Git en het cluster. Sommige drift wil je terugdraaien, andere drift is precies de bedoeling.

Automatisch terugzetten

  • syncPolicy.automated met selfHeal: handmatige wijzigingen via kubectl edit worden binnen korte tijd teruggezet naar de toestand in Git
  • prune: resources die uit Git verdwijnen, verdwijnen ook uit het cluster; zet dit pas aan als de repository compleet is
  • PruneLast=true als sync option, zodat oude resources pas worden opgeruimd als de nieuwe gezond zijn
  • Voor productie overwegen we per situatie automated sync met een handmatige merge als poort, of handmatig syncen na review

Bewust negeren

  • spec.replicas van Deployments die door HPA of KEDA worden geschaald: laat replicas weg uit de manifests of zet ze in ignoreDifferences
  • Velden die door controllers of webhooks worden ingevuld, zoals caBundle in webhook-configuraties
  • Secrets die door External Secrets Operator worden aangemaakt: Argo CD beheert de ExternalSecret, niet de Secret zelf
  • RespectIgnoreDifferences=true, zodat genegeerde velden ook tijdens een sync niet worden overschreven

Zichtbaar maken

  • Argo CD Notifications naar Slack, Teams of e-mail bij OutOfSync, mislukte syncs en degraded health
  • Argo CD-metrics in Prometheus, met een alert als een Application langer dan een afgesproken tijd OutOfSync is
  • Custom health checks voor resources die Argo CD niet standaard begrijpt

Rollbacks: Git revert als standaard, de knop als noodrem

Argo CD heeft een rollback-functie die een Application terugzet naar een eerdere sync. Die werkt alleen als automated sync uit staat, anders zou Argo CD direct weer naar de laatste commit syncen. Daarom is in een volwassen GitOps-opzet de rollback een Git revert. De revert staat in de historie, met een naam en een reden.

Een rollback van code is niet automatisch een rollback van de database. Heeft de PreSync-hook een migratie uitgevoerd, dan draait de oude code daarna tegen het nieuwe schema. Bij Laravel werkt dat als migraties additief zijn. Bij Magento is terugrollen na een setup:upgrade met schemawijzigingen niet altijd veilig, omdat Magento de moduleversies in de database vergelijkt met de code. Daarom maken we voor zulke releases een databasesnapshot bij de provider als eerste PreSync-stap, en leggen we per release vast of een code-rollback zonder database-restore kan.

Voor echte risicoreductie werkt een rollback na het feit minder goed dan een release die zichzelf afbreekt. Daar komt Argo Rollouts in beeld.

Argo Rollouts: canary en blue-green bovenop Argo CD

Argo CD bepaalt wat er draait. Argo Rollouts bepaalt hoe een nieuwe versie live gaat. Een Rollout-resource vervangt de Deployment en voegt strategieën toe die Kubernetes zelf niet heeft: canary met stappen en blue-green met een preview-service.

Een canary-strategie ziet er in de praktijk zo uit: setWeight 10, pause van vijf minuten, setWeight 50, nog een pause, en dan volledig. Tussen de stappen draait een AnalysisTemplate die bijvoorbeeld in Prometheus het percentage 5xx-responses of de p95-responstijd van de nieuwe versie opvraagt. Gaat dat over een drempel die je vooraf vastlegt, dan breekt Rollouts de release af en gaat al het verkeer terug naar de stabiele versie. Zonder dat iemand wakker hoeft te worden.

Voor precieze verkeersverdeling heeft Rollouts een traffic router nodig. Zonder router verdeelt het verkeer via het aantal pods, wat grof is. Met de Gateway API-plugin, Istio, Traefik of een andere ondersteunde router stuur je een exact percentage door. Let op: veel oudere voorbeelden gebruiken ingress-nginx, en dat project is door de Kubernetes-community met pensioen gestuurd. Sinds maart 2026 krijgt het geen updates meer. Voor nieuwe opzetten kiezen we de Gateway API, zie de pagina over ingress en Gateway API.

Argo CD begrijpt Rollout-resources. Je ziet in de UI welke stap een canary is, en je kunt een gepauzeerde Rollout vanuit Argo CD hervatten of afbreken. Voor Magento gebruiken we canary vooral voor de webpods, niet voor cron en consumers. Twee versies van een consumer naast elkaar die dezelfde wachtrij verwerken, is zelden wat je wilt. De uitwerking staat in ons artikel over canary-deploys met Argo Rollouts.

Argo CD Image Updater: automatisch nieuwe tags, met grenzen

In de standaardopzet past de CI-pipeline na een geslaagde build de imagetag aan in de deploy-repository. Argo CD Image Updater draait het om: een controller in het cluster kijkt in de registry naar nieuwe tags en werkt de Application bij. Sinds versie 1.0 configureer je dat met een ImageUpdater custom resource in plaats van annotaties op de Application.

Je kiest per image een strategie, zoals semver binnen een bereik of de nieuwste build, en een write-back-methode. Met write-back naar Git maakt de Image Updater zelf een commit, zodat Git de bron van waarheid blijft. Met de methode die alleen een parameter-override in Argo CD zet, is dat niet zo, en dat vinden we voor productie te zwak.

Wij zetten het in voor test- en preview-omgevingen. Productie promoveren we bewust met een pull request, zodat in Git ook staat wie het heeft goedgekeurd.

RBAC, SSO en secrets: wie mag wat in Argo CD

Argo CD heeft een eigen gebruikersmodel, maar lokale accounts gebruiken we alleen voor de eerste installatie. Daarna koppelen we SSO via OIDC, rechtstreeks met bijvoorbeeld Microsoft Entra ID, Google Workspace of GitHub, of via de meegeleverde Dex. Groepen uit je identity provider vertalen we in argocd-rbac-cm naar rollen: wie mag alleen kijken, wie mag syncen, wie mag een Application verwijderen.

Sinds Argo CD 3.0 erven update- en delete-rechten op een Application niet meer automatisch door naar de resources eronder. Dat is strenger en beter: iemand die een Application mag bijwerken, mag niet vanzelf een pod verwijderen. Ook pod-logs vragen sinds 3.0 een expliciet logs-recht. Wie van 2.x upgradet, moet de RBAC-policy daarop nalopen. Hetzelfde geldt voor de standaard resource tracking, die in 3.0 van labels naar annotaties ging.

Secrets horen niet in Git, ook niet versleuteld als het niet hoeft. Wij gebruiken External Secrets Operator: in Git staat een ExternalSecret die verwijst naar een sleutel in AWS Secrets Manager, Google Secret Manager, Azure Key Vault, Vault of een EU-alternatief. De operator maakt in het cluster de Kubernetes Secret aan. Argo CD ziet alleen de verwijzing. Dat sluit aan bij het advies in de documentatie van Argo CD zelf om secrets in het doelcluster op te lossen en niet tijdens het renderen van manifests.

Wanneer Argo CD niet nodig is

Argo CD is een extra component die je moet upgraden, monitoren en beveiligen. Het heeft een eigen Redis, een repo-server die charts rendert, een applicatie-controller en een API-server met UI. Voor één Laravel-app op één cluster met één omgeving is een nette pipeline met helm upgrade --install en een goed afgeschermd service account vaak genoeg.

Argo CD loont zodra er meer dan één van iets is: meerdere omgevingen, meerdere shops, meerdere clusters of meerdere teams. Of als je moet kunnen aantonen wat er wanneer is uitgerold, bijvoorbeeld voor een audit. En draait je shop gewoon goed op managed hosting zoals Hypernode, dan heb je geen Kubernetes nodig en dus ook geen Argo CD. Ook dat zeggen we.

Zo richten we Argo CD in

Van eerste inventarisatie tot een platform waar elke wijziging via Git loopt. Uitgevoerd door het vaste team dat het daarna ook beheert.

  1. 1

    Inventarisatie

    Welke apps, omgevingen en clusters zijn er, hoe wordt nu gedeployd, en welke handmatige stappen zitten in het proces. Uitkomst: een repository-indeling en een migratievolgorde.

  2. 2

    Argo CD installeren

    Via de officiële Helm-chart, in hoge beschikbaarheid waar dat nodig is, met SSO, RBAC en AppProjects. Argo CD beheert daarna zijn eigen configuratie.

  3. 3

    Charts en overlays opzetten

    Helm-chart of Kustomize-base voor Magento of Laravel, met values per omgeving. Bestaande manifests nemen we over en schonen we op.

  4. 4

    Migraties en volgorde

    PreSync-hooks voor setup:upgrade of artisan migrate, sync waves voor config, web en workers, en een expliciete keuze voor onderhoudsvenster of tweestaps-releases.

  5. 5

    CI aansluiten

    De pipeline bouwt en scant het image en past de tag aan in de deploy-repository. Clustercredentials verdwijnen uit CI.

  6. 6

    Progressive delivery en meldingen

    Argo Rollouts voor de webpods waar dat loont, Notifications naar je kanaal, en alerts op drift en mislukte syncs in Prometheus.

Wat je opgeleverd krijgt

  • Deploy-repository met vaste structuur voor charts, omgevingen en Argo CD-objecten
  • Argo CD-installatie met SSO, RBAC per groep en AppProjects per team of klant
  • ApplicationSets voor omgevingen, shops of tenants, en voor platformcomponenten per cluster
  • PreSync- en PostSync-hooks voor migraties, maintenance mode en smoke tests
  • Sync waves voor configuratie, web, workers en cron
  • Drift-beleid met selfHeal, prune en ignoreDifferences voor geschaalde workloads
  • Optioneel Argo Rollouts met canary-stappen en analyse op Prometheus-metrics
  • Runbook voor releases, rollbacks en het herstellen van een cluster vanuit Git

Waarom Coding.nl voor Argo CD en GitOps

We kennen wat erin draait

Argo CD inrichten kan iedereen. Weten wanneer setup:upgrade een onderhoudsvenster nodig heeft, vraagt kennis van Magento. Die hebben we, net als van Laravel.

Geen tussenlagen

Je spreekt met de mensen die je deploy-flow bouwen en die bij een mislukte sync ook kijken. Geen projectmanager die vragen doorgeeft.

Meten na de release

Als RUMvision Gold Partner kijken we na een release niet alleen naar groene vinkjes in Argo CD, maar ook naar laadtijd en Core Web Vitals van echte bezoekers.

Eerlijk over de noodzaak

Is Kubernetes voor jouw shop niet nodig, dan zeggen we dat. Als Hypernode Silver Partner weten we goed wanneer managed hosting de betere keuze is.

Hyvä Silver PartnerHypernode Silver Partner

Veelgestelde vragen

Argo CD is een open source GitOps-controller voor Kubernetes en een CNCF graduated project. Het leest de gewenste toestand van je applicaties uit Git, in de vorm van Helm-charts, Kustomize of YAML, en zorgt dat het cluster daarmee overeenkomt. Afwijkingen zie je als OutOfSync en kunnen automatisch worden teruggezet.

Deploys die je kunt teruglezen, en terugdraaien?

Plan een gesprek over je huidige deploy-flow. We kijken waar handmatige stappen, clustertoegang vanuit CI en migratierisico's zitten, en vertellen eerlijk of Argo CD voor jouw platform loont.