Files
homelab/docs/04-traefik.md

4.8 KiB

04 — Traefik Ingress Controller

Datum: 2026-03-17 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)


Ü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?

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

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

kubectl get svc traefik -n kube-system
NAME      TYPE           CLUSTER-IP     EXTERNAL-IP                                      PORT(S)
traefik   LoadBalancer   10.43.61.252   192.168.11.170,192.168.11.171,192.168.11.172     80:31202/TCP,443:32016/TCP

Traefik ist über alle drei Node-IPs erreichbar:

Node IP HTTP HTTPS
rnk-cp01 192.168.11.170 :80 :443
rnk-wrk01 192.168.11.171 :80 :443
rnk-wrk02 192.168.11.172 :80 :443

NodePorts: 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

kubectl get ingressclass
NAME      CONTROLLER                      PARAMETERS   AGE
traefik   traefik.io/ingress-controller   <none>       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:

kubectl port-forward -n kube-system deployment/traefik 9000:8080
# Dashboard: http://localhost:9000/dashboard/

Beispiel: Ingress-Objekt

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)

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

Nächste Schritte

  • Traefik Dashboard per IngressRoute mit BasicAuth exposieren
  • Default TLS-Zertifikat konfigurieren (z.B. via cert-manager + Let's Encrypt)
  • Wildcard-DNS für *.homelab.local auf die Cluster-IPs setzen
  • Prometheus-Scraping für Traefik Metrics einrichten