docs: improve markdown formatting and readability
This commit is contained in:
parent
cc0d36bae6
commit
fc0eb1b0c4
8 changed files with 157 additions and 84 deletions
21
README.md
21
README.md
|
|
@ -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.
|
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 |
|
||||||
|
|
@ -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`.
|
||||||
|
|
||||||
|
|
@ -114,7 +128,7 @@ 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"` |
|
||||||
|
|
@ -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. |
|
| 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
|
||||||
|
|
|
||||||
|
|
@ -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,6 +83,7 @@ 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:
|
||||||
|
|
@ -90,6 +94,7 @@ Kies een van deze twee paden:
|
||||||
- `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**:
|
||||||
|
|
@ -97,9 +102,11 @@ Kies een van deze twee paden:
|
||||||
- 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
|
||||||
|
|
@ -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.
|
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.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
@ -211,7 +224,7 @@ 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 |
|
||||||
|
|
||||||
|
|
@ -219,4 +232,6 @@ podinfo Synced Healthy
|
||||||
|
|
||||||
## 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.
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
@ -260,7 +273,7 @@ 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 |
|
||||||
|
|
||||||
|
|
@ -271,7 +284,7 @@ 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` |
|
||||||
|
|
@ -281,4 +294,5 @@ Beide bereikbaar vanaf je laptop zonder port-forward.
|
||||||
|
|
||||||
## 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.
|
||||||
|
|
|
||||||
|
|
@ -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 01–03 afgerond. podinfo is bereikbaar via **http://podinfo.192.168.56.200.nip.io** en toont versie **6.6.2**.
|
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:
|
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
|
||||||
|
|
@ -259,7 +267,7 @@ 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 |
|
||||||
|
|
|
||||||
|
|
@ -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
|
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 |
|
||||||
|
|
@ -106,6 +107,7 @@ Kijk in de ArgoCD UI — binnen seconden gaat de podinfo-app op **OutOfSync**, e
|
||||||
|
|
||||||
## 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.
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,8 @@
|
||||||
|
|
||||||
Oefeningen 01–03 afgerond. Ingress-Nginx draait en nip.io-URLs zijn bereikbaar vanaf je laptop.
|
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
|
### 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
|
||||||
|
|
@ -147,7 +150,7 @@ 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.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
@ -186,7 +190,7 @@ 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 |
|
||||||
|
|
|
||||||
|
|
@ -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 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:
|
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
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue