代码之家  ›  专栏  ›  技术社区  ›  Haplo

如何在gcp中的kubernetes负载均衡器上通过客户端IP启用会话关联

  •  -1
  • Haplo  · 技术社区  · 6 年前

    我必须在gcp kubernetes集群中设置一个ftp服务器,并且不知道如何路由客户机,以便将来自同一IP的多个请求路由到不同的端口,从而将它们路由到同一个kubernetes pod。

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

    我尝试了一个最小的样本,其中有两个不做任何事情的pods,端口21和30000-30098暴露在外。然后,我设置了如下类型的负载均衡器服务(减少到相关部分):

    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登录到每个pods,并开始在一个端口上手动监听,如下所示:

    netcat -l -p 30001
    

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

    telnet IP_OF_LB 30001
    

    这样,我就可以看到哪个POD收到了传入的连接请求。

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

    但是,当我尝试几个端口时,我可以看到后续请求被路由到不同的pods,即使会话关联设置为 ClientIP .

    有什么我错过的场景吗?我假设,客户端IP的会话关联只使用客户端的IP来确定目标POD。但是,它看起来好像在使用IP和端口。

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

    2 回复  |  直到 6 年前
        1
  •  2
  •   Galo    6 年前

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

    Backend config -gt; Nodeport service -gt; Ingress

    请检查使用 client IP affinity Backend Configs 更多信息。

        2
  •  0
  •   Haplo    6 年前

    我在谷歌发布了一个bug报告,他们说这是预期行为: bug report

    我假设,如果我定义一个负载均衡器类型的kubernetes服务,那么负载将在pod级别上平衡。相反,负载均衡器在虚拟机基础上平衡流量。

    显然,交通平衡了两次。首先,负载均衡器将流量分配给vms,然后kubernetes将流量平衡到不同的pods。

    这意味着,会话关联对于GoogleKubernetes引擎中的负载均衡器和Kubernetes不起作用。