如何访问 docker-compose 在 haproxy 配置中创建的副本
How to access docker-compose created replicas in haproxy config
我有一个简单的 haproxy.cfg,看起来像这样:
frontend http
bind *:8080
mode http
use_backend all
backend all
mode http
server s1 ws:8080
现在我有一个 docker-compose 文件,看起来像这样:
version : '3.9'
services:
lb:
image: haproxy
ports:
- "8080:8080"
volumes:
- ./haproxy:/usr/local/etc/haproxy
ws:
image: myserver
这工作正常,但现在我想使用副本将我的服务器 (ws) 实例扩展到最多 4 个。
我可以做到这一点,提供这个 docker-compose 文件:
version : '3.9'
services:
lb:
image: haproxy
ports:
- "8080:8080"
volumes:
- ./haproxy:/usr/local/etc/haproxy
ws:
image: myserver
deploy:
mode: replicated
replicas: 4
调用 docker-compose up
给我这个:
Recreating test_server_ws_1 ... done
Recreating test_server_ws_2 ... done
Recreating test_server_ws_3 ... done
Recreating test_server_ws_4 ... done
Recreating test_lb_1 ... done
但是我现在如何在我的 haproxy.cfg 中引用那 4 个副本?使用 ws:8080
以外的任何东西都会给我
lb_1 | [ALERT] (1) : parsing [/usr/local/etc/haproxy/haproxy.cfg:11] : 'server s1' : could not resolve address 'ws_1'.
只需在配置中使用 ws 作为地址(像以前一样)将始终转发到 ws_4。
如何正确配置 haproxy 以转发到 ws_1、ws_2、ws_3 和 ws_4?
要使用 docker-compose 完成此操作,您应该考虑两件事:
- 在 HAProxy 中设置您的解析器以使用 Docker 位于
127.0.0.11
的内部 DNS。
- 在您的 HAProxy 配置中使用
server-template
。
在配置中使用 Docker 的 DNS 将允许 HAProxy 在我们在后端定义服务器模板时将其用作服务发现机制。您可以像这样在 HAProxy 中创建 resolver:
resolvers docker
nameserver dns1 127.0.0.11:53
Server templates 是 HAProxy 中一个非常强大的功能,它允许配置根据解析器的 DNS 响应更新(add/remove)服务器。您可以使用以下内容创建服务器模板:
backend all
mode http
server-template nginx- 4 ws:80 check resolvers docker init-addr libc,none
您可以阅读 server-template
中使用的每个标志,但我将引导您完成配置中的相关标志。第一项是服务器名称前缀 nginx-
,您可以将其设置为您想要的任何字符串,HAProxy 将根据解析器的响应总数为其附加一个数字。下一项 4
是您希望 HAProxy 配置的最大服务器数,您可以根据需要将其调高或调低。接下来是您为后端服务配置的 server:port。最后将此后端的解析器设置为 docker
.
我有一个简单的 haproxy.cfg,看起来像这样:
frontend http
bind *:8080
mode http
use_backend all
backend all
mode http
server s1 ws:8080
现在我有一个 docker-compose 文件,看起来像这样:
version : '3.9'
services:
lb:
image: haproxy
ports:
- "8080:8080"
volumes:
- ./haproxy:/usr/local/etc/haproxy
ws:
image: myserver
这工作正常,但现在我想使用副本将我的服务器 (ws) 实例扩展到最多 4 个。 我可以做到这一点,提供这个 docker-compose 文件:
version : '3.9'
services:
lb:
image: haproxy
ports:
- "8080:8080"
volumes:
- ./haproxy:/usr/local/etc/haproxy
ws:
image: myserver
deploy:
mode: replicated
replicas: 4
调用 docker-compose up
给我这个:
Recreating test_server_ws_1 ... done
Recreating test_server_ws_2 ... done
Recreating test_server_ws_3 ... done
Recreating test_server_ws_4 ... done
Recreating test_lb_1 ... done
但是我现在如何在我的 haproxy.cfg 中引用那 4 个副本?使用 ws:8080
以外的任何东西都会给我
lb_1 | [ALERT] (1) : parsing [/usr/local/etc/haproxy/haproxy.cfg:11] : 'server s1' : could not resolve address 'ws_1'.
只需在配置中使用 ws 作为地址(像以前一样)将始终转发到 ws_4。
如何正确配置 haproxy 以转发到 ws_1、ws_2、ws_3 和 ws_4?
要使用 docker-compose 完成此操作,您应该考虑两件事:
- 在 HAProxy 中设置您的解析器以使用 Docker 位于
127.0.0.11
的内部 DNS。 - 在您的 HAProxy 配置中使用
server-template
。
在配置中使用 Docker 的 DNS 将允许 HAProxy 在我们在后端定义服务器模板时将其用作服务发现机制。您可以像这样在 HAProxy 中创建 resolver:
resolvers docker
nameserver dns1 127.0.0.11:53
Server templates 是 HAProxy 中一个非常强大的功能,它允许配置根据解析器的 DNS 响应更新(add/remove)服务器。您可以使用以下内容创建服务器模板:
backend all
mode http
server-template nginx- 4 ws:80 check resolvers docker init-addr libc,none
您可以阅读 server-template
中使用的每个标志,但我将引导您完成配置中的相关标志。第一项是服务器名称前缀 nginx-
,您可以将其设置为您想要的任何字符串,HAProxy 将根据解析器的响应总数为其附加一个数字。下一项 4
是您希望 HAProxy 配置的最大服务器数,您可以根据需要将其调高或调低。接下来是您为后端服务配置的 server:port。最后将此后端的解析器设置为 docker
.