У меня есть простой входной ресурс и две службы: ess-index и ess-query. Услуги были выставлены с типом NodePort
с --session-afinity=None
. Ресурс Ingress имеет следующую структуру:Каков алгоритм балансировки нагрузки по умолчанию в GLBC L7 в GKE?
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ess-ingress
spec:
backend:
serviceName: ess-query
servicePort: 2280
rules:
- http:
paths:
- path: /api/index
backend:
serviceName: ess-index
servicePort: 2280
Созданные службы будут иметь прокси-режим iptables. Когда я выставляю эти службы в качестве NodePort
, мастер kubernetes будет выделять порт из диапазона, настроенного на флагом, и каждый Node будет проксировать этот порт в службе ess-index или ess-query соответственно. Итак, когда я вхожу в POST с kubectl create -f ingress.yaml
, это приведет к следующему поведению: будет автоматически создан контроллер GLBC, который управляет следующим графиком ресурсов GCE (глобальное правило пересылки -> TargetHttpProxy -> URL-карта -> служба бэкэнд -> группа экземпляров). Он должен отображаться в виде контейнера в соответствии с документацией, но я не вижу его в следующем командном выходе: kubectl get pods --namespace=kube-system
. Вот sample output Мой вопрос: каков алгоритм балансировки нагрузки по умолчанию для этого loadbalancer? Что происходит, когда маршруты маршрутизации к соответствующему серверу? Я правильно понимаю, что алгоритм по умолчанию не является циклическим и, согласно документам Service
, случайным образом распределен (возможно, на основе некоторого хэша IP-адреса источника/назначения и т. Д.)? Это важно, потому что в моем случае весь трафик идет от небольшого числа машин с фиксированным IP-адресом, поэтому я могу видеть неравномерное распределение трафика на моих внутренних серверах. Если да, то каков правильный способ получить циклическое поведение? Насколько я понимаю, я могу выбрать один из двух вариантов:
- Пользовательский контроллер входа. Плюсы: он может автоматически обнаруживать перезагрузки pod/etc., Cons: не может поддерживать расширенные функции l7, которые могут мне понадобиться в будущем (например, постоянство сеанса)
- Удалить вход и использование самостоятельно построить решение, как упомянуто здесь: https://www.nginx.com/blog/load-balancing-kubernetes-services-nginx-plus/ Плюсы: полностью настраиваемые, минусы: вы должны позаботиться о перезагрузке стручков и т. Д. Самостоятельно.
Спасибо за ваш ответ. Можете ли вы, пожалуйста, также указать мне, почему я не вижу модуль загрузки GLBC? Я по-прежнему не получаю грубо равное распределение на моей службе индексирования. Есть ли вероятность, что режим балансировки влияет на это? Правильно ли я понимаю, что GKE сейчас поддерживает только режим максимальной балансировки процессора? – vglazkov
по умолчанию - CPU, вы можете переключить его на rps (https://cloud.google.com/compute/docs/load-balancing/http/backend-service), контроллер не переключит его обратно на rps, если вы не удалите бэкэнд. –
Также обратите внимание, что алгоритм здесь (использование vs rps) - это только кросс-область. В области, где он распыляется (примерно 2 уровня rr): https://cloud.google.com/compute/docs/load-balancing/http/#load_distribution_algorithm –