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!