- 04-traefik: External-IP von Node-IPs auf MetalLB VIP 192.168.11.180 korrigiert, Übersicht aller aktiven Ingresses mit nip.io und int.elbpro.de URLs - 06-rancher: Hostname-Fix .170 → .180, int.elbpro.de hinzugefügt, Fix-Doku - 07-argocd: Hostname-Fix .170 → .180, int.elbpro.de + TLS-Fix dokumentiert Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
227 lines
6.0 KiB
Markdown
227 lines
6.0 KiB
Markdown
# 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 <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
|
|
```
|
|
|
|
---
|
|
|
|
## 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
|