2016-09-29 6 views
4

Моя цель - сделать мое веб-приложение (развернутое на кластере Kubernetes 1.4), увидеть IP-адрес клиента, который изначально сделал HTTP-запрос. Поскольку я планирую запустить приложение на голое кластерное приложение, GCE и аннотация сервиса service.alpha.kubernetes.io/external-traffic: OnlyLocal, введенная в 1.4, не применима для меня.Сохранение удаленного клиента IP с Ingress

Ищем альтернативы, я нашел this question, который предлагает настроить вход для достижения моей цели. Итак, я настроил Ingress и the NginX Ingress Controller. Развертывание прошло гладко, и я смог подключиться к своему веб-приложению через Ingress Address и порт 80. Однако в журналах я все еще вижу диапазон IP-адресов внутри кластера (из 172.16.0.0/16), а это означает, что внешний клиент IP-адреса не проходят должным образом через Ingress. Не могли бы вы рассказать мне, что мне нужно для настройки в дополнение к приведенному выше, чтобы заставить его работать?

My Ingress' конфигурация:

apiVersion: extensions/v1beta1 
kind: Ingress 
metadata: 
    name: myWebApp 
spec: 
    backend: 
    serviceName: myWebApp 
    servicePort: 8080 

ответ

3

В слое 4 прокси, Nginx не может сохранить исходный IP-адрес источника в фактических пакетах IP. Вы можете обойти это, используя Proxy protocol (ссылка указывает на документацию HAProxy, но Nginx также поддерживает ее).

Для этого, однако, для поддержки этого протокола необходимо поддерживать восходящий сервер (что означает услугу myWebApp). В случае, если ваше восходящее приложение также использует Nginx, вы можете включить поддержку протокола прокси в конфигурации вашего сервера, как описано в документе in the official documentation.

Согласно Nginx Ingress Controller's documentation, эта функция может быть включена в контроллере Ingress с помощью Kubernetes ConfigMap:

apiVersion: v1 
kind: ConfigMap 
metadata: 
    name: nginx-ingress-controller 
data: 
    use-proxy-protocol: "true" 

Укажите имя ConfigMap в контроллере Ingress манифеста, путем добавления --nginx-configmap=<insert-configmap-name> флаг в команде -строчные аргументы.

Смежные вопросы