Ga naar inhoud

Stappenplan: Van Kubernetes naar GitOps

Dit document beschrijft het pad van een werkend Kubernetes cluster naar een volledig GitOps-beheerde omgeving.

Uitgangspunt

Component Status
Kubernetes v1.29.2 ✅ Draait (kubeadm, systemd)
containerd ✅ Runtime
Cilium 1.19.0 ✅ CNI, kubeProxyReplacement=true
CoreDNS (kube-dns) ✅ Cluster DNS 10.32.0.10
Gateway API CRDs ✅ Geïnstalleerd (Stap 1)
Cilium Gateway controller ✅ Actief (GatewayClass aanwezig)
MetalLB ✅ L2 mode, pool 192.0.2.220–230
cert-manager ✅ DNS-01 wildcard *.westerweel.work
Argo CD ✅ argocd.westerweel.work

Doel

Internet
    │
    ▼
[Ziggo Router] ─── port forward 443 ───►  [MetalLB VIP]
                                               │
                                               ▼
                                    [Cilium Gateway + TLS]
                                         (Envoy proxy)
                                               │
                    ┌──────────────────────────┼──────────────────────────┐
                    │                          │                          │
                    ▼                          ▼                          ▼
           argocd.westerweel.work    app.westerweel.work    hubble.westerweel.work
                    │
                    ▼
              [Argo CD]
                    │
                    ▼
         Git repo (declaratief)

Stappen

Stap 1: Gateway API CRDs

Doel: Gateway API Custom Resource Definitions installeren.

Waarom: - Gateway API is de Kubernetes-standaard opvolger van Ingress - CRDs moeten bestaan VOORDAT Cilium Gateway controller werkt - Cilium installeert ze niet automatisch (bewuste keuze) - Versie moet compatible zijn met Cilium 1.19.0

Verificatie:

kubectl get crd gateways.gateway.networking.k8s.io
kubectl get crd httproutes.gateway.networking.k8s.io
kubectl get crd gatewayclasses.gateway.networking.k8s.io

Documentatie na voltooiing: docs/21-gateway-api-crds.md


Stap 2: Cilium Gateway API enablen

Doel: Cilium's Gateway controller activeren.

Waarom: - Cilium kan Gateway resources afhandelen met ingebouwde Envoy - Geen aparte ingress controller nodig - Native eBPF integratie - Je hebt Cilium al, dus minimale extra complexity

Risico's: - Helm upgrade kan Cilium pods herstarten (korte interruption) - Verkeerde values = broken networking

Check vóór je begint (alles moet kloppen):

kubectl get nodes
kubectl get pods -n kube-system -l k8s-app=kube-dns
kubectl get pods -n kube-system -l k8s-app=cilium -o wide
kubectl get pods -n kube-system -l k8s-app=hubble-relay
kubectl get crd | grep gateway.networking.k8s.io

→ Nodes Ready, CoreDNS Running, Cilium op alle nodes, Hubble Relay 1/1, vijf Gateway CRDs aanwezig.

Uitvoeren: Zie 22-cilium-gateway.md voor commando's en Helm upgrade.

Verificatie na Stap 2:

kubectl get gatewayclass
# Moet "cilium" tonen met status "Accepted: True"

Documentatie na voltooiing: docs/22-cilium-gateway.md


Stap 3: MetalLB

Doel: LoadBalancer IP's kunnen uitdelen op bare-metal.

Waarom: - Zonder MetalLB: LoadBalancer Services blijven "Pending" - Gateway maakt een LoadBalancer Service - Je wilt een vast LAN IP voor de Gateway - Dat IP kun je port-forwarden op je Ziggo router

Risico's: - IP conflict met DHCP range (gebruik range buiten DHCP; zie 02-network.md) - ARP issues in L2 mode

Check vóór je begint: Nodes Ready, GatewayClass aanwezig, Cilium draait. DHCP-range (switch/router/…) niet over 192.0.2.220–230.

Uitvoeren: Zie 23-metallb.md — MetalLB manifest van upstream, daarna kubectl apply -f kubernetes/infrastructure/metallb/ip-pool.yaml.

Verificatie:

kubectl get svc -A -o wide | grep LoadBalancer
# EXTERNAL-IP moet een IP tonen, niet "<pending>"

Documentatie na voltooiing: docs/23-metallb.md


Stap 4: cert-manager + DNS-01 wildcard

Doel: Automatische TLS certificaten van Let's Encrypt.

Waarom: - HTTPS is vereist (browsers, security) - DNS-01 challenge: geen poort 80 nodig, wildcard mogelijk - *.westerweel.work dekt alle subdomeinen - Automatische renewal

Risico's: - DNS API credentials in cluster (Secret, niet in Git) - Let's Encrypt rate limits bij veel aanvragen (wij gebruiken alleen prod)

Check vóór je begint: MetalLB draait; je hebt een Cloudflare API-token voor het domein.

Uitvoeren: Zie 24-cert-manager.md — Helm install met values uit repo, Secret (Cloudflare of RFC2136), ClusterIssuer prod. Config in repo voor later Argo CD.

Verificatie:

kubectl get clusterissuer
kubectl get certificate -A
# Certificate status "Ready: True" na eerste aanvraag

Documentatie na voltooiing: docs/24-cert-manager.md


Stap 5: Gateway + TLS termination

Doel: HTTPS Gateway die al het verkeer ontvangt.

Waarom: - Centrale ingress voor alle services - TLS termination (backends praten HTTP) - HTTPRoutes routeren naar juiste service

Check vóór je begint: MetalLB en cert-manager (ClusterIssuer prod) draaien.

Uitvoeren: Zie 25-gateway-tls.md — namespace + Certificate, dan Gateway, dan DNS, dan test-app + HTTPRoute.

Verificatie:

curl -v https://test.westerweel.work
# Moet valid TLS cert tonen

Documentatie na voltooiing: docs/25-gateway-tls.md


Stap 6: Argo CD bootstrap

Doel: Argo CD installeren en via Gateway bereikbaar maken.

Waarom: - Argo CD wordt de GitOps controller - Alle deployments via Git - UI voor visibility

Verificatie:

# Browser: https://argocd.westerweel.work
# Moet login page tonen

Documentatie na voltooiing: docs/26-argocd-bootstrap.md


Stap 7: GitOps root app

Doel: App-of-apps pattern, alles onder Git beheer.

Waarom: - Eén root Application beheert alle andere - Reproduceerbaar cluster - Self-healing (drift correctie)

Verificatie:

# Argo CD UI: alle apps "Synced" en "Healthy"

Documentatie na voltooiing: docs/27-gitops-root-app.md


Voortgang

Stap Status Datum
1. Gateway API CRDs 2026-02-17
2. Cilium Gateway 2026-02-24
3. MetalLB 2026-03-06
4. cert-manager 2026-03-06
5. Gateway TLS 2026-03-06
6. Argo CD 2026-03-07
7. GitOps root -

Netwerk

Netwerk Range Nodes
LAN 192.0.2.0/24 cp-01 (.201), node-01 (.202), node-02 (.203)
Pod CIDR 10.200.0.0/16 /24 per node
Service CIDR 10.32.0.0/24 ClusterIP's

Beslissingen

  • DNS Provider: Cloudflare (voor cert-manager DNS-01)

Migratie (Hard Way → kubeadm)

Een logisch cutoff om te plannen migreren naar kubeadm (bijv. voor CKA of productiewaardiger setup):

  • Na Stap 5 (Gateway + TLS): We migreren na deze stap: Gateway + TLS werkt, daarna nieuwe cluster met kubeadm; “compleet” config/workloads uit repo toepassen, secrets opnieuw aanmaken.
  • Alternatief later: Na Stap 7 zou de hele stack in Git staan; dan migreer je een compleet homelab.

Er is geen in-place upgrade; je bouwt een nieuwe cluster op dezelfde hosts (geen twee clusters naast elkaar) en past config/workloads uit de repo opnieuw toe. Exacte stappen: 30-migratie-kubeadm.md.