Traefik ist ein moderner, cloud-nativer Reverse Proxy, der sich hervorragend für Kubernetes eignet. In Kombination mit ExternalDNS wird dein Cluster noch smarter – DNS-Einträge verwalten sich (fast) von selbst.
In diesem Tutorial zeige ich dir Schritt für Schritt, wie du ExternalDNS mit Traefik in einem Kubernetes-Cluster nutzt. Damit automatisierst du öffentliche DNS-Einträge via IngressRoute und sparst dir manuelle Zonenänderungen.
✅ Vorteile von ExternalDNS mit Traefik
- 🔄 Automatische DNS-Einträge bei neuen IngressRoutes
- 🔐 DNS-Verwaltung direkt im Kubernetes YAML
- 🌍 Unterstützung für Wildcard-Domains, CNAME, A/AAAA
- 📦 Perfekt für multi-tenant Environments, Homelabs & Cloud-Nodes
🔧 Voraussetzungen
Bevor du startest, brauchst du:
- Ein laufendes Kubernetes-Cluster (z. B. K3s, MicroK8s oder GKE)
- Traefik als Ingress Controller (empfohlen: v3+)
- Eine öffentliche Domain (z. B. über Netcup, Hetzner, Cloudflare)
- Zugang zur DNS-API deines Providers
- ExternalDNS (Deployment via Helm oder YAML)
🧭 Architekturüberblick
[ IngressRoute (Kubernetes) ]
↓
[ Traefik Controller ]
↓
[ ExternalDNS Controller ]
↓
[ DNS-Provider API (z. B. Cloudflare, Hetzner) ]
Traefik erzeugt IngressRoutes → ExternalDNS erkennt die DNS-Ziele → dein DNS-Anbieter erstellt automatisch passende Einträge (z. B. CNAME).
🔁 Schritt 1: ExternalDNS installieren (Helm)
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update
Beispiel für Cloudflare:
helm install externaldns bitnami/external-dns \
--set provider=cloudflare \
--set cloudflare.apiToken=<DEIN_TOKEN> \
--set domainFilters={yourdomain.com} \
--set policy=sync \
--set txtOwnerId=traefik-cluster \
--set logLevel=debug \
--namespace kube-system
🔐 API Token-Tipp: Stelle sicher, dass dein Cloudflare-Token die Rechte Zone.DNS:Edit
und Zone.Zone:Read
hat.
📄 Schritt 2: Traefik IngressRoute definieren
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: hello
annotations:
external-dns.alpha.kubernetes.io/hostname: hello.yourdomain.com
spec:
entryPoints:
- websecure
routes:
- match: Host(`hello.yourdomain.com`)
kind: Rule
services:
- name: hello-service
port: 80
tls:
certResolver: letsencrypt
✅ Sobald dieser YAML-Block angewendet wird, erkennt ExternalDNS die Annotation und legt automatisch einen DNS-Eintrag an.
🔀 Optional: Wildcard-Support via CNAME
Für Wildcards kannst du:
external-dns.alpha.kubernetes.io/hostname: "*.apps.yourdomain.com"
kombiniert mit einem passenden CNAME-Fallback auf eine Wildcard-IP verwenden. Nicht alle Provider erlauben Wildcards via API – z. B. ist Cloudflare hier limitiert.
🧪 Debugging & Logs
kubectl logs -n kube-system deploy/externaldns
Wichtige Keywords im Log:
CREATE
: neuer Eintrag erzeugtUPDATE
: bestehender DNS-Eintrag angepasstDELETE
: IngressRoute entfernt → DNS-Eintrag gelöscht
📦 Weitere Optionen & Tipps
- Verwende
external-dns.alpha.kubernetes.io/ttl: "60"
für Custom-TTLs - Kombiniere mit
cert-manager
für Let’s Encrypt-Zertifikate - Setze
--policy=sync
für maximale DNS-Konsistenz - DNS-Anbieter wie Hetzner, Gandi, AWS Route 53 & GoDaddy werden ebenfalls unterstützt
🚀 Fazit
Mit ExternalDNS und Traefik hebst du deine Kubernetes-Infrastruktur auf ein neues Level:
- Weniger manuelle DNS-Arbeit
- Vollautomatische Domain-Verwaltung
- Perfekt für Production-Setups & Homelabs
📚 Lies auch:
- ✅ Traefik Plugin-Entwicklung – Eigene Middleware erstellen
- ✅ Advanced Config: Migration von Traefik v2 zu v3
- ✅ Kubernetes vs Docker Swarm
🧲 Call-to-Action
👉 Du willst ExternalDNS oder Traefik produktiv einsetzen?
Ich helfe dir dabei – persönlich, schnell und verständlich.
💬 Kontaktiere mich direkt – lass uns dein Setup automatisieren!
Schreibe einen Kommentar