Runbooks
Operationele how-to's, afgeleid van de Ansible-playbooks en Terraform-modules in de repo.
Alle homelab-commando's draaien vanaf jumpy — niet vanaf alma (alma's kubectl
wijst naar productie). Ansible-commando's draaien vanuit ansible/, Terraform vanuit
de betreffende module onder terraform/.
VM's provisionen (Terraform)
De Kubernetes-VM's (3 control-plane + 3 workers) worden data-driven aangemaakt door per-shape templates te clonen. De shape (cpu/mem/disk) komt 100% uit de template — er zijn bewust geen post-clone hardware-overrides (zie Beslissingen).
cd terraform/k8s-cluster
terraform plan
terraform apply # vereist bevestiging
Kubernetes zelf wordt niet door Terraform geconfigureerd, maar door de Ansible-playbooks hieronder.
Templates bouwen
Bouwt de K8s-VM-templates op de Proxmox-hosts. VMID's zijn cluster-breed uniek, dus elke host heeft zijn eigen reeks (px-01 → 9001/9002, px-02 → 9011/9012, px-03 → 9021/9022).
ansible-playbook -i inventory/proxmox-hosts.yml playbooks/build-k8s-templates.yml
K8s greenfield bootstrap
Volgorde voor een vers HA-cluster (vanuit ansible/):
# 1. OS-prerequisites op alle nodes (incl. containerd)
ansible-playbook -i inventory/hosts.yml playbooks/prepare-nodes.yml
# 2. kubeadm/kubelet/kubectl installeren
ansible-playbook -i inventory/hosts.yml playbooks/kubeadm-install-packages.yml
# 3. (alleen bij herbouw) vorige clusterstaat opruimen
ansible-playbook -i inventory/hosts.yml playbooks/kubeadm-cleanup-before-bootstrap.yml
# 4. HA control-plane bootstrappen (kube-vip VIP .201) + workers joinen
ansible-playbook -i inventory/hosts.yml playbooks/kubeadm-bootstrap.yml
# 5. Post-bootstrap: kubeconfig ophalen + addons
ansible-playbook -i inventory/hosts.yml playbooks/kubeadm-post-bootstrap.yml
De kubeconfig blijft naar de kube-vip VIP 192.168.178.201:6443 wijzen — dat overleeft
het uitvallen van een control-plane-node.
Node-onderhoud & upgrades
Housekeeping (journald-cap + wekelijkse cleanup-timer, geen upgrades):
ansible-playbook -i inventory/hosts.yml playbooks/node-maintenance.yml
ansible-playbook -i inventory/proxmox-hosts.yml playbooks/node-maintenance.yml
Package-updates, drain-aware, één node tegelijk (draai uitsluitend vanaf jumpy — gebruikt
kubectl via delegate_to: localhost):
# K8s-nodes: drain → upgrade → reboot → uncordon
ansible-playbook -i inventory/hosts.yml playbooks/node-update.yml
# VM's: upgrade → reboot
ansible-playbook -i inventory/proxmox-hosts.yml playbooks/node-update.yml
node-update.yml houdt kubelet/kubeadm/kubectl op apt-mark hold. Een cluster-versie-hop
is een aparte operatie via playbooks/kubeadm-upgrade.yml.
Cilium upgraden
helm upgrade cilium cilium/cilium -n kube-system \
-f cluster-config/infra/cilium/values.yaml
Kerninstellingen: kubeProxyReplacement=true, Hubble aan, Gateway API aan.
Applicaties deployen (Proxmox-VM's)
De Nextcloud-tenants, proxy en Portainer draaien als Docker-compose-stacks op de laptop-Proxmox-VM's. Deploy via Ansible:
ansible-playbook -i inventory/proxmox-hosts.yml playbooks/deploy-nextcloud.yml
ansible-playbook -i inventory/proxmox-hosts.yml playbooks/deploy-proxy.yml
ansible-playbook -i inventory/proxmox-hosts.yml playbooks/deploy-portainer.yml
CrowdSec uitrollen (edge-detectie op de proxy)
CrowdSec draait detection-only naast Caddy op de proxy-VM (192.168.178.50): de
engine parst Caddy's JSON-access-log en genereert alerts/decisions, maar er is (nog) geen
bouncer — er wordt niets geblokkeerd. Achtergrond: zie Beslissingen.
Prerequisite: Caddy moet zijn access-log schrijven naar de gedeelde host-bind-mount
/var/log/caddy/access.log (de (accesslog)-snippet in de Caddyfile). Draai daarom eerst
deploy-proxy.yml:
# 1. Caddy mét access-logging (prerequisite — schrijft /var/log/caddy/access.log)
ansible-playbook -i inventory/proxmox-hosts.yml playbooks/deploy-proxy.yml
# 2. CrowdSec-engine ernaast
ansible-playbook -i inventory/proxmox-hosts.yml playbooks/deploy-crowdsec-proxy.yml
De deploy is zelf-verifiërend: hij faalt hard als cscli lapi status niet binnen
~1 min gezond opkomt (collections + LAPI-startup duren even) en print daarna cscli metrics.
Inspecteren (detection-only — alerts, geen blocks):
ssh 192.168.178.50 'docker exec crowdsec cscli metrics'
ssh 192.168.178.50 'docker exec crowdsec cscli alerts list'
Homelab gracefully afsluiten (stroomonderbreking)
scripts/graceful-shutdown.sh draait vanaf jumpy (die blijft up) en zet de hele
homelab netjes uit voor een geplande stroomonderbreking: per Proxmox-host worden alle
draaiende VM's en containers gracefully afgesloten (ACPI), daarna halt de host. Het script
pollt tot alles down is en geeft het sein "stroom kan eraf".
./scripts/graceful-shutdown.sh
Power-up daarna (handmatig): hosts weer aanzetten — de K8s-VM's (onboot=1) starten
vanzelf. Verifieer:
pvecm status # 3 nodes quorate
kubectl get nodes # 6× Ready (vanaf jumpy)