20: Ingress — URL rewriting
Ingress — URL rewriting

Cel zadania
Celem zadania jest nauka konfiguracji URL rewriting w Ingress — mechanizmu pozwalającego na zmianę ścieżki URL przed przekazaniem żądania do serwisu backendowego.
Teoria

Path Rewriting w Traefik
Traefik używa Middleware do modyfikacji ścieżek URL. W przeciwieństwie do NGINX Ingress Controller (który używał annotacji rewrite-target), Traefik oddziela logikę rewrite’u od reguł routingu:
- Middleware
StripPrefix— definiuje jakie prefiksy usunąć ze ścieżki - Annotacja w Ingress — wskazuje które middleware zastosować
# 1. Middleware — definiuje transformację URL
apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
name: strip-api-abc
spec:
stripPrefix:
prefixes:
- /api/abc
# 2. Ingress — referencja do middleware przez annotację
metadata:
annotations:
traefik.ingress.kubernetes.io/router.middlewares: default-strip-api-abc@kubernetescrd
Format referencji: <namespace>-<middleware-name>@kubernetescrd
Przykład działania:
| Żądanie | StripPrefix | Co trafia do serwisu |
|———|————-|———————|
| /api/abc/test | strip /api/abc | /test |
| /api/abc/ | strip /api/abc | / |
| /api/abc | strip /api/abc | / |
Diagram: Ścieżka URL przed i po rewrite
graph LR
subgraph BEFORE["Żądanie użytkownika"]
REQ["/api/abc/test"]
end
subgraph MW["Middleware: StripPrefix"]
STRIP["stripPrefix: /api/abc"]
RESULT["/test"]
end
subgraph BACKEND["Backend"]
SVC["Service: echo-service<br/>otrzymuje: /test"]
end
REQ --> STRIP
STRIP --> RESULT
RESULT --> SVC
style BEFORE fill:#ffebee
style MW fill:#fff3e0
style BACKEND fill:#e3f2fd
Bez rewrite: Backend otrzymałby
/api/abc/test— prawdopodobnie zwróciłby 404. Z rewrite: Backend otrzymuje/test— poprawna ścieżka w aplikacji.
Dlaczego Middleware zamiast annotacji?
| Cecha | NGINX (rewrite-target) | Traefik (Middleware) |
|---|---|---|
| Definicja | Annotacja w Ingress | Osobny zasób Kubernetes (CRD) |
| Reużywalność | Brak — kopiujesz annotację | Jeden Middleware, wiele Ingress’ów |
| Czytelność | Regex w annotacji | Deklaratywna konfiguracja |
| Testowalność | Trudna | kubectl get middleware |
Zadanie: URL Rewriting

Pobierz IP Ingress Controllera — będzie potrzebne do konfiguracji hostów:
INGRESS_IP=$(kubectl get svc -n traefik traefik -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
echo $INGRESS_IP
Utwórz plik rewrite-app.yaml (zamień XX na swój numer uczestnika, a INGRESS_IP na adres IP z powyższego polecenia):
apiVersion: apps/v1
kind: Deployment
metadata:
name: echo-service
spec:
replicas: 2
selector:
matchLabels:
app: echo-service
template:
metadata:
labels:
app: echo-service
spec:
containers:
- image: ealen/echo-server:latest
name: echo-server
ports:
- containerPort: 80
env:
- name: PORT
value: "80"
---
apiVersion: v1
kind: Service
metadata:
name: echo-service
spec:
ports:
- port: 80
targetPort: 80
selector:
app: echo-service
---
apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
name: strip-api-abc
spec:
stripPrefix:
prefixes:
- /api/abc
---
apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
name: strip-api-xyz
spec:
stripPrefix:
prefixes:
- /api/xyz
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: echo-rewrite-abc
annotations:
traefik.ingress.kubernetes.io/router.middlewares: default-strip-api-abc@kubernetescrd
spec:
ingressClassName: traefik
rules:
- host: rewrite-XX.INGRESS_IP.nip.io
http:
paths:
- path: /api/abc
pathType: Prefix
backend:
service:
name: echo-service
port:
number: 80
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: echo-rewrite-xyz
annotations:
traefik.ingress.kubernetes.io/router.middlewares: default-strip-api-xyz@kubernetescrd
spec:
ingressClassName: traefik
rules:
- host: rewrite-XX.INGRESS_IP.nip.io
http:
paths:
- path: /api/xyz
pathType: Prefix
backend:
service:
name: echo-service
port:
number: 80
Weryfikacja:
# Wdrożenie
kubectl apply -f rewrite-app.yaml
# Sprawdzenie middleware
kubectl get middleware
# Test konfiguracji rewrite
kubectl get ingress echo-rewrite-abc echo-rewrite-xyz
kubectl describe ingress echo-rewrite-abc
Diagnozowanie problemów

Sprawdzanie stanu Ingress
# Status ogólny
kubectl get ingress
# Szczegóły konkretnego Ingress
kubectl describe ingress echo-rewrite-abc
# Lista middleware
kubectl get middleware
# Sprawdzanie eventów
kubectl get events --field-selector involvedObject.kind=Ingress
Weryfikacja endpointów
# Sprawdzenie endpointów serwisu
kubectl get endpoints echo-service
# Sprawdzenie gotowości podów
kubectl get pods -l app=echo-service
# Logi podów
kubectl logs -l app=echo-service
Testowanie połączeń
# Sprawdzenie statusu i konfiguracji Ingress
kubectl get ingress
kubectl get events --field-selector involvedObject.kind=Ingress
Dobre praktyki

- URL Rewriting
- Dokumentuj transformacje URL
- Testuj edge cases w ścieżkach
- Sprawdzaj wpływ na aplikację
- Middleware
- Nadawaj jasne nazwy (
strip-api-abc, niemw-1) - Jeden Middleware per transformacja — łatwiej reużywać
- Sprawdzaj format referencji:
<namespace>-<name>@kubernetescrd
- Nadawaj jasne nazwy (
- Organizacja ruchu
- Jeden Ingress per ścieżkę gdy każda wymaga innego middleware
- Jasne nazewnictwo hostów i ścieżek
- Grupowanie powiązanych reguł
Rozwiązywanie problemów

| Problem | Rozwiązanie |
|---|---|
| 404 Not Found | Sprawdź ścieżki w Ingress i działanie serwisu |
| Zły routing | Zweryfikuj kolejność reguł paths |
| Rewrite nie działa | Sprawdź nazwę middleware w annotacji (format: namespace-name@kubernetescrd) |
| Middleware nie istnieje | kubectl get middleware — upewnij się, że CRD jest wdrożone |
| Host nie działa | Sprawdź DNS i nazwę hosta w regułach |
Podsumowanie

- Traefik używa Middleware CRD do URL rewriting (zamiast annotacji
rewrite-targetz NGINX) StripPrefixmiddleware usuwa prefiks ścieżki przed przekazaniem do backendu- Middleware to osobny zasób Kubernetes — reużywalny i łatwy do testowania
- Każdy Ingress referencuje middleware przez annotację
traefik.ingress.kubernetes.io/router.middlewares - Format referencji:
<namespace>-<middleware-name>@kubernetescrd