Получить реальный 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