Kubernetes Nodeport сохранить исходный IP - PullRequest
0 голосов
/ 14 апреля 2020

У меня есть небольшой кластер Kubernetes on prem (Rancher 2.3.6), состоящий из трех узлов. Развертывания внутри кластера динамически предоставляются внешним приложением, и для их счетчика реплик всегда установлено значение 1, поскольку это приложения с состоянием и высокая доступность не требуется.

Приложения подвергаются действию inte rnet сервисами NodePort со случайным портом и ExternalTrafficPolicy, установленным в Cluster. Таким образом, если пользователь запрашивает один из трех узлов, прокси-сервер k8s направит и s-NAT запрос на правильный узел с модулем приложения.

К этому моменту все работает нормально.

Проблема началась, когда мы добавили приложения, которые полагаются на IP-адрес источника запросов. Поскольку s-NAT заменяет IP-адрес запроса внутренним IP-адресом, эти приложения не работают должным образом.

Я знаю, что установка служб ExternalTrafficPolicy на локальный режим не будет выполнять s-natting. Но это также нарушит архитектуру, потому что не у каждого модуля есть экземпляр запущенного приложения.

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

Ответы [ 2 ]

0 голосов
/ 20 апреля 2020

Вы можете установить MetalLB LoadBalancer в режиме layer2 и использовать ExternalTrafficPolicy: Local.

В документах metalLB вы можете прочитать:

При объявлении в режиме layer2 один узел в вашем кластере будет привлекать трафик c для IP-адреса службы. Оттуда поведение зависит от выбранной политики traffi c.

В этом режиме только узлы, которые имеют конечные точки службы (реплики Pod> 0), будут обслуживать входящий трафик; конечно в этом режиме клиентские SourceIPs сохраняются.

0 голосов
/ 15 апреля 2020

Веб-приложения могут быть доступны вне кластера, используя Ingress вместо NodePorts. Входящий объект может указывать на развертывание приложения с использованием промежуточной службы, где вы можете настроить service.spec.externalTrafficPolicy: Local для сохранения исходного IP-адреса. У вас может быть внешний балансировщик нагрузки, указывающий на узлы кластера, где модули входного контроллера предназначены для маршрутизации трафика c.

Ссылка: https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/

...