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

时间:2019-01-18 12:09:21

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

我必须在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

现在,我使用外壳登录到每个Pod,并开始按如下方式在一个端口上手动监听:

netcat -l -p 30001

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

telnet IP_OF_LB 30001

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

对于单个端口,负载平衡器始终将我的请求转发到同一吊舱。

但是,当我尝试多个端口时,即使会话关联性设置为ClientIP,我仍可以看到后续请求被路由到了不同的Pod。

我错过了任何设置吗?我假设,客户端IP的会话亲缘关系只会使用客户端的IP来确定目标容器。但是,看起来好像正在使用IP和端口。

有人知道我还有其他设置可以尝试获得所需的行为吗?

2 个答案:

答案 0 :(得分:2)

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

Backend config-> Nodeport service-> Ingress

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

答案 1 :(得分:0)

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

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

显然,流量被平衡了两次。首先,负载平衡器将流量分配给虚拟机,然后Kubernetes将该流量平衡到不同的Pod。

这意味着,会话亲缘关系不适用于Google Kubernetes引擎中的负载均衡器和Kubernetes。