Какой сервис выполняет балансировку нагрузки между узлами kubernetes?
Какова точка входа в кластер k8s? Как запрос направляется из точки входа в определенный контейнер?
1 ответ
Этот вопрос очень общий, у вас есть много типов балансировщиков нагрузки (внутренние, сторонние, Ingresses ...)
Но лучший ответ - это услуги Kubernetes, так как все вышеперечисленное относится к ним.
Служба в kubernetes - это набор правил Linux iptables (или IPVS), которые будут выполнять преобразование сетевых адресов назначения (DNAT) для пакетов, идущих на конкретные IP-адреса. Короче:
1- Служба будет иметь виртуальный IP-адрес, который называется ServiceIP или ClusterIP.
2. Пользователь связывается с модулями kubernetes (одним контейнером или набором связанных контейнеров) с использованием 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
,
Чтобы увидеть, что сделает эта ЦЕПЬ:
# 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
в этом примере), когда выбрана другая конечная точка службы, пакет будет передан DNAT другому модулю.
Вы можете использовать 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/