用于 haproxy 的 Iperf udp 流量

udp traffic with Iperf for haproxy

我正在使用 Docker 容器在 Haproxy 的 "performance evaluation" 上开发我的个人项目。我正在使用 Python 编程并使用 iperf 生成流量。

我创建了几个 Docker 容器作为客户端和服务器。客户端应该通过充当负载平衡器的 Haproxy 容器将 udp 流量发送到服务器。

问题是当我尝试将 udp 流量从客户端发送到服务器时,Haproxy 拒绝连接。 我没有在官方文档中找到如何绑定或监听UDP端口。

预先感谢您的回复。

这是我的 haproxy.cfg 的副本。

global quiet nbproc 4 daemon listen tcp_haproxy 172.17.4.230:5001 balance roundrobin server server0 172.17.4.227:5001 server server1 172.17.4.228:5001 server server2 172.17.4.229:5001

正如我所读,这个问题更多的是关于 UDP 负载平衡而不是 Docker。如果我看错了问题,请随时纠正我。

您可能不喜欢这个答案,但请继续。 HAProxy 不支持 UDPofficial homepage describes HAProxy as TCP and HTTP proxy explicitly (by implication, this means "no UDP"). There are also this question on ServerFault关于UDP负载均衡的话题,里面也讨论了HAProxy,赶紧吐槽。

因为我自己不喜欢 "that's not possible, deal with it" 作为答案,让我们看看替代方案。

  1. 一些询问有关 UDP 负载平衡的资源最终推荐 IPVS as load balancer. It's part of the Linux kernel, which makes it a bad solution if you're looking for something based on Docker. If that's not a deal breaker for you, there a short example on the Wikipedia page 可以根据您使用三个 UDP 服务器的情况进行调整:

    ipvsadm -A -u 172.17.4.230:5001 -s rr
    ipvsadm -a -u 172.17.4.230:5001 -r 172.17.4.227:5001 -m
    ipvsadm -a -u 172.17.4.230:5001 -r 172.17.4.228:5001 -m
    ipvsadm -a -u 172.17.4.230:5001 -r 172.17.4.229:5001 -m
    
  2. 快速 Google 搜索会找到替代的开源解决方案,例如 Pen。或许也值得一看?

  3. 确定不能改用 TCP 吗? ;)

截至 2016 年 3 月,此问题的最佳解决方案目前是 Nginx >=1.9.13 :

https://www.nginx.com/blog/announcing-udp-load-balancing/

您可以像后端 TCP 反向代理一样为 UDP 上游配置 HA 和运行状况检查。对于我的项目,我们使用基础 Nginx 容器中的自定义容器实施了一个解决方案(可能与 OP 的 docker 用例相关),可在此处找到:

https://hub.docker.com/_/nginx/