首页 > 解决方案 > haproxy 背后的牧场主

问题描述

我有一些用 Rancher 管理的小型集群。只有两个工人:node1node2

我可以添加一个stack1,为这个堆栈或全局添加一个负载平衡器,它工作正常。但是我的DNS有些问题。

例如,我可以将stack1.domain.com指向node1.domain.com。我的负载均衡器在 node1 上运行(甚至在我的集群的所有节点上),所以它可以工作。

但是如果有一天我需要关闭我的 node1,我必须快速将 DNS stack1.domain.com 指向 node2.domain.com 这不是一个好主意。

我的第一个想法是在我的 Rancher 集群前面使用一个小型 haproxy 服务器。

因此,我将 stack1.domain.com 指向haproxy.domain.com然后将其 haproxy 后端到 node1 和 node2。

但它不起作用。

我可以放这样的东西

frontend  http *:80
    acl stack1           hdr(host)       -i stack1.domain.com
    use_backend bck_s1          if stack1

backend bck_s1
    mode http
    balance     roundrobin
    server      n1 node1.domain.com:80 check
    server      n2 node2.domain.com:80 check

也许它可以工作。但是,如果我还需要添加在 80 端口上侦听的 stack2,则无法使用此模式。

我可以添加bck_s2,但它会指向同一个node1/node2。所以牧场主会不明白我要stack1还是stack2?

可以使用不同的端口来解决它,但这似乎不是一个好主意。当然我可以听 stack1 到 80 端口,stack2 到 8080,但是如果我有 stack3, 4,... 它变得太复杂了。

我有一个想法来添加一些后端路径。像这样 :

backend bck_s1
    mode http
    balance     roundrobin
    server      n1 node1.domain.com:80/s1 check
    server      n2 node2.domain.com:80/s1 check

在这种情况下,我可以根据规则 /s1、/s2 等在 Rancher 上放置一个负载均衡器。但使用 haproxy 似乎不可能做到这一点。我对吗?

所以问题。

1)是否可以使用haproxy实现它以及如何做到这一点?

2)我可以使用其他一些解决方案吗?

标签: dockerhaproxyrancher

解决方案


您可以配置通配符条目,而不是在 中使用特定条目haproxy.domain.com,指向两个节点以及为后端配置运行状况检查。这样,当您关闭 node-1 时,HA 代理可以检测到它,并且不再将流量引导到该节点。这种方式在 HA 代理端会更加动态,您不需要更改 DNS。

参考: - HAPROXY 中 ACL 的子域中的通配符


推荐阅读