docs: refine workshop guidance for auth, networking, and tekton

This commit is contained in:
Paul Harkink 2026-03-03 22:42:04 +01:00
parent fe97407bb2
commit ba7db02190
4 changed files with 130 additions and 67 deletions

View file

@ -20,6 +20,16 @@
> De extra uitlegblokken in deze oefening leggen uit *waarom* je iets doet. > De extra uitlegblokken in deze oefening leggen uit *waarom* je iets doet.
> Als je al ervaring hebt met ArgoCD/GitOps, kun je die blokken gerust overslaan en alleen de stappen/snippets uitvoeren. > Als je al ervaring hebt met ArgoCD/GitOps, kun je die blokken gerust overslaan en alleen de stappen/snippets uitvoeren.
## Vooraf lezen (optioneel)
In deze workshop gebruiken we **Helm** voor het eerst in **stap 1**,
waar `bootstrap.sh` ArgoCD installeert via een Helm chart.
Wil je Helm eerst kort opfrissen:
- Helm docs (startpunt): https://helm.sh/docs/
- Helm quickstart: https://helm.sh/docs/intro/quickstart/
--- ---
## Vereisten ## Vereisten
@ -133,6 +143,9 @@ 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)**
Direct naar nieuw token:
- Fine-grained: https://github.com/settings/personal-access-tokens/new
- Classic: https://github.com/settings/tokens/new
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:

View file

@ -6,7 +6,6 @@ port-forward.
--- ---
## Wat je leert ## Wat je leert
- Waarom je MetalLB nodig hebt op een bare-metal of lokaal Kubernetes-cluster - Waarom je MetalLB nodig hebt op een bare-metal of lokaal Kubernetes-cluster
@ -35,8 +34,8 @@ L2-modus gebruikt hij ARP — jouw laptop vraagt "wie heeft 192.168.56.200?" en
**Ingress-Nginx** is één LoadBalancer-service die van MetalLB één IP krijgt. Al je apps delen dat IP — Nginx routeert op **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. 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 **nip.io** is publieke wildcard-DNS: `iets.192.168.56.200.nip.io` resolved altijd naar `192.168.56.200`. Geen noodzaak
`/etc/hosts` aanpassen. meer om je `/etc/hosts` aanpassen.
--- ---
@ -48,31 +47,22 @@ Maak de volgende bestanden aan:
**`manifests/networking/metallb/values.yaml`** **`manifests/networking/metallb/values.yaml`**
Wat dit doet: > [!TIP]
- Configureert de MetalLB speaker pod. > **Wat dit doet**
- Met deze `toleration` mag de speaker op de control-plane node draaien. > - Dit is de Helm-values file voor MetalLB.
- Dat is nodig in deze workshop, omdat je VM meestal maar 1 node heeft. > - In deze workshop-VM kun je hem leeg laten; de standaard chart-values zijn genoeg.
Termen uitgelegd:
- `speaker`: de MetalLB component die op nodes draait en op het netwerk "antwoordt" voor een toegewezen
LoadBalancer-IP (in L2-modus via ARP).
- `tolerations`: een Kubernetes-mechanisme waarmee een pod tóch op een node mag landen die een `taint` heeft.
Control-plane nodes zijn vaak getaint met `NoSchedule`; zonder toleration wordt de speaker daar niet ingepland.
```yaml ```yaml
speaker: {}
tolerations:
- key: node-role.kubernetes.io/control-plane
operator: Exists
effect: NoSchedule
``` ```
**`manifests/networking/metallb/metallb-config.yaml`** **`manifests/networking/metallb/metallb-config.yaml`**
Wat dit doet: > [!TIP]
- `IPAddressPool` bepaalt uit welke range MetalLB IP's mag uitdelen. > **Wat dit doet**
- `L2Advertisement` maakt die pool zichtbaar op je host-only netwerk via ARP. > - `IPAddressPool` bepaalt uit welke range MetalLB IP's mag uitdelen.
- Daardoor kan je laptop services op dat IP direct bereiken. > - `L2Advertisement` maakt die pool zichtbaar op je host-only netwerk via ARP.
> - Daardoor kan je laptop services op dat IP direct bereiken.
```yaml ```yaml
apiVersion: metallb.io/v1beta1 apiVersion: metallb.io/v1beta1
@ -96,11 +86,12 @@ spec:
**`apps/networking/metallb.yaml`** **`apps/networking/metallb.yaml`**
Wat dit doet: > [!TIP]
- Installeert MetalLB via ArgoCD als aparte `Application`. > **Wat dit doet**
- De chart komt van de upstream Helm repo; jouw repo levert de values via `$values/...`. > - Installeert MetalLB via ArgoCD als aparte `Application`.
- `sync-wave: "1"` zorgt dat MetalLB eerst klaar is. > - De chart komt van de upstream Helm repo; jouw repo levert de values via `$values/...`.
- `ignoreDifferences` voorkomt bekende CRD `caBundle` drift door dynamische webhook certs. > - `sync-wave: "1"` zorgt dat MetalLB eerst klaar is.
> - `ignoreDifferences` voorkomt bekende CRD `caBundle` drift door dynamische webhook certs.
```yaml ```yaml
apiVersion: argoproj.io/v1alpha1 apiVersion: argoproj.io/v1alpha1
@ -141,10 +132,11 @@ spec:
**`apps/networking/metallb-config.yaml`** **`apps/networking/metallb-config.yaml`**
Wat dit doet: > [!TIP]
- Past jouw IP-pool/L2-config toe als losse ArgoCD `Application`. > **Wat dit doet**
- Die split houdt "installatie" en "runtime-config" van MetalLB uit elkaar. > - Past jouw IP-pool/L2-config toe als losse ArgoCD `Application`.
- `sync-wave: "2"` laat dit pas lopen nadat MetalLB zelf staat. > - Die split houdt "installatie" en "runtime-config" van MetalLB uit elkaar.
> - `sync-wave: "2"` laat dit pas lopen nadat MetalLB zelf staat.
```yaml ```yaml
apiVersion: argoproj.io/v1alpha1 apiVersion: argoproj.io/v1alpha1
@ -177,10 +169,11 @@ spec:
**`manifests/networking/ingress-nginx/values.yaml`** **`manifests/networking/ingress-nginx/values.yaml`**
Wat dit doet: > [!TIP]
- Zet ingress-nginx neer met een `LoadBalancer` service. > **Wat dit doet**
- Dat service-IP wordt vast op `192.168.56.200` gezet. > - Zet ingress-nginx neer met een `LoadBalancer` service.
- Zo kun je stabiele hostnames gebruiken met `nip.io`. > - Dat service-IP wordt vast op `192.168.56.200` gezet.
> - Zo kun je stabiele hostnames gebruiken met `nip.io`.
```yaml ```yaml
controller: controller:
@ -198,10 +191,11 @@ controller:
**`apps/networking/ingress-nginx.yaml`** **`apps/networking/ingress-nginx.yaml`**
Wat dit doet: > [!TIP]
- Installeert ingress-nginx via ArgoCD. > **Wat dit doet**
- Ook hier: chart upstream, values uit jouw repo. > - Installeert ingress-nginx via ArgoCD.
- `sync-wave: "3"` laat ingress pas starten nadat MetalLB + config klaar zijn. > - Ook hier: chart upstream, values uit jouw repo.
> - `sync-wave: "3"` laat ingress pas starten nadat MetalLB + config klaar zijn.
```yaml ```yaml
apiVersion: argoproj.io/v1alpha1 apiVersion: argoproj.io/v1alpha1
@ -272,10 +266,11 @@ Vanuit je laptop:
**`manifests/apps/podinfo/ingress.yaml`** **`manifests/apps/podinfo/ingress.yaml`**
Wat dit doet: > [!TIP]
- Definieert de HTTP-route voor podinfo. > **Wat dit doet**
- `ingressClassName: nginx` bindt deze Ingress aan ingress-nginx. > - Definieert de HTTP-route voor podinfo.
- De hostnaam met `nip.io` wijst naar jouw MetalLB IP. > - `ingressClassName: nginx` bindt deze Ingress aan ingress-nginx.
> - De hostnaam met `nip.io` wijst naar jouw MetalLB IP.
```yaml ```yaml
apiVersion: networking.k8s.io/v1 apiVersion: networking.k8s.io/v1
@ -313,10 +308,11 @@ Open vanuit je laptop: **http://podinfo.192.168.56.200.nip.io**
Pas `manifests/argocd/values.yaml` aan. Zoek het uitgecommentarieerde ingress-blok en verwijder de `#`-tekens: Pas `manifests/argocd/values.yaml` aan. Zoek het uitgecommentarieerde ingress-blok en verwijder de `#`-tekens:
Wat dit doet: > [!TIP]
- Schakelt ingress in voor de ArgoCD server zelf. > **Wat dit doet**
- Daarna kun je ArgoCD via browser-URL gebruiken in plaats van port-forward. > - Schakelt ingress in voor de ArgoCD server zelf.
- De `hostname` moet matchen met het IP dat ingress-nginx exposeert. > - Daarna kun je ArgoCD via browser-URL gebruiken in plaats van port-forward.
> - De `hostname` moet matchen met het IP dat ingress-nginx exposeert.
```yaml ```yaml
ingress: ingress:
@ -340,6 +336,32 @@ Open: **http://argocd.192.168.56.200.nip.io**
--- ---
## Extra (optioneel) — alleen bij control-plane taints
Als `metallb-speaker` pods `Pending` blijven en je node heeft een control-plane `NoSchedule` taint,
voeg dan deze toleration toe in `manifests/networking/metallb/values.yaml`:
```yaml
speaker:
tolerations:
- key: node-role.kubernetes.io/control-plane
operator: Exists
effect: NoSchedule
```
> [!TIP]
> **Wat dit doet**
> - `tolerations` zijn alleen nodig als je cluster control-plane `NoSchedule` taints gebruikt.
>
> **Termen uitgelegd**
>- `speaker`: de MetalLB component die op nodes draait en op het netwerk "antwoordt" voor een toegewezen
> LoadBalancer-IP (in L2-modus via ARP).
> - `tolerations`: een Kubernetes-mechanisme waarmee een pod toch op een node mag landen die een `taint` heeft.
> Control-plane nodes zijn vaak getaint met `NoSchedule`; zonder toleration wordt de speaker daar niet ingepland.
Commit en push daarna opnieuw, zodat ArgoCD MetalLB met deze values heruitrolt.
---
## Verwacht resultaat ## Verwacht resultaat
| URL | App | | URL | App |

View file

@ -26,11 +26,17 @@
## Vereisten ## Vereisten
- Oefening 03 afgerond (Ingress-Nginx werkt) - Oefening 03 afgerond (Ingress-Nginx werkt)
- Een Cloudflare account
- Je repo/fork op `main` - Je repo/fork op `main`
Optioneel: Optioneel (alleen nodig voor **Route A** hieronder):
- Eigen domein in Cloudflare (alleen nodig voor **Route B** hieronder)
- [cloudflared](https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/downloads/) op de
host _of_ vm
Optioneel (alleen nodig voor **Route B** hieronder):
- Een Cloudflare account
- Eigen domein in Cloudflare
--- ---
@ -106,6 +112,7 @@ el-github-push-listener.tekton-pipelines.svc:8080
``` ```
Belangrijk: Belangrijk:
- Dit werkt ook als je cluster alleen op host-only netwerk draait. - Dit werkt ook als je cluster alleen op host-only netwerk draait.
- Cloudflare bereikt je cluster via de actieve tunnelverbinding, niet via je LAN-IP. - Cloudflare bereikt je cluster via de actieve tunnelverbinding, niet via je LAN-IP.
@ -130,8 +137,8 @@ In dezelfde tunnel:
1. Ga naar **Public Hostnames** 1. Ga naar **Public Hostnames**
2. Voeg een hostname toe, bijvoorbeeld: 2. Voeg een hostname toe, bijvoorbeeld:
- Subdomain: `tekton-webhook` - Subdomain: `tekton-webhook`
- Domain: `<jouw-domein>` - Domain: `<jouw-domein>`
3. Service type: `HTTP` 3. Service type: `HTTP`
4. URL: `http://el-github-push-listener.tekton-pipelines.svc.cluster.local:8080` 4. URL: `http://el-github-push-listener.tekton-pipelines.svc.cluster.local:8080`
5. Sla op 5. Sla op
@ -233,6 +240,7 @@ spec:
``` ```
Vervang: Vervang:
- `PLAK_HIER_JE_CLOUDFLARE_TUNNEL_TOKEN` - `PLAK_HIER_JE_CLOUDFLARE_TUNNEL_TOKEN`
- `JOUW_FORK_URL` - `JOUW_FORK_URL`
@ -277,19 +285,20 @@ Gebruik in beide gevallen **niet** meer de host-only URL met `192.168.56.200.nip
## Probleemoplossing ## Probleemoplossing
| Symptoom | Oplossing | | Symptoom | Oplossing |
|---|---| |--------------------------------------------------------------|------------------------------------------------------------------------------------|
| cloudflared pod blijft CrashLoopBackOff | Controleer of de tunnel token klopt en niet verlopen/ingetrokken is | | cloudflared pod blijft CrashLoopBackOff | Controleer of de tunnel token klopt en niet verlopen/ingetrokken is |
| Tunnel lijkt up, maar webhook geeft 502/504 | Controleer of `el-github-push-listener` service bestaat in `tekton-pipelines` | | Tunnel lijkt up, maar webhook geeft 502/504 | Controleer of `el-github-push-listener` service bestaat in `tekton-pipelines` |
| Geen verkeer in Tekton na GitHub push | Controleer GitHub webhook deliveries + event type `push` + secret | | Geen verkeer in Tekton na GitHub push | Controleer GitHub webhook deliveries + event type `push` + secret |
| Argo app `cloudflared` blijft `Unknown` | Controleer of `repoURL` in `apps/networking/cloudflared.yaml` naar jouw fork wijst | | Argo app `cloudflared` blijft `Unknown` | Controleer of `repoURL` in `apps/networking/cloudflared.yaml` naar jouw fork wijst |
| `trycloudflare.com` URL werkt eerst wel maar later niet meer | Quick tunnel is tijdelijk; start opnieuw of gebruik Route B | | `trycloudflare.com` URL werkt eerst wel maar later niet meer | Quick tunnel is tijdelijk; start opnieuw of gebruik Route B |
--- ---
## Security-opmerking ## Security-opmerking
Gebruik in een echte omgeving liever: Gebruik in een echte omgeving liever:
- externe secret manager voor tunnel token - externe secret manager voor tunnel token
- aparte Cloudflare tunnel per omgeving - aparte Cloudflare tunnel per omgeving
- least-privilege Cloudflare account/API instellingen - least-privilege Cloudflare account/API instellingen
@ -304,7 +313,7 @@ Wil je een voorbeeld zien zonder alles handmatig te typen?
- Branch: `solution/03b-cloudflare-tunnel` - Branch: `solution/03b-cloudflare-tunnel`
- Daarin staan: - Daarin staan:
- `apps/networking/cloudflared.yaml` - `apps/networking/cloudflared.yaml`
- `manifests/networking/cloudflared/namespace.yaml` - `manifests/networking/cloudflared/namespace.yaml`
- `manifests/networking/cloudflared/token.secret.yaml` (placeholder token) - `manifests/networking/cloudflared/token.secret.yaml` (placeholder token)
- `manifests/networking/cloudflared/deployment.yaml` - `manifests/networking/cloudflared/deployment.yaml`

View file

@ -21,6 +21,18 @@ volledige GitOps CI/CD-loop.
> Alle alinea's met "Waarom dit" kun je zien als mini-achtergrond. > Alle alinea's met "Waarom dit" kun je zien als mini-achtergrond.
> Gevorderden kunnen die overslaan en direct de snippets volgen. > Gevorderden kunnen die overslaan en direct de snippets volgen.
## Vooraf lezen (optioneel)
Als Tekton nieuw voor je is, skim eerst deze pagina's:
- Tekton docs (startpunt): https://tekton.dev/docs/
- Core concepten (Tasks, Pipelines, PipelineRuns): https://tekton.dev/docs/pipelines/
- Eerste voorbeeldpipeline: https://tekton.dev/docs/getting-started/pipelines/
- Kustomize docs (startpunt): https://kubectl.docs.kubernetes.io/references/kustomize/
In deze workshop gebruiken we **Kustomize** voor het eerst in **stap 1**
met `manifests/ci/tekton/kustomization.yaml`.
--- ---
## De loop ## De loop
@ -53,6 +65,9 @@ Oefeningen 0103 afgerond. podinfo is bereikbaar via **http://podinfo.192.168.
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)
Maak er direct een aan via:
- Fine-grained: https://github.com/settings/personal-access-tokens/new
- Classic: https://github.com/settings/tokens/new
--- ---
@ -76,8 +91,8 @@ Waarom dit:
- `release.yaml` installeert Tekton Pipelines (controller, webhook, CRDs). - `release.yaml` installeert Tekton Pipelines (controller, webhook, CRDs).
- De `patches` regel past de namespace aan die al in de upstream release zit. - De `patches` regel past de namespace aan die al in de upstream release zit.
- Zonder patch faalt de eerste TaskRun vaak op Pod Security admission. - Zonder patch faalt de eerste TaskRun vaak op Pod Security Admission (PSA).
- Pod Security Admission is een Kubernetes-mechanisme dat per namespace bepaalt hoe streng pod-beveiliging wordt - Pod Security Admission (PSA) is een Kubernetes-mechanisme dat per namespace bepaalt hoe streng pod-beveiliging wordt
afgedwongen. afgedwongen.
- In deze oefening zet de upstream Tekton install de namespace effectief op `restricted`; dat profiel eist o.a. - In deze oefening zet de upstream Tekton install de namespace effectief op `restricted`; dat profiel eist o.a.
`runAsNonRoot`, `seccompProfile` en `allowPrivilegeEscalation=false`. `runAsNonRoot`, `seccompProfile` en `allowPrivilegeEscalation=false`.
@ -176,7 +191,7 @@ Waarom dit:
- Alle permissies voor `validate` en eventuele cluster-calls hangen aan dit account. - Alle permissies voor `validate` en eventuele cluster-calls hangen aan dit account.
**`manifests/ci/pipeline/pipeline.yaml`** — zie de solution branch voor de volledige inhoud, of kopieer uit **`manifests/ci/pipeline/pipeline.yaml`** — zie de solution branch voor de volledige inhoud, of kopieer uit
`reference-solution`: `reference-solution`:
> **HOST** > **HOST**
> ```bash > ```bash
@ -356,7 +371,11 @@ Dit is een verplichte stap vóór je de PipelineRun triggert.
Zonder `git-credentials` secret faalt de `clone` task direct. Zonder `git-credentials` secret faalt de `clone` task direct.
De pipeline moet kunnen pushen naar jouw fork. De pipeline moet kunnen pushen naar jouw fork.
Maak een GitHub PAT aan met `repo`-scope en voer daarna een van deze opties uit: Maak een GitHub PAT aan met `repo`-scope en voer daarna een van deze opties uit.
Direct links:
- Fine-grained token: https://github.com/settings/personal-access-tokens/new
- Classic token: https://github.com/settings/tokens/new
> **VM** > **VM**
> ```bash > ```bash