您当前的位置:首页 > 计算机 > 服务器 > 网络服务

kubesphere 上部署的服务(nginx代理)怎么获取用户客户访问的真实的IP

时间:08-05来源:作者:点击数:

默认情况下,发送到 Type=NodePort 的 Service 的数据包会经过源 NAT 处理,导致无法获取到用户的真实ip。

网上的方法太复杂,我这里直接整理一套。

处理方法:

注:我这里是用的type=NodePort,这样方便用kubesphere的节点直接访问应用。

步骤一:nginx配置

首先我们已经部署好了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};
步骤二:创建 service 服务

选择nodeport

 步骤三:修改服务的yaml文件

修改刚才创建的nginx 服务的yaml 文件。

externalTrafficPolicy: Cluster   ----->  externalTrafficPolicy: Local

internalTrafficPolicy: Cluster   ----->  internalTrafficPolicy: Local

  • Cluster(默认值):
    • Cluster 模式表示外部流量进入 Kubernetes 集群后,会被负载均衡到集群中的所有节点,无论流量是从哪个节点进入的。
    • 在这种模式下,流量会通过集群中的所有节点进行负载均衡,目标是根据服务的所有 Pod 的 IP 来选择目标 Pod。
    • 这种方式会丢失源 IP 地址(即外部客户端的真实 IP 地址),因此客户端的 IP 地址在 Pod 内部只能看到节点的 IP 地址。
  • Local
    • Local 模式表示外部流量只会被路由到有实际 Pod 的节点,也就是说,流量不会被路由到没有目标 Pod 的节点。
    • 在这种模式下,外部流量仍然会保持源 IP 地址,也就是你可以在 Pod 内获取到客户端的真实 IP 地址。这对某些应用非常有用,特别是需要记录或使用客户端真实 IP 的场景。
    • 但是,这种模式要求负载均衡器只能将流量路由到具有目标 Pod 的节点。如果没有 Pod 可用,流量将被丢弃。

步骤四:修改pod调度规则

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

注: 可能kubesphere master节点是禁止调度的,所以pod节点只能调度到几个worker节点,后续访问就需要通过worker节点的ip进项访问

访问:http://worker_ip:端口

第五步:Haproxy 负载(可选)

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地址了,下课!

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门
本栏推荐