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
  • $2 odnosi 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

  1. URL Rewriting
    • Dokumentuj transformacje URL
    • Testuj edge cases w ścieżkach
    • Sprawdzaj wpływ na aplikację
  2. Path Routing
    • Bardziej specyficzne ścieżki przed ogólnymi
    • Używaj PathType: Prefix dla elastyczności
    • Testuj wszystkie ścieżki po zmianach
  3. 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
  • ImplementationSpecific pathType jest wymagany przy regex
  • Annotacja rewrite-target definiuje jak przepisać URL
  • Prawidłowa konfiguracja ingressClassName jest kluczowa

results matching ""

    No results matching ""