如何访问 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 完成此操作,您应该考虑两件事:

  1. 在 HAProxy 中设置您的解析器以使用 Docker 位于 127.0.0.11 的内部 DNS。
  2. 在您的 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.