Sobes.tech
Middle+

Hogyan valósul meg a terheléselosztás a Kubernetesben?

sobes.tech MI

Válasz az MI-től

A terheléselosztás a Kubernetesben több szinten valósul meg:

  1. Szolgáltatás (a Kube-proxy szintjén):

    • Minden Pod egyedi IP-címet kap a Szolgáltatásban.
    • A Kube-proxy, amely minden csomóponton fut, figyeli a Szolgáltatás és az EndpointSlice változásait.
    • Átirányítási szabályokat állít be (iptables, ipvs) a Szolgáltatás cluster IP-címére.
    • A cluster IP-re érkező forgalom a kiválasztott algoritmus szerint (alapértelmezett Round Robin) oszlik meg a Podok között.
    • Két működési módja van a Kube-proxy-nak: iptables (alapértelmezett, Linux netfilteren alapuló) és ipvs (nagyobb klaszterekhez hatékonyabb, Virtual Server API-n alapuló).
    apiVersion: v1
    kind: Service
    metadata:
      name: my-service
    spec:
      selector:
        app: my-app # Podokat választ ki az app: my-app címkével
      ports:
        - protocol: TCP
          port: 80 # A Szolgáltatás portja
          targetPort: 8080 # A Podok portja
    
  2. Ingress (az L7 szinten):

    • Egyetlen belépési pontként működik a HTTP/S forgalom külső terheléselosztásához.
    • Szükség van Ingress kontrollerrre (pl. Nginx Ingress Controller) a szabályok megvalósításához.
    • A forgalmat a URL útvonal, a hosztnév és más L7 szabályok alapján irányítja egy adott Szolgáltatás felé a klaszteren belül.
    • Lehetővé teszi különböző terheléselosztási stratégiák, SSL terminálás, név alapú virtuális hosztolás megvalósítását.
    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 # Ez a Szolgáltatás kapja a forgalmat
                port:
                  number: 80
    
  3. LoadBalancer Service (a Cloud Provider szintjén):

    • A LoadBalancer típusú Service létrehozásakor a Kubernetes kommunikál a felhőszolgáltató API-jával (AWS, GCP, Azure stb.).
    • A szolgáltató létrehoz egy külső terheléselosztót, amely a klaszter csomópontjai felé irányítja a forgalmat.
    • Ezután a Kube-proxy átirányítja a forgalmat a Podokra a klaszteren belül.
    • Ez a típusú Service külső hozzáférést és terheléselosztást biztosít L4 (TCP/UDP) vagy L7 (HTTP/S) szinten a szolgáltató függvényében.
    apiVersion: v1
    kind: Service
    metadata:
      name: my-external-service
    spec:
      selector:
        app: my-app
      ports:
        - protocol: TCP
          port: 80
          targetPort: 8080
      type: LoadBalancer # Külső terheléselosztót hoz létre
    
  4. Egyedi Load Balancers (pl. HAProxy, Nginx Podként):

    • A klaszteren belül telepíthető egy terheléselosztó Deployment és Service (ClusterIP vagy NodePort) formájában.
    • A külső forgalmat erre a Service-re lehet irányítani.
    • A load balancer önállóan osztja el a forgalmat más Podok között.

Így a Kubernetes több szintű megközelítést kínál a terheléselosztáshoz, ötvözve a beépített mechanizmusokat (Service, Kube-proxy) külső megoldásokkal (Ingress, Cloud Provider Load Balancers) és a saját load balancer-ek telepítésének lehetőségével.