Sobes.tech
Middle+

Jak jest zaimplementowane równoważenie obciążenia w Kubernetes?

sobes.tech AI

Odpowiedź od AI

Równoważenie obciążenia w Kubernetes realizuje się na kilku poziomach:

  1. Service (na poziomie Kube-proxy):

    • Każdy Pod w Service otrzymuje unikalny adres IP.
    • Kube-proxy, działający na każdym węźle, monitoruje zmiany w Service i EndpointSlice.
    • Konfiguruje reguły przekierowania ruchu (iptables, ipvs) na adres IP klastra Service.
    • Ruch kierowany na IP klastra Service jest rozdzielany pomiędzy Podami tego Service zgodnie z wybranym algorytmem (domyślnie Round Robin).
    • Istnieją dwa tryby pracy Kube-proxy: iptables (standardowy, oparty na Linux netfilter) i ipvs (bardziej wydajny dla dużych klastrów, oparty na Virtual Server API).
    apiVersion: v1
    kind: Service
    metadata:
      name: my-service
    spec:
      selector:
        app: my-app # Wybiera Pod'y z etykietą app: my-app
      ports:
        - protocol: TCP
          port: 80 # Port na Service
          targetPort: 8080 # Port na Pod'ach
    
  2. Ingress (na poziomie L7):

    • Działa jako jednolity punkt wejścia dla zewnętrznego równoważenia obciążenia HTTP/S.
    • Wymaga kontrolera Ingress (np. Nginx Ingress Controller) do implementacji reguł.
    • Kieruje ruch do konkretnego Service w klastrze na podstawie ścieżki URL, nazwy hosta i innych reguł L7.
    • Umożliwia wdrożenie różnych strategii równoważenia obciążenia, terminacji SSL, wirtualnego hostingu opartego na nazwie.
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: my-ingress
    spec:
      rules:
      - host: myapp.example.com
        http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: my-service # Kieruje ruch do tego Service
                port:
                  number: 80
    
  3. Service typu LoadBalancer (na poziomie dostawcy chmury):

    • Tworząc Service typu LoadBalancer, Kubernetes komunikuje się z API dostawcy chmury (AWS, GCP, Azure itp.).
    • Dostawca tworzy zewnętrzny równoważnik obciążenia, który kieruje ruch do węzłów klastra.
    • Następnie Kube-proxy kieruje ruch do Podów w klastrze.
    • Ten typ Service zapewnia zewnętrzny dostęp i równoważenie obciążenia na poziomie L4 (TCP/UDP) lub L7 (HTTP/S), w zależności od dostawcy.
    apiVersion: v1
    kind: Service
    metadata:
      name: my-external-service
    spec:
      selector:
        app: my-app
      ports:
        - protocol: TCP
          port: 80
          targetPort: 8080
      type: LoadBalancer # Tworzy zewnętrzny równoważnik obciążenia
    
  4. Niestandardowe load balancery (np. HAProxy, Nginx jako Pod):

    • Można wdrożyć load balancer wewnątrz klastra jako Deployment i Service (ClusterIP lub NodePort).
    • Skonfigurować zewnętrzny ruch na ten Service.
    • Load balancer będzie samodzielnie rozdzielał ruch pomiędzy inne Pod'y.

W ten sposób Kubernetes oferuje wielopoziomowe podejście do równoważenia obciążenia, łącząc wbudowane mechanizmy (Service, Kube-proxy) z rozwiązaniami zewnętrznymi (Ingress, Load Balancer od dostawcy chmury) oraz możliwość wdrożenia własnych load balancerów.