ops-demo/docs/02-deploy-podinfo.md
2026-02-28 22:42:09 +01:00

237 lines
4.7 KiB
Markdown

# Oefening 02 — podinfo deployen via GitOps
**Tijd**: ~30 minuten
**Doel**: Een echte applicatie deployen puur via Git — geen `kubectl apply`.
---
## Wat je leert
- Hoe je een ArgoCD Application toevoegt door één bestand te committen
- Hoe je de sync-status en health van een applicatie leest
- De GitOps-loop in de praktijk: commit → push → ArgoCD detecteert → cluster bijgewerkt
---
## Vereisten
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.
---
## Stappen
### 1. De manifests aanmaken
Maak de volgende bestanden aan:
**`manifests/apps/podinfo/namespace.yaml`**
```yaml
apiVersion: v1
kind: Namespace
metadata:
name: podinfo
```
**`manifests/apps/podinfo/deployment.yaml`**
```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: podinfo
namespace: podinfo
spec:
replicas: 1
selector:
matchLabels:
app: podinfo
template:
metadata:
labels:
app: podinfo
spec:
containers:
- name: podinfo
image: ghcr.io/stefanprodan/podinfo:6.6.2
ports:
- containerPort: 9898
name: http
env:
- name: PODINFO_UI_COLOR
value: "#6C48C5"
readinessProbe:
httpGet:
path: /readyz
port: 9898
initialDelaySeconds: 5
periodSeconds: 10
resources:
requests:
cpu: 50m
memory: 64Mi
```
**`manifests/apps/podinfo/service.yaml`**
```yaml
apiVersion: v1
kind: Service
metadata:
name: podinfo
namespace: podinfo
spec:
selector:
app: podinfo
ports:
- port: 80
targetPort: 9898
name: http
```
---
### 2. De ArgoCD Application aanmaken
**`apps/apps/podinfo.yaml`**
```yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: podinfo
namespace: argocd
annotations:
argocd.argoproj.io/sync-wave: "10"
spec:
project: workshop
source:
repoURL: JOUW_FORK_URL
targetRevision: HEAD
path: manifests/apps/podinfo
destination:
server: https://kubernetes.default.svc
namespace: podinfo
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true
```
Vervang `JOUW_FORK_URL` door jouw fork-URL.
---
### 3. Committen en pushen
```bash
git add apps/apps/podinfo.yaml manifests/apps/podinfo/
git commit -m "feat: deploy podinfo via GitOps"
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.
---
### 4. Wachten tot het Synced is
```bash
kubectl get application podinfo -n argocd -w
```
Wacht tot je `Synced` en `Healthy` ziet. Dan:
```bash
kubectl get pods -n podinfo
# NAME READY STATUS RESTARTS AGE
# podinfo-xxx-xxx 1/1 Running 0 30s
```
---
### 5. Controleer dat de app werkt
```bash
kubectl port-forward svc/podinfo -n podinfo 9898:80
```
In een ander terminal (of via curl):
```bash
curl http://localhost:9898
# {"hostname":"podinfo-xxx","version":"6.6.2", ...}
```
Versie `6.6.2` — dat klopt met de image-tag in `deployment.yaml`.
---
### 6. Maak een GitOps-wijziging
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"
```
Commit en push:
```bash
git add manifests/apps/podinfo/deployment.yaml
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.
---
## Verwacht resultaat
```
NAME SYNC STATUS HEALTH STATUS
podinfo Synced Healthy
```
---
## Probleemoplossing
| Symptoom | Oplossing |
|----------------------------------|---------------------------------------------------------------|
| Application blijft "Progressing" | `kubectl describe pod -n podinfo` — waarschijnlijk image pull |
| ArgoCD toont OutOfSync na push | Klik **Refresh** of wacht 3 minuten |
---
## 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.