Sobes.tech
Middle+

Hoe wordt load balancing geïmplementeerd in Kubernetes?

sobes.tech AI

Antwoord van AI

De load balancing in Kubernetes wordt op meerdere niveaus geïmplementeerd:

  1. Service (op Kube-proxy-niveau):

    • Elke Pod in de Service krijgt een uniek IP-adres.
    • Kube-proxy, dat op elke knooppunt draait, bewaakt wijzigingen in Service en EndpointSlice.
    • Het configureert regels voor het doorsturen van verkeer (iptables, ipvs) naar het cluster-IP-adres van de Service.
    • Het verkeer dat naar het cluster-IP van de Service gaat, wordt verdeeld over de Pods van die Service volgens het gekozen algoritme (standaard Round Robin).
    • Er zijn twee modi voor Kube-proxy: iptables (standaard, gebaseerd op Linux netfilter) en ipvs (efficiënter voor grote clusters, gebaseerd op Virtual Server API).
    apiVersion: v1
    kind: Service
    metadata:
      name: my-service
    spec:
      selector:
        app: my-app # Selecteert Pods met het label app: my-app
      ports:
        - protocol: TCP
          port: 80 # Poort op de Service
          targetPort: 8080 # Poort op Pods
    
  2. Ingress (op L7-niveau):

    • Werkt als een enkel toegangspunt voor extern HTTP/S load balancing.
    • Een Ingress-controller (bijvoorbeeld Nginx Ingress Controller) is nodig om de regels te implementeren.
    • Verkeert verkeer door op basis van URL-pad, hostnaam en andere L7-regels.
    • Maakt het mogelijk om verschillende load balancing-strategieën, SSL-terminatie, virtual hosting op basis van naam te implementeren.
    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 # Stuurt verkeer naar deze Service
                port:
                  number: 80
    
  3. LoadBalancer Service (op cloud provider-niveau):

    • Bij het maken van een Service met het type LoadBalancer, communiceert Kubernetes met de API van de cloud provider (AWS, GCP, Azure, etc.).
    • De provider maakt een externe load balancer aan die verkeer naar de knooppunten van het cluster leidt.
    • Vervolgens leidt Kube-proxy het verkeer door naar Pods binnen het cluster.
    • Dit type Service biedt externe toegang en load balancing op L4 (TCP/UDP) of L7 (HTTP/S), afhankelijk van de provider.
    apiVersion: v1
    kind: Service
    metadata:
      name: my-external-service
    spec:
      selector:
        app: my-app
      ports:
        - protocol: TCP
          port: 80
          targetPort: 8080
      type: LoadBalancer # Maakt een externe load balancer
    
  4. Aangepaste load balancers (bijvoorbeeld, HAProxy, Nginx als Pod):

    • Kan binnen het cluster worden uitgerold als Deployment en Service (ClusterIP of NodePort).
    • Configureer extern verkeer naar deze Service.
    • De load balancer verdeelt het verkeer onder andere Pods.

Op deze manier biedt Kubernetes een meerlagige aanpak voor load balancing, die ingebouwde mechanismen (Service, Kube-proxy) combineert met externe oplossingen (Ingress, cloud provider load balancers) en de mogelijkheid om aangepaste load balancers uit te rollen.