通常,当集群内的客户端连接到服务的时候,是支持服务的 Pod 可以获取到客户端的 IP 地址的,但是,当通过节点端口接收到连接时,由于对数据包执行了源网络地址转换(SNAT),因此数据包的源 IP 地址会发生变化,后端的 Pod 无法看到实际的客户端 IP,对于某些应用来说是个问题,比如,nginx 的请求日志就无法获取准确的客户端访问 IP 了。
官方文档: https://kubernetes.io/docs/tutorials/services/source-ip/
解决方法:
可以使用 NodePort + {“spec”:{“externalTrafficPolicy”:”Local”}} 的配置来实现。
注意:需要将pod调度到指定node节点上才可以
利用 INGERSS,可以在INGRESS 请求转发阶段将客户端IP 带到请求头中。
pod直接使用 HOST 网络模式。
以下实例使用方法1:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 apiVersion: apps/v1 kind: Deployment metadata: name: nginx spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: tolerations: - operator: "Exists" nodeSelector: kubernetes.io/hostname: master containers: - name: nginx image: nginx:1.7.9 ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: nginx spec: externalTrafficPolicy: Local selector: app: nginx type: NodePort ports: - protocol: TCP port: 80 targetPort: 80