docs: improve markdown formatting and readability

This commit is contained in:
Paul Harkink 2026-02-28 22:42:09 +01:00
parent cc0d36bae6
commit fc0eb1b0c4
8 changed files with 157 additions and 84 deletions

View file

@ -10,7 +10,7 @@ lokaal op een single-node k3s cluster in een VM.
Je hebt drie dingen nodig op je laptop. Installeer ze de dag van tevoren — niet op de dag zelf.
| Tool | Download |
|----------------|---------------------------------------------------------------------|
|----------------|-----------------------------------------------------------------------------------------------------------|
| VirtualBox 7.x | https://www.virtualbox.org/wiki/Downloads — op Windows: reboot alleen als installer/Windows daarom vraagt |
| Vagrant 2.4.x | https://developer.hashicorp.com/vagrant/downloads |
| Git | https://git-scm.com/downloads |
@ -31,36 +31,50 @@ Als één van de drie niets teruggeeft: installeren en opnieuw proberen.
kun je zelf pushen zonder dat je toegang nodig hebt tot de originele repo.
1. Clone je fork op je host-machine.
```bash
git clone https://github.com/JOUW_USERNAME/ops-demo.git && cd ops-demo
```
2. Start de VM.
```bash
vagrant up
```
3. Run bootstrap vanaf je host (script voert bootstrap in de VM uit).
```bash
./scripts/host/bootstrap-from-host.sh
```
```powershell
./scripts/host/bootstrap-from-host.ps1
```
4. Open ArgoCD UI via tunnel.
```bash
./scripts/host/argocd-ui-tunnel.sh
```
```powershell
./scripts/host/argocd-ui-tunnel.ps1
```
5. Open in je browser:
```text
http://localhost:8080
```
Volg daarna de oefeningen in volgorde. Zie [docs/vm-setup.md](docs/vm-setup.md) als er iets misgaat bij de VM.
Deze quickstart voert bootstrap al uit. In Oefening 01 kun je dan direct door naar verificatie en commit/push van `apps/root.yaml`.
Deze quickstart voert bootstrap al uit.
In Oefening 01 kun je dan direct door naar verificatie en commit/push van
`apps/root.yaml`.
Belangrijk:
- Je hoeft het VM-IP niet te weten om in te loggen of te tunnelen; gebruik `vagrant ssh`.
- Je hoeft de repo niet opnieuw in de VM te clonen: Vagrant mount je host-repo automatisch als `/vagrant`.
@ -114,7 +128,7 @@ naar jouw eigen branch om precies te zien wat er mist.
## Troubleshooting
| Probleem | Oplossing |
|----------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|----------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `A VirtualBox machine with the name 'ops-demo' already exists` | Je hebt waarschijnlijk twee repo-kopieen met dezelfde VM-naam. Check `vagrant global-status --prune`. Stop of destroy de andere omgeving, of geef een unieke VM-naam in een van de `Vagrantfile`s. |
| `vagrant up` faalt terwijl `vagrant status` zegt `poweroff` | Je zit mogelijk in een andere repo-map dan de VM die nu draait. Controleer de `directory` kolom in `vagrant global-status --prune`. |
| Ik weet het ArgoCD admin-wachtwoord niet (meer) | Lees het opnieuw uit: `vagrant ssh -c "export KUBECONFIG=/home/vagrant/.kube/config; kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath='{.data.password}' \| base64 -d"` |
@ -126,6 +140,7 @@ naar jouw eigen branch om precies te zien wat er mist.
| MetalLB/Ingress hostnames werken niet | Wacht tot networking apps `Healthy` zijn in ArgoCD en controleer of het host-only netwerk `192.168.56.x` actief is. |
Handige debug-commando's:
```bash
vagrant global-status --prune
vagrant status

View file

@ -31,7 +31,8 @@ kubectl get nodes
### 1. Startpunt kiezen
Als je de quickstart uit `README.md` al hebt gedaan (`./scripts/host/bootstrap-from-host.sh`), dan is bootstrap al uitgevoerd.
Als je de quickstart uit `README.md` al hebt gedaan
(`./scripts/host/bootstrap-from-host.sh`), dan is bootstrap al uitgevoerd.
Ga in dat geval direct naar stap 3.
Wil je vanaf een blanke VM starten, voer dan bootstrap handmatig uit in de VM:
@ -41,6 +42,7 @@ Wil je vanaf een blanke VM starten, voer dan bootstrap handmatig uit in de VM:
```
Het script doet het volgende:
1. Detecteert de URL van jouw fork op basis van `git remote`
2. Maakt de `argocd` namespace aan
3. Installeert ArgoCD via Helm
@ -72,6 +74,7 @@ Daarom moet je in deze stap expliciet je repo toevoegen, anders blijft `root` op
Kies een van deze twee paden:
**Pad A — via ArgoCD UI**
- Ga naar **Settings → Repositories → Connect Repo**
- Vul je repo-URL in
- Auth type: username + password (bij HTTPS)
@ -80,6 +83,7 @@ Kies een van deze twee paden:
- Project: `workshop`
**Pad B — via Kubernetes Secret (zonder UI)**
- Maak een Secret in namespace `argocd`
- Label op die Secret: `argocd.argoproj.io/secret-type=repository`
- Secret-data met minimaal:
@ -90,6 +94,7 @@ Kies een van deze twee paden:
- `project: workshop`
`<jouw-repo-url>` kan technisch HTTPS of SSH zijn, maar:
- Gebruik je een **GitHub PAT** (fine-grained of classic), dan gebruik je een **HTTPS repo-URL**:
- `https://github.com/<user>/<repo>.git`
- Gebruik je een **SSH repo-URL**:
@ -97,9 +102,11 @@ Kies een van deze twee paden:
- dan authenticate je met een SSH key (niet met PAT).
#### Token/credentials kiezen
Gebruik credentials die read-toegang geven tot je Git-repo.
Als je **GitHub** gebruikt:
1. Ga naar **Settings → Developer settings → [Personal access tokens](https://github.com/settings/tokens)**
2. Maak bij voorkeur een **fine-grained token**
3. Geef de token toegang tot jouw workshop-repo
@ -110,12 +117,14 @@ Dit is voldoende voor ArgoCD sync (read-only).
Gebruik je later Tekton om te pushen, dan heb je `Contents: Read and write` nodig.
Bij HTTPS + PAT geldt:
- `username` = je accountnaam op je Git-provider (bij GitHub: je GitHub username, niet je e-mailadres)
- `password` = de PAT zelf
Een classic token kan ook, met scope `repo`, maar fine-grained heeft de voorkeur.
#### Wat is “Project” in ArgoCD?
Een ArgoCD Project (AppProject) bepaalt welke repos en destinations een set Applications mag gebruiken.
In deze workshop is dat project `workshop` (zie `apps/project.yaml`).
@ -126,7 +135,8 @@ Gebruik hier dus `workshop` als projectwaarde.
### 4. root.yaml committen en pushen
Het bootstrap-script heeft `apps/root.yaml` aangemaakt met jouw fork-URL. Dit bestand moet in je repo staan zodat ArgoCD het kan synchroniseren:
Het bootstrap-script heeft `apps/root.yaml` aangemaakt met jouw fork-URL.
Dit bestand moet in je repo staan zodat ArgoCD het kan synchroniseren:
```bash
git add apps/root.yaml
@ -187,7 +197,8 @@ spec:
- ServerSideApply=true
```
Vervang `JOUW_FORK_URL` door jouw fork-URL (staat ook in `apps/root.yaml`). Commit en push — ArgoCD beheert zichzelf vanaf nu via Git.
Vervang `JOUW_FORK_URL` door jouw fork-URL (staat ook in `apps/root.yaml`).
Commit en push: ArgoCD beheert zichzelf vanaf nu via Git.
---

View file

@ -21,7 +21,10 @@ Oefening 01 afgerond. ArgoCD draait en de root app is Synced.
## Achtergrond: wat is podinfo?
podinfo is een kleine Go-webapp van Stefan Prodan (ook de maker van Flux). Hij wordt veel gebruikt in Kubernetes-demo's: toont zijn eigen versienummer, heeft `/healthz` en `/readyz` endpoints, en ziet er prima uit in een browser. Geen externe dependencies, geen secrets nodig.
podinfo is een kleine Go-webapp van Stefan Prodan (ook de maker van Flux).
Hij wordt veel gebruikt in Kubernetes-demo's: toont zijn eigen versienummer,
heeft `/healthz` en `/readyz` endpoints, en ziet er prima uit in een browser.
Geen externe dependencies, geen secrets nodig.
---
@ -32,6 +35,7 @@ podinfo is een kleine Go-webapp van Stefan Prodan (ook de maker van Flux). Hij w
Maak de volgende bestanden aan:
**`manifests/apps/podinfo/namespace.yaml`**
```yaml
apiVersion: v1
kind: Namespace
@ -40,6 +44,7 @@ metadata:
```
**`manifests/apps/podinfo/deployment.yaml`**
```yaml
apiVersion: apps/v1
kind: Deployment
@ -78,6 +83,7 @@ spec:
```
**`manifests/apps/podinfo/service.yaml`**
```yaml
apiVersion: v1
kind: Service
@ -98,6 +104,7 @@ spec:
### 2. De ArgoCD Application aanmaken
**`apps/apps/podinfo.yaml`**
```yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
@ -137,7 +144,8 @@ git push
Dit is de enige actie die nodig is om de applicatie te deployen.
> **Het GitOps-punt**: je hebt geen `kubectl apply` uitgevoerd voor podinfo. Je hebt een bestand gecommit, en ArgoCD regelt de rest.
> **Het GitOps-punt**: je hebt geen `kubectl apply` uitgevoerd voor podinfo.
> Je hebt een bestand gecommit, en ArgoCD regelt de rest.
---
@ -179,10 +187,13 @@ Versie `6.6.2` — dat klopt met de image-tag in `deployment.yaml`.
Pas de UI-kleur aan om te bewijzen dat de loop werkt.
Verander in `manifests/apps/podinfo/deployment.yaml`:
```yaml
value: "#6C48C5"
```
naar bijv.:
```yaml
value: "#2ecc71"
```
@ -195,7 +206,9 @@ git commit -m "chore: verander podinfo UI-kleur"
git push
```
Binnen ~3 minuten (standaard poll-interval van ArgoCD) herstart de pod en zie je de nieuwe kleur. Je kunt ook op **Refresh** klikken in de UI voor direct effect.
Binnen ~3 minuten (standaard poll-interval van ArgoCD) herstart de pod
en zie je de nieuwe kleur. Je kunt ook op **Refresh** klikken in de UI
voor direct effect.
---
@ -211,7 +224,7 @@ podinfo Synced Healthy
## Probleemoplossing
| Symptoom | Oplossing |
|----------|-----------|
|----------------------------------|---------------------------------------------------------------|
| Application blijft "Progressing" | `kubectl describe pod -n podinfo` — waarschijnlijk image pull |
| ArgoCD toont OutOfSync na push | Klik **Refresh** of wacht 3 minuten |
@ -219,4 +232,6 @@ podinfo Synced Healthy
## Volgende stap
podinfo draait maar is alleen bereikbaar via port-forward. In Oefening 03 stel je MetalLB en Ingress-Nginx in zodat je de app vanuit je browser op je laptop kunt bereiken — zonder port-forward.
podinfo draait maar is alleen bereikbaar via port-forward.
In Oefening 03 stel je MetalLB en Ingress-Nginx in zodat je de app
vanuit je browser op je laptop kunt bereiken, zonder port-forward.

View file

@ -1,7 +1,8 @@
# Oefening 03 — MetalLB + Ingress-Nginx
**Tijd**: ~45 minuten
**Doel**: podinfo en de ArgoCD UI bereikbaar maken op een echt LAN-IP — vanuit je browser op je laptop, zonder port-forward.
**Doel**: podinfo en de ArgoCD UI bereikbaar maken op een echt LAN-IP — vanuit je browser op je laptop, zonder
port-forward.
---
@ -16,13 +17,17 @@
## Achtergrond
In cloud-Kubernetes (EKS, GKE, AKS) regelt `type: LoadBalancer` automatisch een load balancer met een extern IP. Op bare metal of lokale VMs doet niets dat — pods blijven onbereikbaar van buitenaf.
In cloud-Kubernetes (EKS, GKE, AKS) regelt `type: LoadBalancer` automatisch een load balancer met een extern IP. Op bare
metal of lokale VMs doet niets dat — pods blijven onbereikbaar van buitenaf.
**MetalLB** lost dit op: hij luistert naar LoadBalancer-services en kent IPs toe uit een pool die jij definieert. In L2-modus gebruikt hij ARP — jouw laptop vraagt "wie heeft 192.168.56.200?" en MetalLB antwoordt namens de VM.
**MetalLB** lost dit op: hij luistert naar LoadBalancer-services en kent IPs toe uit een pool die jij definieert. In
L2-modus gebruikt hij ARP — jouw laptop vraagt "wie heeft 192.168.56.200?" en MetalLB antwoordt namens de VM.
**Ingress-Nginx** is één LoadBalancer-service die van MetalLB één IP krijgt. Al je apps delen dat IP — Nginx routeert op basis van de `Host:` header.
**Ingress-Nginx** is één LoadBalancer-service die van MetalLB één IP krijgt. Al je apps delen dat IP — Nginx routeert op
basis van de `Host:` header.
**nip.io** is publieke wildcard-DNS: `iets.192.168.56.200.nip.io` resolvet altijd naar `192.168.56.200`. Geen `/etc/hosts` aanpassen.
**nip.io** is publieke wildcard-DNS: `iets.192.168.56.200.nip.io` resolvet altijd naar `192.168.56.200`. Geen
`/etc/hosts` aanpassen.
---
@ -33,6 +38,7 @@ In cloud-Kubernetes (EKS, GKE, AKS) regelt `type: LoadBalancer` automatisch een
Maak de volgende bestanden aan:
**`manifests/networking/metallb/values.yaml`**
```yaml
speaker:
tolerations:
@ -42,6 +48,7 @@ speaker:
```
**`manifests/networking/metallb/metallb-config.yaml`**
```yaml
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
@ -63,6 +70,7 @@ spec:
```
**`apps/networking/metallb.yaml`**
```yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
@ -96,6 +104,7 @@ spec:
```
**`apps/networking/metallb-config.yaml`**
```yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
@ -126,6 +135,7 @@ spec:
### 2. Ingress-Nginx installeren
**`manifests/networking/ingress-nginx/values.yaml`**
```yaml
controller:
ingressClassResource:
@ -141,6 +151,7 @@ controller:
```
**`apps/networking/ingress-nginx.yaml`**
```yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
@ -191,6 +202,7 @@ kubectl get svc -n ingress-nginx
```
Vanuit je laptop:
```bash
curl http://192.168.56.200
# 404 van Nginx — klopt, nog geen Ingress-regel
@ -201,6 +213,7 @@ curl http://192.168.56.200
### 4. Ingress voor podinfo toevoegen
**`manifests/apps/podinfo/ingress.yaml`**
```yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
@ -260,7 +273,7 @@ Open: **http://argocd.192.168.56.200.nip.io**
## Verwacht resultaat
| URL | App |
|-----|-----|
|--------------------------------------|----------------|
| http://podinfo.192.168.56.200.nip.io | podinfo v6.6.2 |
| http://argocd.192.168.56.200.nip.io | ArgoCD UI |
@ -271,7 +284,7 @@ Beide bereikbaar vanaf je laptop zonder port-forward.
## Probleemoplossing
| Symptoom | Oplossing |
|----------|-----------|
|-----------------------------------|------------------------------------------------------------------------|
| `EXTERNAL-IP` blijft `<pending>` | MetalLB is nog niet klaar — check `kubectl get pods -n metallb-system` |
| curl naar 192.168.56.200 time-out | VirtualBox host-only adapter niet geconfigureerd — zie vm-setup.md |
| nip.io resolvet niet | Tijdelijk DNS-probleem, probeer opnieuw of voeg toe aan `/etc/hosts` |
@ -281,4 +294,5 @@ Beide bereikbaar vanaf je laptop zonder port-forward.
## Volgende stap
In Oefening 04 bouw je een Tekton-pipeline die automatisch de image-tag in Git aanpast, pusht, en laat ArgoCD de update uitrollen.
In Oefening 04 bouw je een Tekton-pipeline die automatisch de image-tag in Git aanpast, pusht, en laat ArgoCD de update
uitrollen.

View file

@ -1,7 +1,8 @@
# Oefening 04 — Tekton Pipeline
**Tijd**: ~45 minuten
**Doel**: Een pipeline bouwen die automatisch de image-tag in Git aanpast en ArgoCD de update laat uitrollen — de volledige GitOps CI/CD-loop.
**Doel**: Een pipeline bouwen die automatisch de image-tag in Git aanpast en ArgoCD de update laat uitrollen — de
volledige GitOps CI/CD-loop.
---
@ -41,6 +42,7 @@ Rolling update → podinfo v6.7.0 in je browser
Oefeningen 0103 afgerond. podinfo is bereikbaar via **http://podinfo.192.168.56.200.nip.io** en toont versie **6.6.2**.
Je hebt nodig:
- Een GitHub Personal Access Token (PAT) met **repo**-scope (lezen + schrijven)
---
@ -50,12 +52,14 @@ Je hebt nodig:
### 1. Tekton installeren via ArgoCD
**`manifests/ci/tekton/kustomization.yaml`**
```yaml
resources:
- https://storage.googleapis.com/tekton-releases/pipeline/previous/v0.65.1/release.yaml
```
**`apps/ci/tekton.yaml`**
```yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
@ -102,6 +106,7 @@ kubectl get pods -n tekton-pipelines
### 2. Pipeline-resources aanmaken
**`manifests/ci/pipeline/serviceaccount.yaml`**
```yaml
apiVersion: v1
kind: ServiceAccount
@ -110,13 +115,15 @@ metadata:
namespace: tekton-pipelines
```
**`manifests/ci/pipeline/pipeline.yaml`** — zie de solution branch voor de volledige inhoud, of kopieer uit `reference-solution`:
**`manifests/ci/pipeline/pipeline.yaml`** — zie de solution branch voor de volledige inhoud, of kopieer uit
`reference-solution`:
```bash
git show origin/solution/04-tekton-pipeline:manifests/ci/pipeline/pipeline.yaml
```
**`manifests/ci/pipeline/pipelinerun.yaml`**
```yaml
apiVersion: tekton.dev/v1
kind: PipelineRun
@ -147,6 +154,7 @@ spec:
```
**`apps/ci/pipeline.yaml`**
```yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
@ -259,7 +267,7 @@ kubectl apply -f manifests/ci/pipeline/pipelinerun.yaml
## Probleemoplossing
| Symptoom | Oplossing |
|----------|-----------|
|----------------------------------------|------------------------------------------------------------------------|
| PipelineRun blijft "Running" | `kubectl describe pipelinerun -n tekton-pipelines bump-podinfo-to-670` |
| Secret `git-credentials` niet gevonden | Voer `./scripts/vm/set-git-credentials.sh` uit |
| Push mislukt: 403 Forbidden | PAT heeft onvoldoende rechten — `repo`-scope vereist |

View file

@ -87,14 +87,15 @@ ArgoCD heeft `selfHeal: true` — hij draait handmatige cluster-wijzigingen auto
kubectl set image deployment/podinfo podinfo=ghcr.io/stefanprodan/podinfo:6.5.0 -n podinfo
```
Kijk in de ArgoCD UI — binnen seconden gaat de podinfo-app op **OutOfSync**, en daarna zet ArgoCD hem terug naar wat er in Git staat.
Kijk in de ArgoCD UI — binnen seconden gaat de podinfo-app op **OutOfSync**, en daarna zet ArgoCD hem terug naar wat er
in Git staat.
---
## Samenvatting
| Component | Rol | Hoe gedeployed |
|---------------|----------------------|--------------------|
|---------------|------------------|----------------|
| k3s | Kubernetes | Vagrantfile |
| ArgoCD | GitOps engine | bootstrap.sh |
| MetalLB | LoadBalancer IPs | ArgoCD |
@ -106,6 +107,7 @@ Kijk in de ArgoCD UI — binnen seconden gaat de podinfo-app op **OutOfSync**, e
## Volgende stap
Als je nog tijd hebt: **Oefening 06 (bonus)** — Prometheus + Grafana deployen en cluster-metrics bekijken in een live dashboard.
Als je nog tijd hebt: **Oefening 06 (bonus)** — Prometheus + Grafana deployen en cluster-metrics bekijken in een live
dashboard.
Anders: sluit af met de **presentatie** over GitOps in productie.

View file

@ -17,7 +17,8 @@
Oefeningen 0103 afgerond. Ingress-Nginx draait en nip.io-URLs zijn bereikbaar vanaf je laptop.
> De monitoring-stack gebruikt extra ~700 MB geheugen. Op een 8 GB VM werkt het, maar kan wat traag aanvoelen. Als het te zwaar wordt, kun je `alertmanager` uitschakelen in de values.
> De monitoring-stack gebruikt extra ~700 MB geheugen. Op een 8 GB VM werkt het, maar kan wat traag aanvoelen.
> Als het te zwaar wordt, kun je `alertmanager` uitschakelen in de values.
---
@ -26,6 +27,7 @@ Oefeningen 0103 afgerond. Ingress-Nginx draait en nip.io-URLs zijn bereikbaar
### 1. Monitoring-Application aanmaken
**`manifests/monitoring/values.yaml`**
```yaml
grafana:
adminPassword: workshop123
@ -74,6 +76,7 @@ nodeExporter:
```
**`apps/monitoring/prometheus-grafana.yaml`**
```yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
@ -147,7 +150,7 @@ kube-prometheus-stack levert kant-en-klare dashboards mee. In de Grafana-sidebar
Interessant voor deze workshop:
| Dashboard | Wat je ziet |
|-----------|-------------|
|---------------------------------------------------|--------------------------------------------------|
| Kubernetes / Compute Resources / Namespace (Pods) | CPU + geheugen per pod in de `podinfo` namespace |
| Kubernetes / Compute Resources / Node (Pods) | Overzicht op node-niveau |
| Node Exporter / Full | VM-niveau: CPU, geheugen, schijf, netwerk |
@ -161,7 +164,8 @@ Interessant voor deze workshop:
while true; do curl -s http://podinfo.192.168.56.200.nip.io > /dev/null; sleep 0.2; done
```
Open in Grafana: **Kubernetes / Compute Resources / Namespace (Pods)** → namespace `podinfo`. Je ziet het CPU-gebruik stijgen.
Open in Grafana: **Kubernetes / Compute Resources / Namespace (Pods)** → namespace `podinfo`.
Je ziet het CPU-gebruik stijgen.
---
@ -186,7 +190,7 @@ ArgoCD synchroniseert de Helm-release en Grafana herstart. Log daarna in met het
## Probleemoplossing
| Symptoom | Oplossing |
|----------|-----------|
|-------------------------|---------------------------------------------------------------------------------|
| Pods in Pending | VM heeft te weinig geheugen — `kubectl describe pod` voor details |
| Grafana 502 van Nginx | Pod is nog niet klaar, even wachten |
| Geen data in dashboards | Prometheus heeft ~2 minuten nodig voor de eerste scrape |

View file

@ -16,7 +16,8 @@ Doe dit de dag ervoor — niet op de ochtend van de workshop zelf.
Minimaal 12 GB vrij RAM, ~15 GB schijfruimte.
**Na installatie van VirtualBox: herstart je laptop.** VirtualBox installeert een kernel-extensie en die werkt pas na een reboot.
**Na installatie van VirtualBox: herstart je laptop.** VirtualBox installeert een kernel-extensie en die werkt pas na
een reboot.
Snelle check — alle drie moeten een versie tonen:
@ -43,9 +44,11 @@ cd ops-demo
vagrant up
```
De eerste keer duurt dit 1015 minuten. Vagrant downloadt de Ubuntu 24.04 box, installeert k3s, Helm en yq, en haalt de workshop-images alvast op. Daarna start de VM in een paar seconden.
De eerste keer duurt dit 1015 minuten. Vagrant downloadt de Ubuntu 24.04 box, installeert k3s, Helm en yq, en haalt de
workshop-images alvast op. Daarna start de VM in een paar seconden.
Aan het einde zie je:
```
════════════════════════════════════════════════════════
VM provisioned successfully!
@ -97,6 +100,7 @@ VBoxManage list hostonlyifs
```
Bestaat hij niet:
```bash
VBoxManage hostonlyif create
VBoxManage hostonlyif ipconfig vboxnet0 --ip 192.168.56.1 --netmask 255.255.255.0