1

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

4

1 回答 1

7

您可以将网络负载均衡器与 Kubernetes 服务一起使用,客户端流量首先到达集群分配的 nodePort 上的 kube-proxy,然后传递到集群中所有匹配的 Pod。当spec.externalTrafficPolicy设置为Cluster的默认值时,传入的 LoadBalancer 流量可能由 kube-proxy 发送到节点上的 Pod,或发送到其他节点上的 Pod。使用此配置,客户端 IP 被发送到 kube-proxy,但是当数据包到达末端 pod 时,客户端 IP 显示为kube-proxy 的本地 IP。

通过将spec.externalTrafficPolicy更改为Local,kube-proxy 将正确地将源 IP转发到最终 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
于 2020-12-23T09:33:33.667 回答