Маршрут Openshift не балансирует нагрузку от Сервисных модулей
Я пробовал раньше на Openshift Origin 3.9 и онлайн. Я развернул простое приложение php hello world на Openshift. У него есть Сервис и Маршрут.
Когда я вызываю маршрут, я получаю ожидаемый вывод с Hello world и Pod IP. Давайте назовем этот pod ip как 1.1.1.1
Теперь я развернул такое же приложение с небольшим изменением текста с той же меткой под той же службой. Давайте назовем этот pod ip как 2.2.2.2
Я вижу оба модуля, работающие в одном Сервисе. Теперь, когда я вызываю маршрут, он всегда показывает Podip 1.1.1.1 Мой маршрут никогда не попадает во второй модуль.
Я понимаю, что Route вызовет службу, а служба загрузит баланс между доступными модулями.
Но этого не происходит. Любая помощь приветствуется.
2 ответа
Поведение по умолчанию маршрутизатора HAProxy заключается в использовании файла cookie для обеспечения "липкой" маршрутизации. Это позволяет сеансам оставаться в одном модуле. https://docs.openshift.com/container-platform/3.11/architecture/networking/routes.html
Если вы установите haproxy.router.openshift.io/disable_cookies
аннотация на маршруте к true
это должно отключить это поведение.
Для тех, кто пришел сюда в поисках решения; Оба ответа Даэйн Пак и Уилл Гордон верны.
Вот простая уловка:
Если вы вызываете свой модуль извне, он переходит от маршрутизатора к службе к модулю. Если
haproxy.router.openshift.io/disable_cookies
аннотация не установлена наtrue
на маршрутизаторе служба всегда перенаправляет на один и тот же модуль.Также после отключения липкой маршрутизации с аннотацией выше вы можете выбрать алгоритм балансировки нагрузки с помощью:
haproxy.router.openshift.io/balance
как ключ и один из[source,roundrobin,leastconn]
как ценностьЕсли вы вызываете свой модуль из другого модуля. Он идет от службы к капсуле. Сервис отлично выполняет циклическую балансировку нагрузки с конфигурацией по умолчанию.
Итак, вам следует:
- Добавьте указанную аннотацию к вашему маршрутизатору, если вы хотите, чтобы ваш сервис был доступен маршрутизатору.
- Ничего не делайте, если вы хотите, чтобы ваш сервис был доступен только изнутри
(Проверено на Openshift 4.2.28)
Сервисы НЕ балансируют нагрузку между подами, это совершенно случайно. Это было подтверждено нам службой поддержки RedHat. Более того, приведенные выше ответы проводят тесты только с разными вызовами curl.
Если вы выполните последующие вызовы того же curl, вы увидите, что соединения используются повторно. Просто попробуй:
curl http://172.30.177.72:8080/index.html http://172.30.177.72:8080/index.html
Вместо того, чтобы выполнять взаимодействие, вы увидите, что keep-alive повторно использует соединение, и вы каждый раз заканчиваете один и тот же модуль
Я понимаю, что Route вызовет службу, а служба загрузит баланс между доступными модулями.
Как правило, ваши знания верны. Давайте проверим это на вашем env следующим образом.
# oc describe svc web
Name: web
Namespace: test
Labels: app=web
Annotations: openshift.io/generated-by=OpenShiftNewApp
Selector: app=web,deploymentconfig=web
Type: ClusterIP
IP: 172.30.6.8
Port: 8080-tcp 8080/TCP
TargetPort: 8080/TCP
Endpoints: 1.1.1.1:8080,2.2.2.2:8080
Session Affinity: None
Events: <none>
Session Affinity
является None
в качестве значения по умолчанию это означает round robin
для запросов.
Вы можете проверить доступ к запросам как round robin
манера зацикливания curl
с мониторингом pods
с помощью oc logs
или же index.html
тело ответа (если содержимое отличается).
while :; do curl http://172.30.177.72:8080/index.html; sleep 1; done
1.1.1.1:8080
2.2.2.2:8080
1.1.1.1:8080
2.2.2.2:8080
...