Kubernetes获取用户请求的真实IP地址。
问题:SpringBoot 项目部署在Kubernetes 集群中,用户在请求Kubernetes 内的服务时,获取客户端IP地址时,获取到的IP地址总是获取的是k8s节点的IP,不是用户的IP地址.解决方方式:1、如果向外暴漏服务的pod,是直接以nodePort的方式向外部暴露服务的,直接修改管理该pod的Service配置文件,添加externalTrafficPolicy: Local..
问题:SpringBoot 项目部署在Kubernetes 集群中,用户在请求Kubernetes 内的服务时,获取客户端IP地址时,获取到的IP地址总是获取的是k8s节点的IP,不是用户的IP地址.
解决方方式:
1、如果向外暴漏服务的pod,是直接以nodePort的方式向外部暴露服务的,直接修改管理该pod的Service配置文件,添加externalTrafficPolicy: Local配置就可以正常获取到请求的IP地址。
缺点:客户端只能访问pod所在的node节点,无法使用其他node节点访问服务。
因为设置 service.spec.externalTrafficPolicy 的值为 Local后,请求就只会被代理到本地 endpoints 而不会被转发到其它节点。这样就保留了原来的IP 地址。
2、如果集群中有使用ingress。可以修改nginx-ingress-controller的配置mandatory.yml,以DaemonSet方式安装nginx-ingress-controller,以NodePort方式暴露ingress-nginx服务可以实现客户端从任何node节点访问,并可获取到客户端的真实IP:
修改mandatory.yml(EP:我的版本是0.26.1) 的deployment的type为daemonset,删除replicas: 1
修改后执行:
kubectl apply -f mandatory.yml
NodePort方式暴露ingress-nginx,添加externalTrafficPolicy: Local
执行部署service:
kubectl apply -f service-nodeport.yml
配置完成后可以通过ingress各个节点访问并获取正确的请求IP地址。
更多推荐
所有评论(0)