From fc0eb1b0c4347d683b244508a320968cab71c087 Mon Sep 17 00:00:00 2001 From: Paul Harkink Date: Sat, 28 Feb 2026 22:42:09 +0100 Subject: [PATCH] docs: improve markdown formatting and readability --- README.md | 45 ++++++++++++++++++++++++------------- docs/01-argocd-bootstrap.md | 35 +++++++++++++++++++---------- docs/02-deploy-podinfo.md | 29 ++++++++++++++++++------ docs/03-metallb-ingress.md | 44 +++++++++++++++++++++++------------- docs/04-tekton-pipeline.md | 28 ++++++++++++++--------- docs/05-app-upgrade.md | 22 +++++++++--------- docs/06-monitoring.md | 30 ++++++++++++++----------- docs/vm-setup.md | 8 +++++-- 8 files changed, 157 insertions(+), 84 deletions(-) diff --git a/README.md b/README.md index 296afd0..ab153d8 100644 --- a/README.md +++ b/README.md @@ -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. -| Tool | Download | -|----------------|---------------------------------------------------------------------| +| 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 | +| Vagrant 2.4.x | https://developer.hashicorp.com/vagrant/downloads | +| Git | https://git-scm.com/downloads | 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. 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`. @@ -113,19 +127,20 @@ 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"` | -| 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). | +| 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"` | +| 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). | | `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. | -| Tekton pipeline kan niet pushen naar GitHub | Controleer credentials opnieuw met `./scripts/vm/set-git-credentials.sh ` 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. | +| `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 ` 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. | Handige debug-commando's: + ```bash vagrant global-status --prune vagrant status diff --git a/docs/01-argocd-bootstrap.md b/docs/01-argocd-bootstrap.md index 8989f7b..5dce202 100644 --- a/docs/01-argocd-bootstrap.md +++ b/docs/01-argocd-bootstrap.md @@ -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,42 +83,48 @@ 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: - - `type: git` - - `url: ` - - `username: ` - - `password: ` - - `project: workshop` + - `type: git` + - `url: ` + - `username: ` + - `password: ` + - `project: workshop` `` 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//.git` + - `https://github.com//.git` - Gebruik je een **SSH repo-URL**: - - `git@github.com:/.git` - - dan authenticate je met een SSH key (niet met PAT). + - `git@github.com:/.git` + - 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 4. Zet minimaal repository permission: - - `Contents: Read` + - `Contents: Read` 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. --- diff --git a/docs/02-deploy-podinfo.md b/docs/02-deploy-podinfo.md index 6de321f..0cb1015 100644 --- a/docs/02-deploy-podinfo.md +++ b/docs/02-deploy-podinfo.md @@ -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. --- @@ -210,13 +223,15 @@ podinfo Synced Healthy ## Probleemoplossing -| Symptoom | Oplossing | -|----------|-----------| +| Symptoom | Oplossing | +|----------------------------------|---------------------------------------------------------------| | 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 -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. diff --git a/docs/03-metallb-ingress.md b/docs/03-metallb-ingress.md index 9c96487..c7d08e7 100644 --- a/docs/03-metallb-ingress.md +++ b/docs/03-metallb-ingress.md @@ -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 @@ -259,10 +272,10 @@ Open: **http://argocd.192.168.56.200.nip.io** ## Verwacht resultaat -| URL | App | -|-----|-----| +| URL | App | +|--------------------------------------|----------------| | 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. @@ -270,15 +283,16 @@ Beide bereikbaar vanaf je laptop zonder port-forward. ## Probleemoplossing -| Symptoom | Oplossing | -|----------|-----------| -| `EXTERNAL-IP` blijft `` | 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` | -| ArgoCD ingress geeft 502 | Wacht tot ArgoCD herstart na de values-wijziging | +| Symptoom | Oplossing | +|-----------------------------------|------------------------------------------------------------------------| +| `EXTERNAL-IP` blijft `` | 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` | +| ArgoCD ingress geeft 502 | Wacht tot ArgoCD herstart na de values-wijziging | --- ## 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. diff --git a/docs/04-tekton-pipeline.md b/docs/04-tekton-pipeline.md index 58d0eef..0f148b4 100644 --- a/docs/04-tekton-pipeline.md +++ b/docs/04-tekton-pipeline.md @@ -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 01–03 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 @@ -70,7 +74,7 @@ spec: repoURL: JOUW_FORK_URL targetRevision: HEAD path: manifests/ci/tekton - kustomize: {} + kustomize: { } destination: server: https://kubernetes.default.svc namespace: tekton-pipelines @@ -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 @@ -137,7 +144,7 @@ spec: - name: source volumeClaimTemplate: spec: - accessModes: [ReadWriteOnce] + accessModes: [ ReadWriteOnce ] resources: requests: storage: 1Gi @@ -147,6 +154,7 @@ spec: ``` **`apps/ci/pipeline.yaml`** + ```yaml apiVersion: argoproj.io/v1alpha1 kind: Application @@ -258,12 +266,12 @@ 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 | -| ArgoCD synchroniseert niet | Klik **Refresh** in de UI | +| 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 | +| ArgoCD synchroniseert niet | Klik **Refresh** in de UI | --- diff --git a/docs/05-app-upgrade.md b/docs/05-app-upgrade.md index 2720e57..31da7c0 100644 --- a/docs/05-app-upgrade.md +++ b/docs/05-app-upgrade.md @@ -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 ``` -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 | -| Ingress-Nginx | HTTP-routing | ArgoCD | -| podinfo | Demo-applicatie | ArgoCD | -| Tekton | CI-pipeline | ArgoCD | +| Component | Rol | Hoe gedeployed | +|---------------|------------------|----------------| +| k3s | Kubernetes | Vagrantfile | +| ArgoCD | GitOps engine | bootstrap.sh | +| MetalLB | LoadBalancer IPs | ArgoCD | +| Ingress-Nginx | HTTP-routing | ArgoCD | +| podinfo | Demo-applicatie | ArgoCD | +| Tekton | CI-pipeline | ArgoCD | --- ## 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. diff --git a/docs/06-monitoring.md b/docs/06-monitoring.md index a87a98b..cdc6373 100644 --- a/docs/06-monitoring.md +++ b/docs/06-monitoring.md @@ -17,7 +17,8 @@ Oefeningen 01–03 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 01–03 afgerond. Ingress-Nginx draait en nip.io-URLs zijn bereikbaar ### 1. Monitoring-Application aanmaken **`manifests/monitoring/values.yaml`** + ```yaml grafana: adminPassword: workshop123 @@ -52,7 +54,7 @@ prometheus: storageSpec: volumeClaimTemplate: spec: - accessModes: [ReadWriteOnce] + accessModes: [ ReadWriteOnce ] resources: requests: storage: 2Gi @@ -74,6 +76,7 @@ nodeExporter: ``` **`apps/monitoring/prometheus-grafana.yaml`** + ```yaml apiVersion: argoproj.io/v1alpha1 kind: Application @@ -146,11 +149,11 @@ kube-prometheus-stack levert kant-en-klare dashboards mee. In de Grafana-sidebar 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 / Node (Pods) | Overzicht op node-niveau | -| Node Exporter / Full | VM-niveau: CPU, geheugen, schijf, netwerk | +| 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. --- @@ -185,9 +189,9 @@ 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 | -| CRD-conflict bij sync | Eerste sync installeert CRDs, tweede sync past resources toe — opnieuw proberen | +| 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 | +| CRD-conflict bij sync | Eerste sync installeert CRDs, tweede sync past resources toe — opnieuw proberen | diff --git a/docs/vm-setup.md b/docs/vm-setup.md index fd5f95a..ca4d648 100644 --- a/docs/vm-setup.md +++ b/docs/vm-setup.md @@ -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 10–15 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 10–15 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