Infrastructure as Code
Azure k3s-platform
Een klein Kubernetes-platform op productieniveau in Azure, alleen uit code gebouwd: Terraform maakt de cloud-onderdelen, Ansible hardt de servers en installeert k3s, en een pipeline voert elke wijziging na beoordeling uit, zonder opgeslagen secrets.
In het kort
- 3
- VM's met één commando
- 0
- secrets in de pipeline (OIDC)
- 2
- controles voor een wijziging: plan en goedkeuring
- 1
- commando om alles te verwijderen
Het doel
Handmatig gebouwde servers groeien uit elkaar, niemand weet wie wat heeft gewijzigd, en een verloren VM opnieuw bouwen kost een dag. Het doel: een platform waarin de hele omgeving code is, elke wijziging eerst als plan wordt beoordeeld, de servers elke keer op dezelfde manier worden gehard en de kosten onder controle blijven.
Wat het laat zien
- Infrastructure as Code
- Terraform (azurerm 4) met twee modules (netwerk, node) en remote state in Azure Storage met Entra ID-login.
- Netwerk
- VNet en NSG met standaard weigeren, NAT-gateway voor uitgaand verkeer, een Standard Load Balancer voor 80/443, beheertoegang alleen vanaf jouw IP.
- Identiteit en secrets
- GitHub OIDC (geen client-secret), managed identities op de VM's, het k3s-join-token in Key Vault.
- Hardening
- SSH, sysctl, auditd, fail2ban, automatische updates; k3s-versleuteling van secrets, Pod Security, audit-log en een versleuteld pod-netwerk.
- Observability
- Prometheus, Alertmanager, Grafana, Loki, Fluent Bit met eigen alarmregels, en Azure Monitor voor de systeemlogs.
- Kostenbeheersing
- Een budget met voorspellingsalarm, kleine VM-groottes, een log-limiet en één commando om alles te verwijderen.
Architectuur
De Azure-omgeving. Alleen de load balancer is openbaar voor websites; SSH en de Kubernetes-API antwoorden alleen aan het beheer-IP.
Stap voor stap
Pull request
terraform fmt en validate, tflint en een Trivy-IaC-scan. Daarna logt de pipeline met OIDC in bij Azure en zet het plan als reactie in de pull request.
Beoordeling
Een mens leest het plan: wat wordt gemaakt, gewijzigd of verwijderd. In Azure is nog niets veranderd.
Toepassen
Na de merge wacht de apply op goedkeuring van de omgeving "production". Dan bouwt Terraform precies het beoordeelde plan.
Configureren
Ansible hardt de drie Ubuntu-servers, installeert k3s met versleuteling en audit-log en voegt de platform-charts toe.
Elke nacht
Een drift-controle draait terraform plan. Als Azure afwijkt van de code, opent hij een issue.
Bewijs uit een echte run
Run op de branch main op 2026-10-27, uit GitHub Actions. Tijd per job:
- fmt, validate, tflint, Trivy 23s
- ansible-lint (production profile) 22s
Open deze run (opens in a new tab)
Beveiligingsmaatregelen
| Maatregel | Wat het tegenhoudt |
|---|---|
| NSG standaard weigeren + admin_cidrs | SSH en de Kubernetes-API open op internet. |
| Geen openbaar IP op de agents | Directe aanvallen op de worker-nodes. |
| GitHub OIDC | Een langlevend cloud-secret dat uit de CI kan lekken. |
| Key Vault + managed identity | Het cluster-join-token in bestanden of in Git. |
| Plan-beoordeling + goedkeuring | Een onverwachte verwijdering in productie. |
| tflint + Trivy-IaC-scan | Onveilige of foute instellingen voordat ze Azure bereiken. |
| Nachtelijke drift-controle | Handmatige wijzigingen waar niemand van weet. |
| Budget-alarm | Een vergeten lab dat elke dag geld kost. |
Probeer het zelf
az login && make bootstrap # once: state storage + GitHub OIDC app
cp terraform/terraform.tfvars.example terraform/terraform.tfvars # your IP and SSH key
make init plan apply # VNet, NSG, NAT, load balancer, 3 VMs, Key Vault, monitoring
make configure # Ansible: hardening, k3s, platform charts
make kubeconfig && KUBECONFIG=./kubeconfig kubectl get nodes
make destroy # after the demo: everything is goneWat ik geleerd heb
- Een helder plan in de pull request is het beste beoordelingsmiddel: je leest wat er verandert, niet de code.
- Veilige standaarden horen in de code: de webpoorten blijven dicht tot je ze bewust opent.
- Een platform dat je in minuten kunt verwijderen en opnieuw bouwen, is goedkoper en veiliger dan een platform dat je niet durft aan te raken.