如何从Kubernetes服务(EKS)中的HTTP请求获取客户端IP地址

bjp0bcyl  于 2023-06-21  发布在  Kubernetes
关注(0)|答案(2)|浏览(171)

我们在ALB入口(ALB负载均衡器)后面运行ms作为pod。我的问题是所有HTTP请求日志都显示集群IP地址,而不是HTTP客户端的IP。有没有其他方法可以让kubernetes服务将此信息传递到我的应用服务器以显示客户端ip地址?即使用java代码usig尝试get.remote.address函数,仍然得到同样的结果。我知道有一个方法“service.spec.externalTrafficPolicy”,但这只适用于GCE,而不适用于AWS。任何帮助!!!!!!

sg3maiej

sg3maiej1#

您可以将Network Load Balancer与Kubernetes服务一起使用,客户端流量首先在集群分配的nodePort上命中kube-proxy,然后传递给集群中所有匹配的pod。当spec.externalTrafficPolicy设置为默认值Cluster时,传入的LoadBalancer流量可能会被kube-proxy发送到本节点的Pod,也可能会被发送到其他节点的Pod。通过这种配置,客户端IP被发送到kube-proxy,但当数据包到达end pod时,客户端IP显示为kube-proxy的本地IP。
通过将spec.externalTrafficPolicy更改为Local,kube-proxy会将源IP正确转发到end pod,但只会将流量发送到kube-proxy自身运行的节点上的pod。Kube-proxy还为NLB健康检查打开另一个端口,因此流量仅定向到具有与服务选择器匹配的Pod的节点。

apiVersion: v1
kind: Service
metadata:
  name: nginx
  namespace: default
  labels:
    app: nginx
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-type: "nlb"
spec:
  externalTrafficPolicy: Local
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx
type: LoadBalancer
nsc4cvqm

nsc4cvqm2#

我能够在cloudfront的帮助下做到这一点。我已经启用了多个标头,然后在日志中传递,如CDN本身的位置和客户端IP,并得到了我的解决方案。

相关问题