NodePort Service 获取客户端真实 IP
当我们通过 NodeIP:NodePort
访问NodePort类型的service时,默认情况下,肯定会发生SNAT,服务端看到的ip地址是NodeIP对应的k8s node的ip地址。
查看 Nginx 访问日志,可以发现,服务端看到的源IP都不是真实的源IP,而是跳板node的ip。
为了避免发生SNAT,让服务端看到真实的客户端IP,用户可以通过配置来实现。
svc.spec.externalTrafficPolicy=Local
externalTrafficPolicy
apiVersion: v1
kind: Service
metadata:
namespace: halo
name: halo-nginx-service
spec:
selector:
app: halo-nginx
type: NodePort
externalTrafficPolicy: Local
ports:
- protocol: TCP
port: 443
targetPort: 443
ExternalTrafficPolicy的默认值是Cluster,该模式下会做snat,并且可能会导致增加一跳才到达目标节点的pod上(比如上图中的node1),但是该模式下更加负载均衡。
而Local策略呢,将只会转发到本节点的后端pod列表,假如本节点没有svc关联的pod将会导致请求失败。但是呢,他减少了一跳,相当于上图中的客户端直接访问Node2的IP,并且不需要做SNAT,服务端pod看到的ip是真实的客户端ip。