【问题标题】:How can I enable session affinity by client IP on a kubernetes loadbalancer in GCP如何在 GCP 中的 kubernetes 负载均衡器上通过客户端 IP 启用会话亲和性
【发布时间】:2019-06-12 16:55:43
【问题描述】:

我必须在 GCP Kubernetes 集群中设置 FTP 服务器,但不知道如何路由客户端,以便将来自同一 IP 到不同端口的多个请求路由到同一个 Kubernetes pod。

在(被动)FTP协议中,服务器打开一个新端口,并将端口号发送给客户端。客户端然后创建到该端口的新连接。因此,我需要确保第二个请求被路由到同一个 pod,因为只有在那个 pod 上,服务器才在等待新的连接。

我尝试了一个最小示例,其中两个 Pod 的工作负载什么都不做,并且暴露了端口 21 和 30000-30098。然后,我将 LoadBalancer 类型的服务设置如下(简化为相关部分):

kind: Service
spec:
    type: LoadBalancer
    sessionAffinity: ClientIP
    loadBalancerIP: IP_OF_LB
    ports:
    - name: ftp-control
      port: 21
      protocol: TCP
      targetPort: 21
    - name: pasv-30000
      port: 30000
      protocol: TCP
      targetPort: 30000
      # and so on for the remaining ports up to 30098

现在我使用 shell 登录每个 pod,并开始在一个端口上手动监听,如下所示:

netcat -l -p 30001

然后,我从我的工作站使用 telnet 连接到负载平衡器的 IP 地址。

telnet IP_OF_LB 30001

这样,我可以看到哪个 pod 获得了传入的连接请求。

对于单个端口,负载均衡器总是将我的请求转发到同一个 pod。

但是,当我尝试多个端口时,我可以看到后续请求被路由到不同的 pod,即使会话亲和性设置为 ClientIP

有没有我遗漏的设置?我假设,客户端 IP 的会话亲和性只会使用客户端的 IP 来确定目标 pod。但是,它看起来好像在使用 IP 和端口。

有谁知道我是否可以尝试更多设置来获得所需的行为?

【问题讨论】:

  • 请将您的问题移至Super User(在此处删除,在此处重新发布)。这是off-topic here
  • 您好,马丁,感谢您的提示。但是,我在超级用户上没有看到标签“kubernetes”、“google-cloud-platform”。您知道是否有更合适的页面涵盖这些主题?也许这个问题更像是一个 devops 问题

标签: kubernetes ftp google-cloud-platform load-balancing google-kubernetes-engine


【解决方案1】:

我可以看到您将服务配置为 LoadBalancer 类型,但是在其上配置 session affinity 会很麻烦。因此,我实际上建议执行以下操作:

Backend config -> Nodeport service -> Ingress

请使用client IP affinityBackend Configs查看更多信息。

【讨论】:

  • 您好 Galo,感谢您的帮助。但据我所见,我只能为 Kubernetes 配置一个 Ingress 用于 http 请求。我需要在 TCP 级别转发数据。
  • 您好 Haplo,正确配置 Ingress 您需要使用 HTTP(S) 请求。如果您需要通过 TCP 进行操作,我可以在 Session affinity based on Client IP 上推荐此文档,您不需要 Kubernetes 服务和客户端之间的 Ingress/Proxy。
  • 或者有另一个选项使用externalTrafficPolicy,创建外部LB并保留客户端源IP。
  • 您好 Galo,再次感谢您的帮助。我已经将会话关联设置为客户端 IP。虽然我认为我配置了错误,但这也可能是一个错误,我已向 Google 报告了该行为。
  • 你好单倍体。实际上,让我与您分享客户端 IP 的会话亲和性仅适用于节点 VM,而不适用于其中的单个 pod。此外,一些 GCP 的 LB 支持网络端点组 (NEG),它将流量从 LB 直接引导到 Pod。目前,网络 LB(在您的情况下为 TCP)和内部 LB 都不支持 NEG。
【解决方案2】:

我在 Google 发布了一份错误报告,他们说这是预期行为: bug report

我假设如果我定义一个负载均衡器类型的 Kubernetes 服务,那么负载会在 pod 级别进行均衡。相反,负载平衡器会基于 VM 平衡流量。

显然,流量被平衡了两次。首先,负载均衡器将流量分配到 VM,然后 Kubernetes 将流量均衡到不同的 pod。

这意味着,会话亲和性不适用于 Google Kubernetes Engine 中的负载均衡器和 Kubernetes。

【讨论】:

    猜你喜欢
    • 2011-06-20
    • 2019-10-20
    • 1970-01-01
    • 2013-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-09
    • 2014-09-21
    相关资源
    最近更新 更多