默认情况下,发送到 Type=NodePort 的 Service 的数据包会经过源 NAT 处理,导致无法获取到用户的真实ip。
网上的方法太复杂,我这里直接整理一套。
处理方法:
注:我这里是用的type=NodePort,这样方便用kubesphere的节点直接访问应用。
首先我们已经部署好了nginx的工作负载,当然这里需要挂载nginx的配置,
nginx的配置需要添加一下配置:
proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header appId ${appId}; add_header appId ${appId};



选择nodeport


修改刚才创建的nginx 服务的yaml 文件。
externalTrafficPolicy: Cluster -----> externalTrafficPolicy: Local
internalTrafficPolicy: Cluster -----> internalTrafficPolicy: Local

步骤四:修改pod调度规则
修改nginx工作负载 的pod调度规则,添加工作负载副本。根据Local 属性的特点,需要将副本添加的与节点数相同 。


注: 可能kubesphere master节点是禁止调度的,所以pod节点只能调度到几个worker节点,后续访问就需要通过worker节点的ip进项访问
访问:http://worker_ip:端口
haproxy代理kubesphere 的nginx服务 访问应用无法获取真实的ip
解决:
haproxy配置,添加 option forwardfor
frontend http_front
bind *:80
option forwardfor # 添加 X-Forwarded-For 头部
default_backend http_back
backend http_back
server web1 192.168.1.101:80 check
server web2 192.168.1.102:80 check
kubesphere上ngixn服务配置添加:
set_real_ip_from 0.0.0.0/0;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
例:
server {
listen 80;
server_name example.com;
# 信任的 HAProxy 或代理的 IP 地址范围
set_real_ip_from 0.0.0.0/0;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
location / {
proxy_pass http://backend;
}
}
OK,这样配置就可以在应用中获取到真实的ip地址了,下课!

