20: Ingress — URL rewriting

Ingress — URL rewriting

Ingress — URL rewriting (Overview)

Cel zadania

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

Teoria — StripPrefix Middleware

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:

  1. Middleware StripPrefix — definiuje jakie prefiksy usunąć ze ścieżki
  2. 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

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

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

Dobre praktyki

  1. URL Rewriting
    • Dokumentuj transformacje URL
    • Testuj edge cases w ścieżkach
    • Sprawdzaj wpływ na aplikację
  2. Middleware
    • Nadawaj jasne nazwy (strip-api-abc, nie mw-1)
    • Jeden Middleware per transformacja — łatwiej reużywać
    • Sprawdzaj format referencji: <namespace>-<name>@kubernetescrd
  3. 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

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

Podsumowanie

  • Traefik używa Middleware CRD do URL rewriting (zamiast annotacji rewrite-target z NGINX)
  • StripPrefix middleware 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

results matching ""

    No results matching ""