Этот вопрос очень общий, у вас есть много типов балансировщиков нагрузки (внутренняя, сторонняя, Ingresses ...)
Но лучший ответ - Kubernetes services , так как всевыше реле на них.
Служба в kubernetes - это набор правил Linux iptables (или IPVS), которые будут выполнять преобразование сетевых адресов назначения (DNAT) для пакетов, отправляющихся на определенные IP-адреса.Вкратце:
1 - у службы будет виртуальный IP-адрес, называемый ServiceIP или ClusterIP.
2 - Пользователь связывается с kubernetes pods (один контейнер или набор связанных контейнеров) с использованием clusterIP.
3- Iptables в узле будет пересылать пакеты с ClusteIP назначения на IP-адрес связанного Pod с использованием CNI .
Балансировка нагрузки выполненачерез iptables, где у каждой службы будет правило Iptables:
# iptables -t nat -L KUBE-SERVICES
Chain KUBE-SERVICES (2 references)
target prot opt source destination
KUBE-MARK-MASQ tcp -- !10.244.0.0/16 10.104.192.249 /* default/hypriot: cluster IP */ tcp dpt:http
KUBE-SVC-IKNY2FZN6EXMQQCV tcp -- anywhere 10.104.192.249 /* default/hypriot: cluster IP */ tcp dpt:http
# kubectl get svc hypriot
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
hypriot ClusterIP 10.104.192.249 <none> 80/TCP 11d
. В этом примере у Hypriot развертывания есть ClusterIP 10.104.192.249
, второе правило iptables будет пересылать все пакеты с этим Ip назначения в направленииЦЕПЬ KUBE-SVC-IKNY2FZN6EXMQQCV
.
Чтобы увидеть, что будет делать этот CHAIN:
# iptables -t nat -L KUBE-SVC-IKNY2FZN6EXMQQCV
Chain KUBE-SVC-IKNY2FZN6EXMQQCV (1 references)
target prot opt source destination
KUBE-SEP-JEK5XLX6ULDDGJAZ all -- anywhere anywhere /* default/hypriot: */ statistic mode random probability 0.33332999982
KUBE-SEP-WTXTLPWDUQWUHKOF all -- anywhere anywhere /* default/hypriot: */ statistic mode random probability 0.50000000000
KUBE-SEP-OQ7KPRR3BI2AFITK all -- anywhere anywhere /* default/hypriot: */
Каждый из KUBE-SEP является конечной точкой службы, которая представляет адрес модуля, в котором для этого развертывания у гиппотента есть 3 реплики.
# kubectl get endpoints hypriot
NAME ENDPOINTS AGE
hypriot 10.244.1.14:80,10.244.2.21:80,10.244.3.153:80 11d
# kubectl get po -o wide
NAME READY STATUS RESTARTS AGE IP NODE
hypriot-587768b4f5-9dq2k 1/1 Running 0 11d 10.244.2.21 node03
hypriot-587768b4f5-czd86 1/1 Running 0 11d 10.244.3.153 node04
hypriot-587768b4f5-j22sh 1/1 Running 0 11d 10.244.1.14 node02
Будет выбрана одна из этих конечных точек, и пакет будет перенаправлен на связанную цепочку KUBE-SEP:
# iptables -t nat -L KUBE-SEP-JEK5XLX6ULDDGJAZ
Chain KUBE-SEP-JEK5XLX6ULDDGJAZ (1 references)
target prot opt source destination
KUBE-MARK-MASQ all -- 10.244.1.14 anywhere /* default/hypriot: */
DNAT tcp -- anywhere anywhere /* default/hypriot: */ tcp to:10.244.1.14:80
Это последняя часть головоломки, где DNATпроизойдет, и новым получателем будет выбранный IP-адрес модуля (10.244.1.14
для модуля hypriot-587768b4f5-j22sh
в этом примере), когда будет выбрана другая конечная точка службы, пакет будет DNATed другому модулю.
вы можете использовать флаг Iptables -v
, чтобы проверить используемые правила, которые помогут вам в процессе понимания.
Некоторые хорошие чтения: https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/ https://kubernetes.io/docs/concepts/cluster-administration/networking/ https://kubernetes.io/docs/concepts/services-networking/service/#proxy-mode-iptables