Middle+
Kako je implementirano balansiranje opterećenja u Kubernetes-u?
sobes.tech АИ
Одговор од АИ
Uravnoteženje opterećenja u Kubernetesu realizira se na više nivoa:
-
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 -
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 -
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č - Pri kreiranju Service-a sa tipom
-
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.