Files
homelab/docs/04-traefik.md

199 lines
4.8 KiB
Markdown

# 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?
```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.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
```bash
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:
```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
```
---
## 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