【问题标题】:Kubernetes how to load balance EXTERNAL persistent tcp connections?Kubernetes如何负载平衡EXTERNAL持久tcp连接?
【发布时间】:2020-06-13 15:39:45
【问题描述】:

我在对我的 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】:

    为了启用到集群的外部流量,您需要一个 Ingress Gateway。您的入口网关可以是 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 路由(使用无头服务)并允许更高级的负载平衡算法。

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

    当控制器发生故障时,连接将被断开,您的客户端可能会优雅地重新尝试连接或出现紧急情况。这取决于你如何编码。

    【讨论】:

      猜你喜欢
      • 2018-11-04
      • 1970-01-01
      • 2011-12-15
      • 1970-01-01
      • 2012-02-13
      • 2022-01-10
      • 2016-12-25
      • 2014-01-03
      • 1970-01-01
      相关资源
      最近更新 更多