18: Ingress — podstawy

Ingress w Kubernetes: podstawy

Cel zadania

Celem zadania jest zrozumienie czym jest Ingress w Kubernetes i jak skonfigurować podstawowy routing HTTP dla pojedynczego serwisu.

Teoria

Ingress w Kubernetes

# Podstawowa struktura Ingress
apiVersion: networking.k8s.io/v1  # Używamy najnowszej wersji API
kind: Ingress
metadata:
  name: example-ingress         # Nazwa zasobu Ingress
spec:
  ingressClassName: nginx       # Określa który kontroler powinien obsługiwać ten Ingress
  rules:                       # Lista reguł routingu
  - host: app.example.com      # Domena dla której stosujemy reguły (opcjonalne)
    http:                      # Definicja reguł HTTP
      paths:                   # Lista ścieżek URL
      - path: /api             # Ścieżka URL
        pathType: Prefix       # Typ dopasowania ścieżki (Prefix, Exact)
        backend:               # Definicja backendu
          service:             # Serwis do którego kierujemy ruch
            name: api-service  # Nazwa serwisu
            port:              # Port serwisu
              number: 80       # Numer portu

Kluczowe elementy:

  1. IngressClassName:
    spec:
      ingressClassName: nginx  # Zamiast annotacji używamy pola ingressClassName
    
    • Określa który kontroler Ingress powinien obsłużyć tę regułę
    • Zastępuje starszą annotację kubernetes.io/ingress.class
    • Musi być zdefiniowany w klastrze odpowiedni IngressClass
  2. Rules (Reguły): ```yaml rules:
    • host: app.example.com # Domena (opcjonalna) http: # Sekcja reguł HTTP paths: # Lista ścieżek ```
    • Definiują jak kierować ruch
    • Mogą być oparte o hosty i/lub ścieżki
    • Reguły są sprawdzane w kolejności
  3. PathType:
    pathType: Prefix  # lub Exact
    
    • Prefix: Dopasowuje ścieżkę i wszystkie podścieżki (np. /api dopasuje /api/v1, /api/docs)
    • Exact: Dopasowuje dokładnie podaną ścieżkę
  4. Backend:
    backend:
      service:
        name: my-service  # Nazwa serwisu Kubernetes
        port:
          number: 80      # Port serwisu
    
    • Określa serwis docelowy
    • Musi istnieć w tym samym namespace co Ingress

Jak działa Ingress?

graph LR
    INET["Internet<br/>(użytkownik)"]
    IC["Ingress Controller<br/>(nginx)"]
    ING["Ingress Rules<br/>host: app.example.com<br/>path: /"]
    SVC["Service<br/>(ClusterIP)"]

    subgraph PODS["Pody"]
        P1["Pod 1"]
        P2["Pod 2"]
        P3["Pod 3"]
    end

    INET -->|"HTTP request"| IC
    IC -->|"sprawdza reguły"| ING
    ING -->|"dopasowany backend"| SVC
    SVC -->|"load balancing"| P1
    SVC -->|"load balancing"| P2
    SVC -->|"load balancing"| P3

    style IC fill:#e3f2fd,stroke:#1976d2
    style ING fill:#fff3e0,stroke:#f57c00
    style PODS fill:#e8f5e9

Proces przetwarzania żądania:

  1. Żądanie trafia do Ingress Controller
  2. Sprawdzane są reguły (host i path)
  3. Ruch jest kierowany do odpowiedniego Service
  4. Service przekazuje ruch do Podów

Kluczowe komponenty:

  • IngressClass: Określa który kontroler obsługuje reguły
  • Rules: Definicje routingu (host + path)
  • Backend: Serwis docelowy
  • PathType: Sposób dopasowania ścieżki (Prefix/Exact)

Zadanie: Podstawowy Ingress

Utwórz plik basic-app.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: echo-basic
spec:
  replicas: 3
  selector:
    matchLabels:
      app: echo-basic
  template:
    metadata:
      labels:
        app: echo-basic
    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-basic
spec:
  ports:
    - port: 80
      targetPort: 80
  selector:
    app: echo-basic
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: echo-basic
spec:
  ingressClassName: nginx
  rules:
  - host: basic-XX.acc.patoarchitekci.io
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: echo-basic
            port:
              number: 80

Weryfikacja:

# Wdrożenie konfiguracji
kubectl apply -f basic-app.yaml

# Sprawdzenie statusu
kubectl get deployment echo-basic
kubectl get service echo-basic
kubectl get ingress echo-basic

# Test poprawności konfiguracji
kubectl get ingress echo-basic

Najczęstsze problemy

Problem Rozwiązanie
404 Not Found Sprawdź ścieżki w Ingress i działanie serwisu
Host nie działa Sprawdź DNS i nazwę hosta w regułach
Ingress bez adresu Sprawdź czy Ingress Controller jest zainstalowany

Podsumowanie

  • Ingress to warstwa routingu HTTP w Kubernetes
  • IngressClassName określa który kontroler obsługuje reguły
  • Reguły definiują routing na podstawie hosta i ścieżki
  • W następnych ćwiczeniach poznasz path-based routing i URL rewriting

results matching ""

    No results matching ""