Kubernetes如何平衡外部持久TCP连接的负载?

问题描述 投票:0回答:1

我在与我的kubernetes副本的持久tcp连接进行负载平衡时遇到问题。

我在kubernetes集群之外有Unity3D客户端。

我的集群是安装了metallb的裸机集群,它由3个节点组成:1个主节点和2个工作节点。

据我所知,有两种方法:

1)客户端连接到所有副本,并且每次需要发送请求时,它将使用先前已建立的副本中的随机连接进行发送。它会定期刷新连接(以防自动缩放或某些持久连接死亡)。

这里的问题是,我不确定如何从外部访问所有副本,无头服务无法在外部公开。

2)服务网格?我已经模糊地阅读/理解了它们可能代表您建立持久性tcp。所以像这样:

unity3d客户端控制器副本

但是,我不确定如何完成此操作,也不确定如果控制器本身发生故障,所有客户端的连接都会断开吗?正如我所看到的,它将归结为与1)中的问题相同的问题,即允许客户端通过持久的TCP连接同时连接到多个不同的副本。

部分问题是对此的补充:https://learnk8s.io/kubernetes-long-lived-connections

kubernetes tcp load-balancing haproxy distributed-system
1个回答
0
投票

为了启用到您群集的外部流量,您需要一个Ingress网关。您的入口网关可以是the standard nginx Ingress,是由Istio Gateway等网状网提供的网关,或者是ambassadortraefik,kong,gloo等更专业的边缘网关。>

至少有两种方法可以在K8s中执行负载平衡:

  1. 使用Service资源,它只是由kube-proxy进程管理的一组iptables规则。这仅是L4负载平衡。不支持诸如HTTP2或gRPC之类的L7应用协议。根据您的情况,这种类型的LB可能不适用于长寿命的连接,因为连接很少会关闭。

  2. 使用ingress controllers中任何一个提供的L7负载平衡,这将跳过iptables路由(使用无头服务),并允许使用更高级的负载平衡算法。

  3. 为了从后一种情况中受益,您仍然需要确保最终终止连接,这通常是从客户端到代理的(在重用从代理到上游的连接时)。我对Unity3D连接不熟悉,但是如果不能选择终止它们,那么您最终将无法进行太多的负载平衡。

当控制器发生故障时,连接将被丢弃,您的客户端可能会重新尝试尝试连接或出现紧急情况。这取决于您的编码方式。

© www.soinside.com 2019 - 2024. All rights reserved.