# 04 — Traefik Ingress Controller **Datum:** 2026-03-17 (aktualisiert: 2026-03-20) **Version:** Traefik v3.6.9 (Helm Chart traefik-39.0.201+up39.0.2) **Namespace:** kube-system **Quelle:** k3s built-in (automatisch durch k3s installiert) **Externe IP:** 192.168.11.180 (MetalLB LoadBalancer) --- ## Übersicht k3s bringt Traefik als Standard-Ingress-Controller mit. Er wird beim ersten Cluster-Start automatisch per Helm in den Namespace `kube-system` installiert. Eine manuelle Installation war daher nicht nötig. Traefik v3.6.9 läuft als `LoadBalancer`-Service und ist auf allen drei Cluster-Nodes erreichbar. --- ## Prüfung: Ist Traefik bereits installiert? ```bash kubectl get pods -n kube-system | grep traefik ``` Ausgabe: ``` helm-install-traefik-cbxhx 0/1 Completed 2 11h helm-install-traefik-crd-8dcsk 0/1 Completed 0 11h svclb-traefik-dea220eb-29vm9 2/2 Running 2 11h svclb-traefik-dea220eb-fh52c 2/2 Running 2 11h svclb-traefik-dea220eb-plnwv 2/2 Running 2 11h traefik-788bc4688c-c6m7w 1/1 Running 1 11h ``` → Traefik läuft bereits. Keine manuelle Installation notwendig. --- ## Helm Release ```bash helm list -n kube-system ``` ``` NAME NAMESPACE REVISION STATUS CHART APP VERSION traefik kube-system 1 deployed traefik-39.0.201+up39.0.2 v3.6.9 traefik-crd kube-system 1 deployed traefik-crd-39.0.201+up39.0.2 v3.6.9 ``` Zwei Helm Releases: - **traefik**: Der eigentliche Controller - **traefik-crd**: Die Custom Resource Definitions (IngressRoute, Middleware, etc.) --- ## Service & Erreichbarkeit ```bash kubectl get svc traefik -n kube-system ``` ``` NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) traefik LoadBalancer 10.43.61.252 192.168.11.180 80:31202/TCP,443:32016/TCP ``` > **Hinweis:** Initial zeigte `EXTERNAL-IP` alle drei Node-IPs (`192.168.11.170-172`). > Nach Installation von MetalLB übernimmt MetalLB die LoadBalancer-IP-Vergabe: > Traefik bekommt `192.168.11.180` (erste IP des MetalLB-Pools). > **Alle Ingress-Hostnamen müssen daher auf `.180` zeigen, nicht auf Node-IPs.** Traefik ist über die MetalLB-IP erreichbar: | Endpunkt | IP | HTTP | HTTPS | |---|---|---|---| | MetalLB VIP | 192.168.11.180 | :80 | :443 | NodePorts (intern): `31202` (HTTP), `32016` (HTTPS) --- ## Konfiguration (EntryPoints) Traefik lauscht auf folgenden Ports: | EntryPoint | Port | Zweck | |---|---|---| | `web` | 8000 (→ 80) | HTTP | | `websecure` | 8443 (→ 443) | HTTPS (TLS aktiviert) | | `traefik` | 8080 | Dashboard / API | | `metrics` | 9100 | Prometheus Metrics | Aktive Features (aus Deployment-Args): - `--api.dashboard=true` — Dashboard aktiviert - `--ping=true` — Health-Check unter `/ping` - `--metrics.prometheus=true` — Prometheus-Scraping aktiviert - `--providers.kubernetescrd` — Traefik CRDs (IngressRoute, Middleware, …) - `--providers.kubernetesingress` — Standard Kubernetes Ingress - `--entryPoints.websecure.http.tls=true` — TLS auf websecure - `--log.level=INFO` --- ## IngressClass ```bash kubectl get ingressclass ``` ``` NAME CONTROLLER PARAMETERS AGE traefik traefik.io/ingress-controller 11h ``` IngressClass-Name für Ingress-Objekte: `traefik` --- ## Custom Resource Definitions (CRDs) Installierte Traefik-CRDs: ``` ingressroutes.traefik.io ingressroutetcps.traefik.io ingressrouteudps.traefik.io middlewares.traefik.io middlewaretcps.traefik.io serverstransports.traefik.io serverstransporttcps.traefik.io tlsoptions.traefik.io tlsstores.traefik.io traefikservices.traefik.io ``` Zusätzlich Traefik Hub CRDs (API Gateway / Management, derzeit ungenutzt): `accesscontrolpolicies`, `aiservices`, `apiauths`, `apibundles`, etc. --- ## Dashboard aufrufen (Port-Forward) Das Traefik Dashboard ist über den `traefik`-EntryPoint (Port 8080) erreichbar, jedoch nicht von außen exponiert: ```bash kubectl port-forward -n kube-system deployment/traefik 9000:8080 # Dashboard: http://localhost:9000/dashboard/ ``` --- ## Beispiel: Ingress-Objekt ```yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-app namespace: default spec: ingressClassName: traefik rules: - host: my-app.homelab.local http: paths: - path: / pathType: Prefix backend: service: name: my-app-svc port: number: 80 ``` ## Beispiel: IngressRoute (Traefik CRD) ```yaml apiVersion: traefik.io/v1alpha1 kind: IngressRoute metadata: name: my-app namespace: default spec: entryPoints: - web routes: - match: Host(`my-app.homelab.local`) kind: Rule services: - name: my-app-svc port: 80 ``` --- ## Alle aktiven Ingresses (Stand 2026-03-20) | Namespace | Service | nip.io URL | int.elbpro.de URL | Protokoll | |---|---|---|---|---| | cattle-system | rancher | rancher.192.168.11.180.nip.io | rancher.int.elbpro.de | HTTPS | | argocd | argocd-server | argocd.192.168.11.180.nip.io | argocd.int.elbpro.de | HTTPS | | gitea | gitea-web | gitea.192.168.11.180.nip.io | gitea.int.elbpro.de | HTTP | | longhorn-system | longhorn-ingress | longhorn.192.168.11.180.nip.io | longhorn.int.elbpro.de | HTTP | | pihole | pihole-web | pihole.192.168.11.180.nip.io/admin | pihole.int.elbpro.de/admin | HTTPS | Alle Ingresses zeigen auf `192.168.11.180` (MetalLB VIP → Traefik). ### int.elbpro.de DNS-Voraussetzung ``` # In Pi-hole (Local DNS Records) oder Omada eintragen: *.int.elbpro.de → 192.168.11.180 ``` --- ## Nächste Schritte - [x] MetalLB-IP als Traefik External-IP - [x] Alle Ingresses auf `.180.nip.io` korrigiert - [x] int.elbpro.de Hostnamen für alle Services hinzugefügt - [ ] Wildcard-DNS `*.int.elbpro.de → 192.168.11.180` in Pi-hole eintragen - [ ] Traefik Dashboard per IngressRoute mit BasicAuth exposieren - [ ] Default TLS-Zertifikat konfigurieren (z.B. via cert-manager + Let's Encrypt) - [ ] Prometheus-Scraping für Traefik Metrics einrichten