繁体   English   中英

在 Kubernetes 中使用最少连接平衡流量

[英]Balancing traffic using least connection in Kubernetes

我有一个 Kubernetes 集群,其部署类似于下一个:

在此处输入图像描述

这里的目标是在通过名为my-app的 ClusterIP 服务公开的多个 pod 中部署应用程序。 在多个命名空间(A、B 和 C)中进行相同的部署,稍微更改应用程序的配置。 然后,在某些节点中,我有一个使用 hostNetwork 绑定到节点端口的 HAProxy。 这些 HAProxy 通过指向它们 (my_app.com) 的 DNS 向我的客户公开。

当客户端连接到我的应用程序时,他们会发送 header 指定请求应重定向到的命名空间(A、B 或 C),并且 HAProxy 使用do-resolve服务的my_app.A.svc.cluster.localmy_app.A.svc.cluster.local ,它返回命名空间A中服务my_app的 IP。 这样,我的集群就可以有一个入口点(单个 DNS 记录)和一个端口(80),这是我的要求之一。 我还能够创建新的命名空间并部署我的应用程序的其他配置,而无需修改 HAProxies,这是第二个要求。

现在,我收到的请求是短请求和长请求的混合,所以我需要在这里使用最少的连接。 这在 HAProxies 中是不可能的,因为我没有后端列表(重定向是动态的,如您在下面的代码中所见)。 我正在尝试将 kube-proxy 与 IPVS 和最少连接模式一起使用。 我注意到的是,到不同 pod 的连接跟踪是按节点进行的,并且这些信息不会在不同节点之间共享。 这样,如果对my_app.com Namespace: A的两个请求由两个不同的节点处理,则两者都可以 go 到每个节点中相同的 pod(例如 pod_1),到该 pod 的活动连接数为 0。问题随着我增加 DNS 后面的 HAProxies 的数量,情况变得更糟。

如何在没有集群入口点的情况下解决这个问题并获得更好的平衡(在 DNS 后面有一个 HAProxy)?

我在这里添加了 HAProxy 中使用的代码,以根据标头进行路由:

resolvers dns
    hold nx 3s
    hold other 3s
    parse-resolv-conf

frontend my_app_frontend
    bind :80
    default_backend my_app_backend
    http-request set-var(sess.namespace) hdr(X-Namespace)
    http-request do-resolve(txn.service,dns,ipv4) str(),concat(my_app.,sess.namespace,.svc.cluster.local)

backend my_app_backend
    http-request set-dst var(txn.service)
    http-request set-dst-port int(80)
    server service 0.0.0.0:0

我会使用 HAProxy 的 peers 功能来保存跨节点边界的命名空间会话。
https://www.haproxy.com/blog/introduction-to-haproxy-stick-tables/

简而言之,未经测试

peers mypeers
  peer node1 192.168.122.64:10000
  peer node2 192.168.122.1:10000

backend my_app_backend
  stick-table type string len 32 size 100k expire 30m peers mypeers
  stick on hdr(X-Namespace)
  http-request set-dst var(txn.service)
  http-request set-dst-port int(80)
  server service 0.0.0.0:0

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM