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
metadata:
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
rules:
- http:
paths:
- path: /api(/|$)(.*) # Grupa 1: /api(/|$), Grupa 2: (.*)
- Pozwala na zmianę ścieżki przed przekazaniem do serwisu
- Używa wyrażeń regularnych do przechwytywania części ścieżki
$2odnosi się do drugiej grupy przechwytywania (capture group)
Przykład działania:
| Żądanie | Rewrite | Co trafia do serwisu |
|———|———|———————|
| /api/abc/test | /$2 → /test | /test |
| /api/abc/ | /$2 → / | / |
| /api/abc | /$2 → `` | / |
Diagram: Ścieżka URL przed i po rewrite
graph LR
subgraph BEFORE["Żądanie użytkownika"]
REQ["/api/abc/test"]
end
subgraph MATCH["Regex match"]
PATH["path: /api/abc(/|$)(.*)"]
G1["Grupa 1: /"]
G2["Grupa 2: test"]
end
subgraph AFTER["Po rewrite"]
RW["rewrite-target: /$2"]
RESULT["/test"]
end
subgraph BACKEND["Backend"]
SVC["Service: echo-service<br/>otrzymuje: /test"]
end
REQ --> PATH
PATH --> G1
PATH --> G2
G2 --> RW
RW --> RESULT
RESULT --> SVC
style BEFORE fill:#ffebee
style MATCH fill:#fff3e0
style AFTER fill:#e8f5e9
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.
Zadanie: URL Rewriting
Utwórz plik rewrite-app.yaml:
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: networking.k8s.io/v1
kind: Ingress
metadata:
name: echo-rewrite
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
ingressClassName: nginx
rules:
- host: rewrite-XX.acc.patoarchitekci.io
http:
paths:
- path: /api/abc(/|$)(.*)
pathType: ImplementationSpecific
backend:
service:
name: echo-service
port:
number: 80
- path: /api/xyz(/|$)(.*)
pathType: ImplementationSpecific
backend:
service:
name: echo-service
port:
number: 80
Weryfikacja:
# Wdrożenie
kubectl apply -f rewrite-app.yaml
# Test konfiguracji rewrite
kubectl get ingress echo-rewrite
kubectl describe ingress echo-rewrite
Diagnozowanie problemów
Sprawdzanie stanu Ingress
# Status ogólny
kubectl get ingress
# Szczegóły konkretnego Ingress
kubectl describe ingress echo-rewrite
# 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ę
- Path Routing
- Bardziej specyficzne ścieżki przed ogólnymi
- Używaj PathType: Prefix dla elastyczności
- Testuj wszystkie ścieżki po zmianach
- Organizacja ruchu
- Jeden Ingress per aplikacja
- 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ź poprawność regex w path i rewrite-target |
| Host nie działa | Sprawdź DNS i nazwę hosta w regułach |
Podsumowanie
- URL rewriting zwiększa elastyczność routingu w Ingress
- Wyrażenia regularne pozwalają na zaawansowane dopasowanie ścieżek
ImplementationSpecificpathType jest wymagany przy regex- Annotacja
rewrite-targetdefiniuje jak przepisać URL - Prawidłowa konfiguracja ingressClassName jest kluczowa