Infrastructure as Code
Azure-k3s-Plattform
Eine kleine Kubernetes-Plattform in Produktionsqualität auf Azure, nur aus Code gebaut: Terraform erstellt die Cloud-Teile, Ansible härtet die Server und installiert k3s, und eine Pipeline wendet jede Änderung nach Prüfung an, ohne gespeicherte Secrets.
Auf einen Blick
- 3
- VMs mit einem Befehl
- 0
- Secrets in der Pipeline (OIDC)
- 2
- Prüfungen vor einer Änderung: Plan und Freigabe
- 1
- Befehl, um alles zu löschen
Das Ziel
Von Hand gebaute Server laufen auseinander, niemand weiß, wer was geändert hat, und eine verlorene VM neu aufzubauen dauert einen Tag. Das Ziel: eine Plattform, in der die ganze Umgebung Code ist, jede Änderung vorher als Plan geprüft wird, die Server jedes Mal gleich gehärtet werden und die Kosten unter Kontrolle bleiben.
Was es zeigt
- Infrastructure as Code
- Terraform (azurerm 4) mit zwei Modulen (Netzwerk, Knoten) und Remote State in Azure Storage mit Entra-ID-Anmeldung.
- Netzwerk
- VNet und NSG mit Deny als Standard, NAT-Gateway für ausgehenden Verkehr, Standard Load Balancer für 80/443, Admin-Zugang nur von Ihrer IP.
- Identität und Secrets
- GitHub OIDC (kein Client-Secret), Managed Identities auf den VMs, das k3s-Join-Token in Key Vault.
- Härtung
- SSH, sysctl, auditd, fail2ban, automatische Updates; k3s-Secret-Verschlüsselung, Pod Security, Audit-Log und verschlüsseltes Pod-Netzwerk.
- Observability
- Prometheus, Alertmanager, Grafana, Loki, Fluent Bit mit eigenen Alarmregeln und Azure Monitor für die Systemlogs.
- Kostenkontrolle
- Ein Budget mit Prognose-Alarm, kleine VM-Größen, eine Log-Grenze und ein Befehl, um alles zu löschen.
Architektur
Die Azure-Umgebung. Nur der Load Balancer ist für Websites öffentlich; SSH und die Kubernetes-API antworten nur der Admin-IP.
Schritt für Schritt
Pull Request
terraform fmt und validate, tflint und ein Trivy-IaC-Scan. Dann meldet sich die Pipeline per OIDC bei Azure an und schreibt den Plan als Kommentar in den Pull Request.
Prüfung
Ein Mensch liest den Plan: Was wird erstellt, geändert oder gelöscht. In Azure hat sich noch nichts geändert.
Anwenden
Nach dem Merge wartet das Apply auf eine Freigabe der Umgebung „production“. Dann baut Terraform genau den geprüften Plan.
Konfigurieren
Ansible härtet die drei Ubuntu-Server, installiert k3s mit Verschlüsselung und Audit-Log und fügt die Plattform-Charts hinzu.
Jede Nacht
Eine Drift-Prüfung führt terraform plan aus. Weicht Azure vom Code ab, öffnet sie ein Issue.
Nachweis aus einem echten Lauf
Lauf auf dem Branch main am 2026-10-27, aus GitHub Actions. Dauer je Job:
- fmt, validate, tflint, Trivy 23s
- ansible-lint (production profile) 22s
Diesen Lauf öffnen (opens in a new tab)
Sicherheitskontrollen
| Kontrolle | Was sie verhindert |
|---|---|
| NSG mit Deny als Standard + admin_cidrs | SSH und Kubernetes-API offen im Internet. |
| Keine öffentliche IP auf den Agents | Direkte Angriffe auf die Worker-Knoten. |
| GitHub OIDC | Ein langlebiges Cloud-Secret, das aus der CI leaken kann. |
| Key Vault + Managed Identity | Das Cluster-Join-Token in Dateien oder in Git. |
| Plan-Prüfung + Freigabe | Ein überraschendes Löschen in Produktion. |
| tflint + Trivy-IaC-Scan | Unsichere oder falsche Einstellungen, bevor sie Azure erreichen. |
| Nächtliche Drift-Prüfung | Manuelle Änderungen, von denen niemand weiß. |
| Budget-Alarm | Ein vergessenes Lab, das jeden Tag Geld kostet. |
Selbst ausprobieren
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 goneWas ich gelernt habe
- Ein sauberer Plan im Pull Request ist das beste Prüfwerkzeug: Man liest, was sich ändert, nicht den Code.
- Sichere Standards gehören in den Code: Die Web-Ports bleiben zu, bis man sie bewusst öffnet.
- Eine Plattform, die man in Minuten löschen und neu bauen kann, ist günstiger und sicherer als eine, die man nicht anzufassen wagt.