Как включить привязку сеанса по IP-адресу клиента на балансировщике нагрузки Kubernetes в GCP - PullRequest
0 голосов
/ 18 января 2019

Я должен настроить FTP-сервер в кластере GCP Kubernetes и не знаю, как маршрутизировать клиентов, чтобы несколько запросов с одного и того же IP-адреса на разные порты направлялись к одному и тому же модулю Kubernetes.

В (пассивном) протоколе FTP сервер открывает новый порт и отправляет номер порта клиенту.Затем клиент создает новое соединение с этим портом.Следовательно, мне нужно убедиться, что второй запрос направляется к одному и тому же модулю, потому что только на этом модуле сервер ожидает нового подключения.

Я пробовал минимальный пример с рабочей нагрузкой из двух модулей, которые выполняютничего, и есть порты 21 и 30000-30098 выставлены.Затем я настроил службу типа LoadBalancer следующим образом (сокращено до соответствующих частей):

kind: Service
spec:
    type: LoadBalancer
    sessionAffinity: ClientIP
    loadBalancerIP: IP_OF_LB
    ports:
    - name: ftp-control
      port: 21
      protocol: TCP
      targetPort: 21
    - name: pasv-30000
      port: 30000
      protocol: TCP
      targetPort: 30000
      # and so on for the remaining ports up to 30098

Теперь я подключаюсь к каждому из модулей с помощью оболочки и начинаю прослушивать вручную на одном порту какследует:

netcat -l -p 30001

Затем я использую telnet со своей рабочей станции для подключения к IP-адресу балансировщика нагрузки.

telnet IP_OF_LB 30001

Таким образом, я могу видеть, какой модуль получает входящийзапрос соединения.

Для одного порта балансировщик нагрузки всегда перенаправляет мой запрос на один и тот же модуль.

Однако, когда я пробую несколько портов, я вижу, что последующие запросы направляются на разныеpods, даже если для свойства сеанса установлено значение ClientIP.

Есть ли какие-либо настройки, которые я пропустил?Я предполагаю, что сходство сеанса по IP-адресу клиента будет использовать только IP-адрес клиента для определения целевого модуля.Тем не менее, похоже, что он использует IP-адрес и порт.

Кто-нибудь знает, есть ли еще параметры, которые я могу попробовать получить желаемое поведение?

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Я опубликовал отчет об ошибке в Google, и они говорят, что это предполагаемое поведение: сообщение об ошибке

Я предположил, что если я определю службу Kubernetes типа балансировки нагрузки, то нагрузка будет сбалансирована на уровне pod. Вместо этого балансировщик нагрузки балансирует трафик на основе виртуальной машины.

Судя по всему, трафик сбалансирован в два раза. Сначала балансировщик нагрузки распределяет трафик между виртуальными машинами, а затем Kubernetes балансирует этот трафик между различными модулями.

Это означает, что привязка сеанса не будет работать для балансировщиков нагрузки и Kubernetes в Google Kubernetes Engine.

0 голосов
/ 19 января 2019

Я вижу, что вы конфигурируете свой сервис как тип LoadBalancer, однако было бы проблематично настроить сходство сеанса на нем. Поэтому я действительно рекомендую сделать следующее:

Конфигурация бэкенда -> Служба Nodeport -> Вход

Пожалуйста, проверьте, используя IP-адрес клиента и Backend Config для получения дополнительной информации.

...