Haproxy重新加载不同的后端服务器IP
问题描述:
当后端服务器IP改变时,可以重新加载haproxy吗?如果,如何?Haproxy重新加载不同的后端服务器IP
码头堆栈是必不可少的。在每次部署时,具有不同IP的新容器将替换旧容器。
在我们的实现中,服务偶尔会返回503,因为旧haproxy进程没有终止并仍然接受请求,而后端服务器已经不存在了。 httplog显示一些请求转发了一个已经消失的后端。
# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 893 0.0 0.0 0 0 ? Zs 19:39 0:01 [haproxy] <defunct>
root 898 0.3 0.0 49416 9640 ? Ss 19:49 0:13 /usr/local/sbin/haproxy -D -f /app/haproxy.cfg -p /var/run/haproxy.pid
root 915 0.2 0.0 0 0 ? Zs 19:49 0:12 [haproxy] <defunct>
root 920 0.2 0.0 49308 10196 ? Ss 20:57 0:01 /usr/local/sbin/haproxy -D -f /app/haproxy.cfg -p /var/run/haproxy.pid
root 937 0.0 0.0 0 0 ? Zs 20:57 0:00 [haproxy] <defunct>
root 942 0.3 0.0 49296 9880 ? Ss 20:58 0:01 /usr/local/sbin/haproxy -D -f /app/haproxy.cfg -p /var/run/haproxy.pid
root 959 0.2 0.0 49296 9852 ? Ss 20:58 0:01 /usr/local/sbin/haproxy -D -f /app/haproxy.cfg -p /var/run/haproxy.pid
[编辑] 我正在使用码头群模式。我曾尝试将发布服务的端口发送给主机;然而,群内部负载平衡器的性能不好,我尽量避免。
答
尽管应该可以将HAProxy配置更改为指向不同的后端服务器,但似乎更容易to bind the Docker containers' ports to predictable ports on the Docker host,因此HAProxy配置无需更改。
例如:
docker run -d -p 127.0.0.1:80:9999 hello_world
而且你HAProxy的配置可能看起来像
backend something
# Assuming the Docker host's IP address is 192.0.2.123
server some-server 192.0.2.123:9999
感谢您的答复。对于码头堆栈,我使用码头群模式。端口转发并不是真正的选择。我曾尝试向主机发布端口;然而,群内部负载平衡器的性能非常糟糕。是静态IP的解决方案吗? – benjah1
@ benjah1我对docker swarm没有太多经验,但[此页面似乎完全描述您的情况](https://docs.docker.com/engine/swarm/ingress/#configure-an-external-load-平衡器)?看起来你不应该在swarm模式下发布容器的端口;相反[你会发布服务的端口](https://docs.docker.com/engine/swarm/ingress/#publish-a-port-for-a-service)。 –