При работе с Kubernetes часто требуется получать реальные IP-адреса клиентов для различных целей, таких как настройка rate-limit на стороне ingress-controller. Однако из-за особенностей маршрутизации трафика через балансировщик нагрузки и ingress-контроллер реальные IP-адреса клиентов не будут отображаться, а вместо них будет присутствовать IP-адрес балансировщика.
Чтобы получить реальный IP-адрес клиента, нужно настроить взаимодействие между балансировщиком нагрузки и ingress-контроллером с использованием PROXY-протокола. Этот протокол передает различную информацию о клиентском подключении, включая данные об IP-адресе. Ingress-контроллер принимает эти данные, извлекает IP-адрес из метаданных и передает его конечному приложению в виде заголовков.
Настройка PROXY-протокола для передачи IP-адреса клиента
Настройка включает в себя изменения как на стороне балансировщика нагрузки, так и на стороне ingress-контроллера. Конфигурация будет отличаться в зависимости от используемого ingress-контроллера. Ниже мы опишем настройку для ingress-nginx. Предполагается, что ingress-nginx уже установлен в своем неймспейсе по умолчанию — ingress-nginx.
-
1
Включите PROXY-протокол в балансировщике нагрузки и задайте для параметра externalTrafficPolicy значение Local с помощью команды:
kubectl patch svc -n ingress-nginx ingress-nginx-controller -p '{"metadata": {"annotations": {"loadbalancer.openstack.org/proxy-protocol": "true"}}, "spec":{"externalTrafficPolicy":"Local"}}'
-
2
Включите PROXY-протокол в ingress-nginx с помощью команды:
kubectl patch configmap -n ingress-nginx ingress-nginx-controller -p '{"data":{"use-proxy-protocol":"true"}}'
После выполнения указанных команд ingress-nginx будет извлекать реальный IP-адрес клиента из метаданных PROXY-протокола и передавать его в конечное приложение через заголовок X-Real-IP.
Помогла ли вам статья?
Спасибо за оценку. Рады помочь 😊