Sobes.tech
Middle+

Kako je implementirano balansiranje opterećenja u Kubernetes-u?

sobes.tech АИ

Одговор од АИ

Uravnoteženje opterećenja u Kubernetesu realizira se na više nivoa:

  1. Servis (na nivou Kube-proxy):

    • Svaki Pod u Servisu dobija jedinstvenu IP adresu.
    • Kube-proxy, koji radi na svakom čvoru, prati promene u Servisu i EndpointSlice.
    • Podešava pravila za preusmeravanje saobraćaja (iptables, ipvs) na klaster IP adresu Servisa.
    • Saobraćaj koji dolazi na klaster IP Servisa ravnomerno se raspoređuje između Podova tog Servisa prema odabranom algoritmu (podrazumevano Round Robin).
    • Postoje dva režima rada Kube-proxy: iptables (standardni, zasnovan na Linux netfilteru) i ipvs (efikasniji za velike klastere, zasnovan na Virtual Server API-ju).
    apiVersion: v1
    kind: Service
    metadata:
      name: my-service
    spec:
      selector:
        app: my-app # Izbor Podova sa oznakom app: my-app
      ports:
        - protocol: TCP
          port: 80 # Port na Servisu
          targetPort: 8080 # Port na Podovima
    
  2. Ingress (na nivou L7):

    • Funkcioniše kao jedinstvena tačka ulaza za eksterno balansiranje HTTP/S saobraćaja.
    • Potreban je Ingress kontroler (npr. Nginx Ingress Controller) za implementaciju pravila.
    • Usmerava saobraćaj na konkretan Service unutar klastera na osnovu URL putanje, imena hosta i drugih pravila L7.
    • Omogućava implementaciju različitih strategija balansiranja, SSL terminacije, virtualnog hostinga po imenu.
    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 # Usmerava saobraćaj na ovaj Service
                port:
                  number: 80
    
  3. LoadBalancer Service (na nivou Cloud Providera):

    • Pri kreiranju Service-a sa tipom LoadBalancer, Kubernetes komunicira sa API-jem cloud provajdera (AWS, GCP, Azure itd.).
    • Provajder kreira eksterni balansirač saobraćaja koji usmerava saobraćaj na čvorove klastera.
    • Zatim, Kube-proxy preusmerava saobraćaj na Podove unutar klastera.
    • Ovaj tip Servisa obezbeđuje eksterni pristup i balansiranje na nivou L4 (TCP/UDP) ili L7 (HTTP/S), u zavisnosti od provajdera.
    apiVersion: v1
    kind: Service
    metadata:
      name: my-external-service
    spec:
      selector:
        app: my-app
      ports:
        - protocol: TCP
          port: 80
          targetPort: 8080
      type: LoadBalancer # Kreira eksterni balansirač
    
  4. Prilagođeni Load Balancers (npr. HAProxy, Nginx kao Pod):

    • Moguće je rasporediti balansirač unutar klastera kao Deployment i Service (ClusterIP ili NodePort).
    • Podešava se eksterni saobraćaj na taj Service.
    • Balansirač će samostalno raspoređivati saobraćaj između drugih Podova.

Na ovaj način, Kubernetes nudi višeslojni pristup balansiranju opterećenja, kombinujući ugrađene mehanizme (Service, Kube-proxy) sa eksternim rešenjima (Ingress, Cloud Provider Load Balancers) i mogućnošću raspoređivanja prilagođenih balansirača.