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

@ -9,11 +9,11 @@ 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. Je hebt drie dingen nodig op je laptop. Installeer ze de dag van tevoren — niet op de dag zelf.
| Tool | Download | | Tool | Download |
|----------------|---------------------------------------------------------------------| |----------------|-----------------------------------------------------------------------------------------------------------|
| VirtualBox 7.x | https://www.virtualbox.org/wiki/Downloads — op Windows: reboot alleen als installer/Windows daarom vraagt | | 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 | | Vagrant 2.4.x | https://developer.hashicorp.com/vagrant/downloads |
| Git | https://git-scm.com/downloads | | Git | https://git-scm.com/downloads |
Minimaal 12 GB vrij RAM en ~15 GB schijfruimte. Snelle check: Minimaal 12 GB vrij RAM en ~15 GB schijfruimte. Snelle check:
@ -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. kun je zelf pushen zonder dat je toegang nodig hebt tot de originele repo.
1. Clone je fork op je host-machine. 1. Clone je fork op je host-machine.
```bash ```bash
git clone https://github.com/JOUW_USERNAME/ops-demo.git && cd ops-demo git clone https://github.com/JOUW_USERNAME/ops-demo.git && cd ops-demo
``` ```
2. Start de VM. 2. Start de VM.
```bash ```bash
vagrant up vagrant up
``` ```
3. Run bootstrap vanaf je host (script voert bootstrap in de VM uit). 3. Run bootstrap vanaf je host (script voert bootstrap in de VM uit).
```bash ```bash
./scripts/host/bootstrap-from-host.sh ./scripts/host/bootstrap-from-host.sh
``` ```
```powershell ```powershell
./scripts/host/bootstrap-from-host.ps1 ./scripts/host/bootstrap-from-host.ps1
``` ```
4. Open ArgoCD UI via tunnel. 4. Open ArgoCD UI via tunnel.
```bash ```bash
./scripts/host/argocd-ui-tunnel.sh ./scripts/host/argocd-ui-tunnel.sh
``` ```
```powershell ```powershell
./scripts/host/argocd-ui-tunnel.ps1 ./scripts/host/argocd-ui-tunnel.ps1
``` ```
5. Open in je browser: 5. Open in je browser:
```text ```text
http://localhost:8080 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. 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: Belangrijk:
- Je hoeft het VM-IP niet te weten om in te loggen of te tunnelen; gebruik `vagrant ssh`. - 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`. - Je hoeft de repo niet opnieuw in de VM te clonen: Vagrant mount je host-repo automatisch als `/vagrant`.
@ -113,19 +127,20 @@ naar jouw eigen branch om precies te zien wat er mist.
## Troubleshooting ## Troubleshooting
| Probleem | Oplossing | | 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. | | `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`. | | `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"` | | 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"` |
| Ik kan niet inloggen met `vagrant ssh` | Controleer eerst of je in de juiste repo-map staat (`pwd`) en run `vagrant status`. Als de VM niet draait: `vagrant up`. Helpt dat niet: `vagrant global-status --prune` en check de `directory`. | | Ik kan niet inloggen met `vagrant ssh` | Controleer eerst of je in de juiste repo-map staat (`pwd`) en run `vagrant status`. Als de VM niet draait: `vagrant up`. Helpt dat niet: `vagrant global-status --prune` en check de `directory`. |
| ArgoCD UI niet bereikbaar op `http://localhost:8080` | Start de tunnel opnieuw: `./scripts/host/argocd-ui-tunnel.sh` (of `.ps1` op Windows). | | ArgoCD UI niet bereikbaar op `http://localhost:8080` | Start de tunnel opnieuw: `./scripts/host/argocd-ui-tunnel.sh` (of `.ps1` op Windows). |
| `kubectl` lijkt naar de verkeerde cluster te wijzen | Gebruik de host-scripts (`./scripts/host/bootstrap-from-host.sh` en `./scripts/host/argocd-ui-tunnel.sh`) of log in met `vagrant ssh` en werk vanuit `/vagrant`. De bootstrap heeft cluster-checks en stopt bij mismatch. | | `kubectl` lijkt naar de verkeerde cluster te wijzen | Gebruik de host-scripts (`./scripts/host/bootstrap-from-host.sh` en `./scripts/host/argocd-ui-tunnel.sh`) of log in met `vagrant ssh` en werk vanuit `/vagrant`. De bootstrap heeft cluster-checks en stopt bij mismatch. |
| `root` app blijft `Unknown` of `OutOfSync` | Controleer of `apps/root.yaml` naar jouw fork verwijst en of je die commit/push hebt gedaan. Daarna in ArgoCD op **Refresh** klikken. | | `root` app blijft `Unknown` of `OutOfSync` | Controleer of `apps/root.yaml` naar jouw fork verwijst en of je die commit/push hebt gedaan. Daarna in ArgoCD op **Refresh** klikken. |
| Tekton pipeline kan niet pushen naar GitHub | Controleer credentials opnieuw met `./scripts/vm/set-git-credentials.sh <github-user> <github-pat>` en gebruik een PAT met juiste repo-rechten. | | Tekton pipeline kan niet pushen naar GitHub | Controleer credentials opnieuw met `./scripts/vm/set-git-credentials.sh <github-user> <github-pat>` en gebruik een PAT met juiste repo-rechten. |
| 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. | | 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: Handige debug-commando's:
```bash ```bash
vagrant global-status --prune vagrant global-status --prune
vagrant status vagrant status

View file

@ -31,7 +31,8 @@ kubectl get nodes
### 1. Startpunt kiezen ### 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. Ga in dat geval direct naar stap 3.
Wil je vanaf een blanke VM starten, voer dan bootstrap handmatig uit in de VM: 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: Het script doet het volgende:
1. Detecteert de URL van jouw fork op basis van `git remote` 1. Detecteert de URL van jouw fork op basis van `git remote`
2. Maakt de `argocd` namespace aan 2. Maakt de `argocd` namespace aan
3. Installeert ArgoCD via Helm 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: Kies een van deze twee paden:
**Pad A — via ArgoCD UI** **Pad A — via ArgoCD UI**
- Ga naar **Settings → Repositories → Connect Repo** - Ga naar **Settings → Repositories → Connect Repo**
- Vul je repo-URL in - Vul je repo-URL in
- Auth type: username + password (bij HTTPS) - Auth type: username + password (bij HTTPS)
@ -80,42 +83,48 @@ Kies een van deze twee paden:
- Project: `workshop` - Project: `workshop`
**Pad B — via Kubernetes Secret (zonder UI)** **Pad B — via Kubernetes Secret (zonder UI)**
- Maak een Secret in namespace `argocd` - Maak een Secret in namespace `argocd`
- Label op die Secret: `argocd.argoproj.io/secret-type=repository` - Label op die Secret: `argocd.argoproj.io/secret-type=repository`
- Secret-data met minimaal: - Secret-data met minimaal:
- `type: git` - `type: git`
- `url: <jouw-repo-url>` - `url: <jouw-repo-url>`
- `username: <jouw-github-user>` - `username: <jouw-github-user>`
- `password: <jouw-github-pat>` - `password: <jouw-github-pat>`
- `project: workshop` - `project: workshop`
`<jouw-repo-url>` kan technisch HTTPS of SSH zijn, maar: `<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**: - Gebruik je een **GitHub PAT** (fine-grained of classic), dan gebruik je een **HTTPS repo-URL**:
- `https://github.com/<user>/<repo>.git` - `https://github.com/<user>/<repo>.git`
- Gebruik je een **SSH repo-URL**: - Gebruik je een **SSH repo-URL**:
- `git@github.com:<user>/<repo>.git` - `git@github.com:<user>/<repo>.git`
- dan authenticate je met een SSH key (niet met PAT). - dan authenticate je met een SSH key (niet met PAT).
#### Token/credentials kiezen #### Token/credentials kiezen
Gebruik credentials die read-toegang geven tot je Git-repo. Gebruik credentials die read-toegang geven tot je Git-repo.
Als je **GitHub** gebruikt: Als je **GitHub** gebruikt:
1. Ga naar **Settings → Developer settings → [Personal access tokens](https://github.com/settings/tokens)** 1. Ga naar **Settings → Developer settings → [Personal access tokens](https://github.com/settings/tokens)**
2. Maak bij voorkeur een **fine-grained token** 2. Maak bij voorkeur een **fine-grained token**
3. Geef de token toegang tot jouw workshop-repo 3. Geef de token toegang tot jouw workshop-repo
4. Zet minimaal repository permission: 4. Zet minimaal repository permission:
- `Contents: Read` - `Contents: Read`
Dit is voldoende voor ArgoCD sync (read-only). Dit is voldoende voor ArgoCD sync (read-only).
Gebruik je later Tekton om te pushen, dan heb je `Contents: Read and write` nodig. Gebruik je later Tekton om te pushen, dan heb je `Contents: Read and write` nodig.
Bij HTTPS + PAT geldt: Bij HTTPS + PAT geldt:
- `username` = je accountnaam op je Git-provider (bij GitHub: je GitHub username, niet je e-mailadres) - `username` = je accountnaam op je Git-provider (bij GitHub: je GitHub username, niet je e-mailadres)
- `password` = de PAT zelf - `password` = de PAT zelf
Een classic token kan ook, met scope `repo`, maar fine-grained heeft de voorkeur. Een classic token kan ook, met scope `repo`, maar fine-grained heeft de voorkeur.
#### Wat is “Project” in ArgoCD? #### Wat is “Project” in ArgoCD?
Een ArgoCD Project (AppProject) bepaalt welke repos en destinations een set Applications mag gebruiken. 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`). 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 ### 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 ```bash
git add apps/root.yaml git add apps/root.yaml
@ -187,7 +197,8 @@ spec:
- ServerSideApply=true - 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? ## 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: Maak de volgende bestanden aan:
**`manifests/apps/podinfo/namespace.yaml`** **`manifests/apps/podinfo/namespace.yaml`**
```yaml ```yaml
apiVersion: v1 apiVersion: v1
kind: Namespace kind: Namespace
@ -40,6 +44,7 @@ metadata:
``` ```
**`manifests/apps/podinfo/deployment.yaml`** **`manifests/apps/podinfo/deployment.yaml`**
```yaml ```yaml
apiVersion: apps/v1 apiVersion: apps/v1
kind: Deployment kind: Deployment
@ -78,6 +83,7 @@ spec:
``` ```
**`manifests/apps/podinfo/service.yaml`** **`manifests/apps/podinfo/service.yaml`**
```yaml ```yaml
apiVersion: v1 apiVersion: v1
kind: Service kind: Service
@ -98,6 +104,7 @@ spec:
### 2. De ArgoCD Application aanmaken ### 2. De ArgoCD Application aanmaken
**`apps/apps/podinfo.yaml`** **`apps/apps/podinfo.yaml`**
```yaml ```yaml
apiVersion: argoproj.io/v1alpha1 apiVersion: argoproj.io/v1alpha1
kind: Application kind: Application
@ -137,7 +144,8 @@ git push
Dit is de enige actie die nodig is om de applicatie te deployen. 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. Pas de UI-kleur aan om te bewijzen dat de loop werkt.
Verander in `manifests/apps/podinfo/deployment.yaml`: Verander in `manifests/apps/podinfo/deployment.yaml`:
```yaml ```yaml
value: "#6C48C5" value: "#6C48C5"
``` ```
naar bijv.: naar bijv.:
```yaml ```yaml
value: "#2ecc71" value: "#2ecc71"
``` ```
@ -195,7 +206,9 @@ git commit -m "chore: verander podinfo UI-kleur"
git push 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.
--- ---
@ -210,13 +223,15 @@ podinfo Synced Healthy
## Probleemoplossing ## Probleemoplossing
| Symptoom | Oplossing | | Symptoom | Oplossing |
|----------|-----------| |----------------------------------|---------------------------------------------------------------|
| Application blijft "Progressing" | `kubectl describe pod -n podinfo` — waarschijnlijk image pull | | Application blijft "Progressing" | `kubectl describe pod -n podinfo` — waarschijnlijk image pull |
| ArgoCD toont OutOfSync na push | Klik **Refresh** of wacht 3 minuten | | ArgoCD toont OutOfSync na push | Klik **Refresh** of wacht 3 minuten |
--- ---
## Volgende stap ## 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 # Oefening 03 — MetalLB + Ingress-Nginx
**Tijd**: ~45 minuten **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 ## 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: Maak de volgende bestanden aan:
**`manifests/networking/metallb/values.yaml`** **`manifests/networking/metallb/values.yaml`**
```yaml ```yaml
speaker: speaker:
tolerations: tolerations:
@ -42,6 +48,7 @@ speaker:
``` ```
**`manifests/networking/metallb/metallb-config.yaml`** **`manifests/networking/metallb/metallb-config.yaml`**
```yaml ```yaml
apiVersion: metallb.io/v1beta1 apiVersion: metallb.io/v1beta1
kind: IPAddressPool kind: IPAddressPool
@ -63,6 +70,7 @@ spec:
``` ```
**`apps/networking/metallb.yaml`** **`apps/networking/metallb.yaml`**
```yaml ```yaml
apiVersion: argoproj.io/v1alpha1 apiVersion: argoproj.io/v1alpha1
kind: Application kind: Application
@ -96,6 +104,7 @@ spec:
``` ```
**`apps/networking/metallb-config.yaml`** **`apps/networking/metallb-config.yaml`**
```yaml ```yaml
apiVersion: argoproj.io/v1alpha1 apiVersion: argoproj.io/v1alpha1
kind: Application kind: Application
@ -126,6 +135,7 @@ spec:
### 2. Ingress-Nginx installeren ### 2. Ingress-Nginx installeren
**`manifests/networking/ingress-nginx/values.yaml`** **`manifests/networking/ingress-nginx/values.yaml`**
```yaml ```yaml
controller: controller:
ingressClassResource: ingressClassResource:
@ -141,6 +151,7 @@ controller:
``` ```
**`apps/networking/ingress-nginx.yaml`** **`apps/networking/ingress-nginx.yaml`**
```yaml ```yaml
apiVersion: argoproj.io/v1alpha1 apiVersion: argoproj.io/v1alpha1
kind: Application kind: Application
@ -191,6 +202,7 @@ kubectl get svc -n ingress-nginx
``` ```
Vanuit je laptop: Vanuit je laptop:
```bash ```bash
curl http://192.168.56.200 curl http://192.168.56.200
# 404 van Nginx — klopt, nog geen Ingress-regel # 404 van Nginx — klopt, nog geen Ingress-regel
@ -201,6 +213,7 @@ curl http://192.168.56.200
### 4. Ingress voor podinfo toevoegen ### 4. Ingress voor podinfo toevoegen
**`manifests/apps/podinfo/ingress.yaml`** **`manifests/apps/podinfo/ingress.yaml`**
```yaml ```yaml
apiVersion: networking.k8s.io/v1 apiVersion: networking.k8s.io/v1
kind: Ingress kind: Ingress
@ -259,10 +272,10 @@ Open: **http://argocd.192.168.56.200.nip.io**
## Verwacht resultaat ## Verwacht resultaat
| URL | App | | URL | App |
|-----|-----| |--------------------------------------|----------------|
| http://podinfo.192.168.56.200.nip.io | podinfo v6.6.2 | | http://podinfo.192.168.56.200.nip.io | podinfo v6.6.2 |
| http://argocd.192.168.56.200.nip.io | ArgoCD UI | | http://argocd.192.168.56.200.nip.io | ArgoCD UI |
Beide bereikbaar vanaf je laptop zonder port-forward. Beide bereikbaar vanaf je laptop zonder port-forward.
@ -270,15 +283,16 @@ Beide bereikbaar vanaf je laptop zonder port-forward.
## Probleemoplossing ## Probleemoplossing
| Symptoom | Oplossing | | Symptoom | Oplossing |
|----------|-----------| |-----------------------------------|------------------------------------------------------------------------|
| `EXTERNAL-IP` blijft `<pending>` | MetalLB is nog niet klaar — check `kubectl get pods -n metallb-system` | | `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 | | 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` | | nip.io resolvet niet | Tijdelijk DNS-probleem, probeer opnieuw of voeg toe aan `/etc/hosts` |
| ArgoCD ingress geeft 502 | Wacht tot ArgoCD herstart na de values-wijziging | | ArgoCD ingress geeft 502 | Wacht tot ArgoCD herstart na de values-wijziging |
--- ---
## Volgende stap ## 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 # Oefening 04 — Tekton Pipeline
**Tijd**: ~45 minuten **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**. Oefeningen 0103 afgerond. podinfo is bereikbaar via **http://podinfo.192.168.56.200.nip.io** en toont versie **6.6.2**.
Je hebt nodig: Je hebt nodig:
- Een GitHub Personal Access Token (PAT) met **repo**-scope (lezen + schrijven) - Een GitHub Personal Access Token (PAT) met **repo**-scope (lezen + schrijven)
--- ---
@ -50,12 +52,14 @@ Je hebt nodig:
### 1. Tekton installeren via ArgoCD ### 1. Tekton installeren via ArgoCD
**`manifests/ci/tekton/kustomization.yaml`** **`manifests/ci/tekton/kustomization.yaml`**
```yaml ```yaml
resources: resources:
- https://storage.googleapis.com/tekton-releases/pipeline/previous/v0.65.1/release.yaml - https://storage.googleapis.com/tekton-releases/pipeline/previous/v0.65.1/release.yaml
``` ```
**`apps/ci/tekton.yaml`** **`apps/ci/tekton.yaml`**
```yaml ```yaml
apiVersion: argoproj.io/v1alpha1 apiVersion: argoproj.io/v1alpha1
kind: Application kind: Application
@ -70,7 +74,7 @@ spec:
repoURL: JOUW_FORK_URL repoURL: JOUW_FORK_URL
targetRevision: HEAD targetRevision: HEAD
path: manifests/ci/tekton path: manifests/ci/tekton
kustomize: {} kustomize: { }
destination: destination:
server: https://kubernetes.default.svc server: https://kubernetes.default.svc
namespace: tekton-pipelines namespace: tekton-pipelines
@ -102,6 +106,7 @@ kubectl get pods -n tekton-pipelines
### 2. Pipeline-resources aanmaken ### 2. Pipeline-resources aanmaken
**`manifests/ci/pipeline/serviceaccount.yaml`** **`manifests/ci/pipeline/serviceaccount.yaml`**
```yaml ```yaml
apiVersion: v1 apiVersion: v1
kind: ServiceAccount kind: ServiceAccount
@ -110,13 +115,15 @@ metadata:
namespace: tekton-pipelines 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 ```bash
git show origin/solution/04-tekton-pipeline:manifests/ci/pipeline/pipeline.yaml git show origin/solution/04-tekton-pipeline:manifests/ci/pipeline/pipeline.yaml
``` ```
**`manifests/ci/pipeline/pipelinerun.yaml`** **`manifests/ci/pipeline/pipelinerun.yaml`**
```yaml ```yaml
apiVersion: tekton.dev/v1 apiVersion: tekton.dev/v1
kind: PipelineRun kind: PipelineRun
@ -137,7 +144,7 @@ spec:
- name: source - name: source
volumeClaimTemplate: volumeClaimTemplate:
spec: spec:
accessModes: [ReadWriteOnce] accessModes: [ ReadWriteOnce ]
resources: resources:
requests: requests:
storage: 1Gi storage: 1Gi
@ -147,6 +154,7 @@ spec:
``` ```
**`apps/ci/pipeline.yaml`** **`apps/ci/pipeline.yaml`**
```yaml ```yaml
apiVersion: argoproj.io/v1alpha1 apiVersion: argoproj.io/v1alpha1
kind: Application kind: Application
@ -258,12 +266,12 @@ kubectl apply -f manifests/ci/pipeline/pipelinerun.yaml
## Probleemoplossing ## Probleemoplossing
| Symptoom | Oplossing | | Symptoom | Oplossing |
|----------|-----------| |----------------------------------------|------------------------------------------------------------------------|
| PipelineRun blijft "Running" | `kubectl describe pipelinerun -n tekton-pipelines bump-podinfo-to-670` | | 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 | | Secret `git-credentials` niet gevonden | Voer `./scripts/vm/set-git-credentials.sh` uit |
| Push mislukt: 403 Forbidden | PAT heeft onvoldoende rechten — `repo`-scope vereist | | Push mislukt: 403 Forbidden | PAT heeft onvoldoende rechten — `repo`-scope vereist |
| ArgoCD synchroniseert niet | Klik **Refresh** in de UI | | ArgoCD synchroniseert niet | Klik **Refresh** in de UI |
--- ---

View file

@ -87,25 +87,27 @@ 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 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 ## Samenvatting
| Component | Rol | Hoe gedeployed | | Component | Rol | Hoe gedeployed |
|---------------|----------------------|--------------------| |---------------|------------------|----------------|
| k3s | Kubernetes | Vagrantfile | | k3s | Kubernetes | Vagrantfile |
| ArgoCD | GitOps engine | bootstrap.sh | | ArgoCD | GitOps engine | bootstrap.sh |
| MetalLB | LoadBalancer IPs | ArgoCD | | MetalLB | LoadBalancer IPs | ArgoCD |
| Ingress-Nginx | HTTP-routing | ArgoCD | | Ingress-Nginx | HTTP-routing | ArgoCD |
| podinfo | Demo-applicatie | ArgoCD | | podinfo | Demo-applicatie | ArgoCD |
| Tekton | CI-pipeline | ArgoCD | | Tekton | CI-pipeline | ArgoCD |
--- ---
## Volgende stap ## 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. 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. 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 ### 1. Monitoring-Application aanmaken
**`manifests/monitoring/values.yaml`** **`manifests/monitoring/values.yaml`**
```yaml ```yaml
grafana: grafana:
adminPassword: workshop123 adminPassword: workshop123
@ -52,7 +54,7 @@ prometheus:
storageSpec: storageSpec:
volumeClaimTemplate: volumeClaimTemplate:
spec: spec:
accessModes: [ReadWriteOnce] accessModes: [ ReadWriteOnce ]
resources: resources:
requests: requests:
storage: 2Gi storage: 2Gi
@ -74,6 +76,7 @@ nodeExporter:
``` ```
**`apps/monitoring/prometheus-grafana.yaml`** **`apps/monitoring/prometheus-grafana.yaml`**
```yaml ```yaml
apiVersion: argoproj.io/v1alpha1 apiVersion: argoproj.io/v1alpha1
kind: Application kind: Application
@ -146,11 +149,11 @@ kube-prometheus-stack levert kant-en-klare dashboards mee. In de Grafana-sidebar
Interessant voor deze workshop: Interessant voor deze workshop:
| Dashboard | Wat je ziet | | Dashboard | Wat je ziet |
|-----------|-------------| |---------------------------------------------------|--------------------------------------------------|
| Kubernetes / Compute Resources / Namespace (Pods) | CPU + geheugen per pod in de `podinfo` namespace | | Kubernetes / Compute Resources / Namespace (Pods) | CPU + geheugen per pod in de `podinfo` namespace |
| Kubernetes / Compute Resources / Node (Pods) | Overzicht op node-niveau | | Kubernetes / Compute Resources / Node (Pods) | Overzicht op node-niveau |
| Node Exporter / Full | VM-niveau: CPU, geheugen, schijf, netwerk | | 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 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.
--- ---
@ -185,9 +189,9 @@ ArgoCD synchroniseert de Helm-release en Grafana herstart. Log daarna in met het
## Probleemoplossing ## Probleemoplossing
| Symptoom | Oplossing | | Symptoom | Oplossing |
|----------|-----------| |-------------------------|---------------------------------------------------------------------------------|
| Pods in Pending | VM heeft te weinig geheugen — `kubectl describe pod` voor details | | Pods in Pending | VM heeft te weinig geheugen — `kubectl describe pod` voor details |
| Grafana 502 van Nginx | Pod is nog niet klaar, even wachten | | Grafana 502 van Nginx | Pod is nog niet klaar, even wachten |
| Geen data in dashboards | Prometheus heeft ~2 minuten nodig voor de eerste scrape | | Geen data in dashboards | Prometheus heeft ~2 minuten nodig voor de eerste scrape |
| CRD-conflict bij sync | Eerste sync installeert CRDs, tweede sync past resources toe — opnieuw proberen | | CRD-conflict bij sync | Eerste sync installeert CRDs, tweede sync past resources toe — opnieuw proberen |

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. 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: Snelle check — alle drie moeten een versie tonen:
@ -43,9 +44,11 @@ cd ops-demo
vagrant up 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: Aan het einde zie je:
``` ```
════════════════════════════════════════════════════════ ════════════════════════════════════════════════════════
VM provisioned successfully! VM provisioned successfully!
@ -97,6 +100,7 @@ VBoxManage list hostonlyifs
``` ```
Bestaat hij niet: Bestaat hij niet:
```bash ```bash
VBoxManage hostonlyif create VBoxManage hostonlyif create
VBoxManage hostonlyif ipconfig vboxnet0 --ip 192.168.56.1 --netmask 255.255.255.0 VBoxManage hostonlyif ipconfig vboxnet0 --ip 192.168.56.1 --netmask 255.255.255.0