Получить реальный IP-адрес посетителей в приложении PHP, работающем за сервисом Kubernetes LoadBalancer в GCE

У меня проблемы с получением реального IP-адреса посетителей в моем приложении PHP. У меня Kubernetes работает в Google Container Engine (мастер: 1.4.8, узел: 1.4.7).

Определение сервиса:

apiVersion: v1
kind: Service
metadata:
    name: app-service
spec:
    type: LoadBalancer # spawning google loadbalancer
    selector:
        name: app # running simple php/nginx container
    ports:
        - port: 80
          targetPort: 80

Как это может быть, что X-Forwarded-For заголовки и т. д. не проходят через мое php-приложение? Я получаю только исходный IP (в php REMOTE_ADDR), который 10.0.1.1, В Google Cloud я вижу, что сервис использует балансировщик нагрузки 4 уровня. Может ли это быть проблемой, что реальный источник IP потерян, и X-Forwarded-For заголовок никогда не устанавливается?

Если бы кто-то мог объяснить мне, что происходит, это было бы очень полезно!

Для чего я использую следующую конфигурацию nginx в контейнере приложения:

location ~ \.php$ {
    fastcgi_pass php-upstream;
    fastcgi_split_path_info ^(.+\.php)(/.*)$;
    include fastcgi_params;
    fastcgi_param  SCRIPT_FILENAME  $realpath_root$fastcgi_script_name;
    fastcgi_param DOCUMENT_ROOT $realpath_root;
}

РЕДАКТИРОВАТЬ Я поместил все свое приложение за CloudFlare, поэтому оно теперь указывает на CloudFlare http proxy -> GCE Load Balancer. И как-то X-Forwarded-For Заголовки и все присутствующие! Для меня кажется, что проблема с GCE Load Balancer, он как-то не может установить эти заголовки?

1 ответ

В Kubernetes 1.5 была добавлена новая функция:

Из-за реализации этой функции исходный IP-адрес для сеансов, видимый в целевом контейнере, не будет исходным исходным IP-адресом клиента. Это поведение по умолчанию для Kubernetes v1.5. Однако начиная с версии 1.5 была добавлена ​​дополнительная бета-функция, которая сохранит исходный IP-адрес клиента для сред GCE/GKE. Эта функция будет внедрена для других облачных провайдеров в последующих выпусках.

Более подробная информация доступна здесь и сводится к добавлению аннотации для услуг типа loadbalancer:

$ kubectl annotate service loadbalancer service.beta.kubernetes.io/external-traffic=OnlyLocal

Это откроет порт проверки работоспособности на узле, чтобы проверить, доступны ли конечные точки службы на узле.

Более подробные сведения о том, как эта проблема распространяется на другие кластеры, по-видимому, доступны на сайте kubernetes / проблема с функциями, отслеживающими эту функцию.

Примечание: вопрос кажется похожим на /questions/8198367/kubernetes-ne-sohranil-istochnik-ip

Другие вопросы по тегам