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 erzeugt
  • UPDATE: bestehender DNS-Eintrag angepasst
  • DELETE: 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:


🧲 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!