Laravel deployments met ArgoCD
Na maanden ontwikkeltijd is je website of applicatie gereed voor een eerste release. Een mooie mijlpaal, maar hoe ga je deze deployen? Als Laravel developer heb je hierin veel keuzes. Als je gebruik maakt van een simpele VPS, log je waarschijnlijk in via SSH en voer je daar de benodigde commando’s uit. Voor een iets robuustere oplossing kijk je misschien naar Envoyer of PHP Deployer, zodat je de het deploymentproces routinematig vast kunt leggen.
Maar wat als je gebruikmaakt van Kubernetes? Handmatig kubectl apply commando’s uitvoeren voor het bijwerken van verschillende deployments wordt al snel rommelig. Helemaal als je meerdere omgevingen hebt die moeten worden bijgewerkt. Als een developer vergeet de bijgewerkte yaml files te pushen gaan er dingen scheef lopen. Het wordt onduidelijk wat precies de gewenste of de werkelijke staat van de Kubernetes deployments is. Daar is een oplossing voor!
GitOps - repositories als bron van waarheid
GitOps is een methodologie, waarbij een git repository dient als enige bron van waarheid voor de staat van jouw applicatie. Je definieert hierin alle services die jouw applicatie nodig heeft, zoals een API, Redis en MySQL. Je definieert tevens welke versies van deze services je wilt gebruiken.
Een apart systeem (Hallo ArgoCD) monitort continu of de staat, zoals die gedefinieerd is in de git repository, overeenkomt met de daadwerkelijke staat van het Kubernetes cluster. Is dat niet zo? Dan zorgt het ervoor dat de staat van het Kubernetes cluster wordt bijgewerkt. Wil je een extra replica van je API of is er een nieuwe versie? Werk één regel bij in de repository en de rest gaat vanzelf.
ArgoCD als dirigent van jouw infrastructuur
Een voorbeeld van zo’n systeem is ArgoCD. Het biedt een duidelijke interface, die zelfs door developers met minder ervaring te begrijpen is. Het kan meerdere applicaties en zelfs meerdere Kubernetes clusters tegelijkertijd monitoren.

Als je al eens met Laravel Cloud gewerkt hebt, dan komt de interface je wellicht enigszins bekend voor. Het is een schematische weergave van alle services en andere processen, zoals een cronjob voor artisan schedule run, die op het cluster draaien.
Deploymentproces
Klinkt goed, maar hoe ziet het proces van een deployment er dan precies uit? Om optimaal gebruik te kunnen maken van ArgoCD is het gebruik van CI/CD pipelines eigenlijk onmisbaar. Als je gebruikmaakt van Kubernetes, dan heb je waarschijnlijk al een pipeline ingericht voor het maken van een Docker-image. Het enige dat dan verandert, is de daadwerkelijke deployment stap in het proces.
Het is raadzaam om de applicatiecode, in een aparte git repository, gescheiden te houden van de infrastructuurcode. Op die manier blijven de verantwoordelijkheden van de verschillende repositories duidelijk en overzichtelijk. Tevens zorg je er zo voor dat je toegang tot de infrastructuurcode beperkt kunt houden tot specifieke personen.
Stap 1: Een nieuwe Docker-image bouwen
Kubernetes maakt gebruik van Docker-images om applicaties te serveren. Is er een nieuwe versie van je applicatie? Dan moet er een nieuwe Docker-image van de applicatie gebouwd worden en naar een zogenaamde Docker registry gepushed worden.
Als je gebruikmaakt van Gitlab, dan kun je gebruikmaken van de registry van Gitlab. Ook Github biedt een registry aan.
Stap 2: De infrastructuur repository bijwerken
Nu we een nieuwe Docker-image hebben van onze applicatie, moeten we de infrastructuurcode bijwerken. We hoeven hiervoor alleen de image van de relevante service bij te werken, zodat deze gebruikmaakt van de laatste versie.

Stap 3: Laat ArgoCD zijn werk doen
Nu de infrastructuur is bijgewerkt, is het tijd voor ArgoCD om zijn magie te laten zien. Standaard kijkt ArgoCD elke 5 minuten of er wijzigingen zijn aan de infrastructuur repositories die het monitort, maar deze instelling kan aangepast worden. Het is tevens mogelijk om ArgoCD synchronisaties op “push”-basis te triggeren.
Zodra ArgoCD de wijzigingen detecteert zal het zijn best gaan doen om het Kubernetes cluster bij te werken naar de gewenste status. Het zal de nieuwe Docker-image uit de registry pullen en een nieuwe container opspinnen in het cluster. Zodra deze klaar is om connecties te ontvangen (Readiness) zal deze de oude container(s) killen. Op deze manier is er vrijwel geen downtime.
Met de Resource Hooks van ArgoCD kun je tevens een aparte job spawnen, bijvoorbeeld voor het runnen van de database migraties.
Rollbacks
Kom je er achter dat er toch een foutje zit in je laatste release? Een rollback uitvoeren is met ArgoCD net zo makkelijk als een nieuwe release. Je hoeft enkel de laatste commit in de infrastructure repository te reverten. Vervolgens ziet ArgoCD weer dat het cluster en de repository niet in sync zijn. Dat is deployen met vertrouwen, want er is dus altijd een gemakkelijke weg terug!
Kustomize
ArgoCD komt out-of-the-box met ondersteuning voor Kustomize. Met Kustomize kun je gemakkelijk verschillende variaties van je infrastructuur configureren. Op je testomgeving heb je bijvoorbeeld minder resources nodig dan op je productieomgeving. Met Kustomize configureer je een basisstaat van je infrastructuur. Met “overlays” kun je verschillende omgevingen configureren. In iedere overlay kun je “patches” definiëren, waarmee je configuraties vanuit de basisstaat overschrijft.

De juiste tool voor de job?
ArgoCD is ontzettend krachtig en biedt ontzettend veel voordelen vergeleken met traditionele deploymentstrategieën. De interface maakt het proces overzichtelijk en transparant, zelfs voor non-developers. Door de scheiding van repositories is het altijd overzichtelijk en duidelijk wat de gewenste en - dankzij ArgoCD - daadwerkelijke staat is van de infrastructuur.
Toch is het niet voor iedereen geschikt. Als je al gebruikmaakt van Kubernetes is de investering niet zo groot. Echter, als je nu gebruikmaakt van een traditionele VPS voor je applicaties dan is de stap waarschijnlijk vrij groot. Kubernetes is ontzettend krachtig en schaalbaar, maar tegelijkertijd ook complex. Er zijn met Kubernetes een stuk meer componenten die kunnen breken en onderhouden moeten worden. Vraag jezelf dus af of die overhead voor jouw klanten de moeite waard is.
Mocht je meer willen weten over ArgoCD? Schroom niet om mij een berichtje te sturen op dennis@dutchlaravelfoundation.nl of, voor onze leden, op ons Slack kanaal!