Jenkins X: Een onvolwassen GitOps gigant

Jenkins X

Bram Verdouw, oktober 2021.


De DevOps-wereld werkt steeds vaker aan tools en frameworks die repetitieve taken eenvoudiger moeten maken. De komst van K8S, Helm, Slack integraties en andere software heeft als effect dat het steeds lastiger is om een goede CI/CD-omgeving op te zetten aangezien je meer tools moet bestuderen. Jenkins X biedt software die het volledige GitOps proces automatiseert waardoor developers hun desired state kunnen bereiken zodat ze minder tijd hoeven te besteden aan het fixen van configuratie-bestanden en het instellen van hun CI/CD-omgeving.

Jenkins X in het kort

Jenkins X is gebaseerd rondom GitOps. Er is een centrale Git repository die de desired state van de K8S cluster bevat. Een K8S operator houdt wijzigingen bij in de repository een voert aan de hand daarvan updates door. Jenkins X biedt de JX-CLI aan waarmee het eenvoudig wordt voor developers om het GitOps-proces te beïnvloeden. De JX-CLI is opgesplitst in verschillende microservices waaronder lighthouse en jenkins-x-builders. (Projects, 2021) De onderstaande afbeelding beschrijft een high-level overview van het GitOps proces van Jenkins X. (What Is Jenkins X?, 2021)

Jenkins X GitOps (Version Stream, 2020)

Jenkins X automatiseert CI/CD voor developers die werken in de cloud. Daardoor wordt werk uit handen genomen en kunnen ze zich focussen op het maken van software. Om pipelines op te zetten, maakt Jenkins X gebruik van Tekton. Daarnaast is het ook mogelijk om te kiezen voor klassiek Jenkins om pipelines mee te maken. Om een chat te koppelen aan de pipeline is er gekozen voor Lighthouse. Lighthouse integreert onder andere met Tekton en klassiek Jenkins.

Jenkins X gebruikt Terraform om de infrastructuur op te zetten. Terraform is een open source tool die het mogelijk maakt via code of een CLI de infrastructuur te configureren. Het voordeel hiervan is dat developers via eenvoudige commando’s een volledige CI/CD infrastructuur om kunnen zetten (What Is Jenkins X?, 2021).

De GitOps-methode van Jenkins X brengt een aantal uitdagingen met zich mee omtrent beveiliging. Bij het ontwikkelen van Jenkins X is gekozen om gebruik te maken van secret solution providers zoals Vault, Google en Azure. Er is ook overwogen om te kiezen voor het opslaan van secrets in Git, maar dat brengt te veel usability issues met zich mee.

Om de K8S omgeving op te zetten wordt Helm gebruikt. Helm is een package manager voor K8S waarmee Helm charts gedeployed kunnen worden. In een Helm chart wordt per applicatie gedefinieerd welke resources nodig zijn. Hierdoor wordt het mogelijk om met een aantal kleine bestanden een complexe en volledig geconfigureerde K8S cluster op te zetten (Merron & Idowu, z.d.).

Jenkins X bevat veel functionaliteiten ten opzichte van vergelijkbare open source projecten. De onderstaande afbeelding bevat een overzicht van punten waarin Jenkins X uitblinkt ten opzichte van de concurrentie.

Jenkins X GitOps (Portela, z.d.)

Jenkins X Architectuur

De onderstaande afbeelding bevat de architectuur van Jenkins X. In dit artikel worden alle onderdelen die te zien zijn in de afbeelding kort behandeld.

Architectuur Jenkins X (Jenkins X, z.d.)

De architectuur van Jenkins X bestaat uit vier onderdelen: developer experience, CI/CD service, decoupling en platform. Aangezien Jenkins X geen cloud diensten aanbiedt, is er gekozen om integraties met AWS, GCP en Azure te ondersteunen. De conclusie die daaruit kan worden getrokken is dat het doel van Jenkins X met name draait om het aanbieden van een geconfigureerde GitOps-omgeving die integreert met de meest populaire cloud providers. (Jenkins X, z.d.)

Zoals benoemd in het voorgaande hoofdstuk is er een JX-CLI. Hiermee kunnen commando’s worden uitgevoerd op de CI/CD-omgeving zodat de desired state bereikt kan worden. Daarnaast zijn er meerdere dashboards beschikbaar zodat beheerders en developers niet verplicht zijn gebruik te maken van een CLI. De UI bevat echter minder functionaliteiten dan de CLI. (?? z.d.)

Tekton is een open source framework waarmee CI/CD pipelines kunnen worden opgezet. (Tekton, z.d.) Lighthouse kan worden gebruikt voor chat integraties zoals Slack. (z.d.-b) Kuberhealty wordt gebruikt om ervoor te zorgen dat de cluster beschikbaar blijft.

Het onderdeel ‘decoupling’ slaat een brug tussen Jenkins X en de cloud providers. Jenkins X heeft besloten geen hosting service aan te bieden. In plaats daarvan maken ze het mogelijk om de desired state direct in de productie-omgeving te krijgen bij externe cloud providers. Om dit doel te bereiken wordt Terraform gebruikt. Terraform is een open source tool waarmee infrastructuur declaratief via code kan worden opgezet. Daarnaast bieden ze een api aan waarmee de infrastructuur kan worden beheerd (Terraform, z.d.).

K8S external secrets wordt gebruikt om secrets toe te voegen aan Azure Vault of bijvoorbeeld AWS Secret Manager. (z.d.-a)

Hands on in Azure

In dit artikel wordt stap voor stap beschreven hoe een Jenkins X omgeving kan worden opgezet in Azure. Daarnaast worden er korte voorbeelden gegeven over de manier waarop Jenkins X kan worden gebruikt om een desired state te bereiken. Deze instructies zijn specifiek gericht op Windows-gebruikers. Voor MacOS en Linux -gebruikers zullen de meeste stappen overeenkomen met een aantal uitzonderingen zoals het installeren van een CLI.

Om de vereiste tools te installeren, wordt in deze handleiding gebruik gemaakt van 'chocolatey'. Mocht dit nog niet geinstalleerd zijn, open dan powershell met administratieve rechten en voer het onderstaande commando uit.

Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))

Zodra chocolatey geinstalleerd is, herstart powershell met administratieve rechten. Voer vervolgens stuk voor stuk de onderstaande commando's uit. Deze commando's installeren de CLI's die gebruikt gaan worden in deze handleiding.

choco install azure-cli
choco install terraform
choco install jenkins-x

Vanwege chatops-gerelateerde redenen is het handig om een GitHub organisatie te maken. Daarnaast geeft dit structuur aan de projecten die bij de Jenkins X omgeving horen. Alle projecten die worden aangemaakt binnen Jenkins X, worden toegevoegd aan de GitHub organisatie. Als voorbeeld is er gekozen voor de naam 'The Amazing Lantern'. Geef de organisatie een passende naam, voer de rest van het formulier in en maak de organisatie aan. De organisatie kan worden aangemaakt via deze url: https://github.com/account/organizations/new?coupon=&plan=team_free

GitHub organisatie aanmaken

Nu er een GitHub organisatie is aangemaakt, is er een token nodig waarmee handelingen verricht kunnen worden op de repositories om op deze manier een desired state te bereiken. Om dit token aan te maken, gebruik deze voorafingestelde URL: https://github.com/settings/tokens/new?scopes=repo,read:user,read:org,user:email,write:repo_hook,delete_repo,admin:repo_hook

Er zijn twee repositories die toegevoegd moeten worden aan de organisatie. Een repository bevat de configuratie voor de infrastructuur en een repository voor de cluster. Zorg er tijdens het aanmaken voor dat de organisatie als 'eigenaar' wordt opgegeven.

  • Infrastructuur: https://github.com/jx3-gitops-repositories/jx3-terraform-azure/generate
  • Cluster: https://github.com/jx3-gitops-repositories/jx3-azure-akv/generate

Alle applicaties moeten in Azure onder een bepaalde 'resource group' vallen. Daarom wordt een resource group handmatig aangemaakt in Azure voordat de applicaties die daaronder vallen kunnen worden gegenereerd. In dit voorbeeld wordt de naam 'jx-resource' gebruikt. Kies voor een passende naam en raak deze naam niet kwijt, hij is in de volgende stap nodig om de infrastructuur te configureren. Het aanmaken van de resource group kan gedaan worden via deze URL: https://portal.azure.com/#create/Microsoft.ResourceGroup

Resource group

Open de repository die de infrastructuur bevat in een code editor. Voeg het bestand values.auto.tfvars toe in root level. Dit bestand bevat instellingen die nodig zijn om handelingen te verrichten op de cluster. Voeg de onderstaande instellingen toe aan dit bestand. Zorg ervoor dat de waardes kloppen.

jx_git_url = "https://github.com/myowner/myname-cluster"
jx_bot_username = "bot_user"

Open nu het bestand variables.tf. Zoek naar 'apex_resource_group_name' en pas de waarde van 'default' aan naar de resource die zojuist is aangemaakt in Azure.

variable "apex_resource_group_name" {
  type        = string
  description = "The resource group in which the Azure DNS apex domain resides. Required if apex_domain_integration_enabled is true"
  default     = "NAAM_VAN_DE_RESOURCE"
}

Push de wijzigingen naar de repository.

git add . && git commit -a -m "fix: configure cluster repository and project" && git push

Voer de onderstaande commando's achter elkaar uit om de omgeving op te zetten. Hierbij wordt een aantal keer om het token gevraagd dat aangemaakt is in een van de voorgaande stappen. De omgeving wordt gehost op Azure wat betekent dat alle benodigde onderdelen zoals een K8S cluster, deployments, pods, secrets, etc automatisch worden aangemaakt. Deze zijn later in te zien via het dashboard van Azure. Het kost even tijd voordat alle resource zijn opgestart.

terraform init
terraform plan
terraform apply

Zodra alles is opgestart, voer terraform output connect om verbinding te maken met de infrastructuur. Vervolgens kan terraform output follow_install_logs worden gebruikt om te controleren of het opzetten van de infrastructuur goed verloopt. De JX-CLI kan worden gekoppeld aan de omgeving met het command jx ns jx. Projecten kunnen nu worden aangemaakt met jx project. Mocht de omgeving niet meer nodig zijn, dan kan deze worden verwijderd met terraform destroy. Daarnaast kan jx dashboard worden gebruikt om de pipelines in te zien en jx ui kan worden gebruikt om de K8S cluster te monitoren.

De volledige Jenkins X omgeving is opgezet en kan worden gebruikt om een desired state te bereiken. Een voorbeeld van het gebruik van Jenkins X is terug te vinden in de organisatie genaamd 'The Amazing Lantern'. Deze organisatie is publiek toegankelijk en kan worden gebruikt als referentie om aan de slag te gaan met Jenkins X.

Conclusie

Met het doel om een volledig GitOps proces op te zetten aan de hand van configuratiebestanden heeft Jenkins X de lat voor zichzelf hoog gelegd. Jenkins X maakt gebruik van ontelbare tools en onderhoud een gigantisch aantal applicaties binnen het zelf opgezette ecosysteem. Een beroemd citaat zegt "if you are trying to do everything all at the same time, you are setting yourself up for failure". Dit is exact wat er op dit moment aan de hand is met Jenkins X. Er is veel tijd nodig geweest om de handleiding in dit onderzoek op te stellen omdat essentiele punten genegeerd worden in de documentatie van Jenkins X. Zo wordt er bijvoorbeeld niets gezegd over het aanmaken van een resource in de 'Azure Terraform Quickstart template'. Daarnaast worden Windows gebruikers genegeerd door de meeste documentatie te richten op MacOS en Linux gebruikers en software zoals 'kpt' te gebruiken terwijl deze 'niet beschikbaar is in Windows'.

Om effectief gebruik te kunnen maken van Jenkins X is uitgebreide kennis van tooling zoals onder andere Terraform, Helm en K8S vereist. Jenkins X claimt "CI en CD voor developers in de cloud te automatiseren, zodat ze zich kunnen focussen op het maken van geweldige software". Deze uitspraak zou opgaan als een Jenkins omgeving 'met een druk op de knop' opgezet kon worden. Helaas is dit niet het geval.

De hoeveelheid kennis die nodig is om te kunnen werken met Jenkins X kan op dit moment beter worden besteed aan het zelf opzetten van een GitOps infrastructuur. Naar aanleiding van dit onderzoek kan het advies gegeven worden om te wachten met het in gebruik nemen van Jenkins X totdat het project een staat van volwassenheid heeft bereikt.

Bronnen

Last change: 2025-01-13