Сохранение IP-адреса удаленного клиента с помощью Ingress
Моя цель - сделать так, чтобы мое веб-приложение (развернутое в кластере Kubernetes 1.4) увидело IP-адрес клиента, который первоначально сделал HTTP-запрос. Поскольку я планирую запустить приложение на кластере с голым железом, GCE и service.alpha.kubernetes.io/external-traffic: OnlyLocal
аннотация сервиса, введенная в 1.4, для меня неприменима.
В поисках альтернатив, я нашел этот вопрос, который предлагает создать Ingress для достижения моей цели. Итак, я настроил Ingress и NginX Ingress Controller. Развертывание прошло гладко, и я смог подключиться к своему веб-приложению через входящий адрес и порт 80. Однако в журналах я по-прежнему вижу диапазон внутренних IP-адресов кластера (с 172.16.0.0/16) - и это означает, что внешний клиент IP-адреса не проходят должным образом через вход. Не могли бы вы сказать мне, что мне нужно настроить в дополнение к вышесказанному, чтобы он работал?
Мой Ingress'конфиг:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: myWebApp
spec:
backend:
serviceName: myWebApp
servicePort: 8080
1 ответ
Как прокси уровня 4, Nginx не может сохранить исходный IP-адрес источника в фактических IP-пакетах. Вы можете обойти это, используя протокол Proxy (ссылка указывает на документацию HAProxy, но Nginx также поддерживает это).
Однако, чтобы это работало, вышестоящий сервер (myWebApp
сервис в вашем случае) также должен поддерживать этот протокол. В случае, если ваше апстрим-приложение также использует Nginx, вы можете включить поддержку прокси-протокола в конфигурации вашего сервера, как описано в официальной документации.
Согласно документации Nginx Ingress Controller, эта функция может быть включена в Ingress Controller с помощью Kubernetes ConfigMap:
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-ingress-controller
data:
use-proxy-protocol: "true"
Укажите имя ConfigMap в манифесте контроллера Ingress, добавив --nginx-configmap=<insert-configmap-name>
флаг для аргументов командной строки.