问题: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地址。

Logo

开源、云原生的融合云平台

更多推荐