我必须在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和端口。
有人知道我还有其他设置可以尝试获得所需的行为吗?
答案 0 :(得分:2)
我可以看到您将服务配置为LoadBalancer类型,但是在其上配置session affinity会很麻烦。因此,我实际上建议执行以下操作:
Backend config-> Nodeport service-> Ingress
请使用client IP affinity和Backend Configs查看更多信息。
答案 1 :(得分:0)
我在Google上发布了一个错误报告,他们说这是预期的行为: bug report
我假设如果定义类型为负载均衡器的Kubernetes服务,那么负载将在Pod级进行均衡。相反,负载平衡器将基于VM平衡流量。
显然,流量被平衡了两次。首先,负载平衡器将流量分配给虚拟机,然后Kubernetes将该流量平衡到不同的Pod。
这意味着,会话亲缘关系不适用于Google Kubernetes引擎中的负载均衡器和Kubernetes。