HAProxy SRV使用Consul DNS准备的查询来记录负载平衡

时间:2018-06-20 15:08:03

标签: dns load-balancing haproxy consul service-discovery

我正在尝试使用Consul的DNS SRV记录,对在Consul中注册的服务使用HAProxy进行负载平衡。

我的Consul DNS已正确配置以解决以下问题:

$ dig my-service.service.consul SRV

...

;; ANSWER SECTION:
my-service.service.consul. 0 IN SRV 1 1 8000 node1.node.dc.consul.

;; ADDITIONAL SECTION:
node1.node.dc.consul. 10 IN A   X.X.X.X
node1.node.dc.consul. 10 IN TXT "consul-network-segment="

,还有一个领事准备好的查询

$ dig geo-my-service.query.consul SRV

...

;; ANSWER SECTION:
geo-my-service.query.consul. 10 IN SRV 1 1 8000 node1.node.dc.consul.

;; ADDITIONAL SECTION:
node1.node.dc.consul. 10 IN A   X.X.X.X
node1.node.dc.consul. 10 IN TXT "consul-network-segment="

我使用以下代码块在HAProxy中成功配置了准系统服务查询:

backend my-service

    balance roundrobin
    server-template my-service-api 1 _my-service._tcp.service.consul check resolvers consul

但是,当我使用Consul准备的查询时,出现套接字错误:HAProxy中给定服务上没有TCP连接可用的端口错误:

backend companion_authnz

    balance roundrobin
    server-template my-service-api 1 _geo-my-service._tcp.query.consul check resolvers consul

在HAProxy和Consul文档中都找不到有关在HAProxy中解决准备好的查询的任何信息。

是否有人有过Consul准备的查询以及使用SRV记录将其插入HAProxy的经验?

我正在使用Consul 1.1.0和HAProxy 1.8.9。谢谢!

编辑:

通过使用A记录并在配置文件中指定服务端口,我成功地在HAProxy中插入了准备好的查询:

backend my-service

    balance roundrobin
    server-template my-service-api 1 geo-my-service.query.consul:8000 check resolvers consul

但是,最好使用SRV记录,以便HAProxy动态解析端口

1 个答案:

答案 0 :(得分:2)

好吧,我知道了。

首先,如Consul的DNS接口文档的this部分所述,期望 service (_my-service._tcp.service.consul)解析。 领事的DNS配置为使用以下形式(RFC 2782)解析服务:

_service._protocol[.service][.datacenter][.consul]

这就是_my-service._tcp.service.consul工作正常的原因。

但是,我准备的查询还配置为匹配以下正则表达式: ^ geo-(。*?)$ ,因此,当我运行dig _geo-my-service._tcp.query.consul时,它就没有了” t在正则表达式中匹配,因此无法解决。这就解释了为什么我在遵守RFC 2782标准地址的同时无法解决准备好的查询的原因。

也就是说,HAProxy 需要一个符合RFC 2782的地址来解析SRV记录。 为了解决这些限制,我必须对设置进行两项更改:

  1. 我将准备好的查询正则表达式更改为 ^ _ geo-(。*?)$ ,以便RFC 2782地址匹配
  2. 我在HAProxy配置文件中省略了协议(._tcp。),以便Consul可以找到查询

以下是结果:

$ dig _geo-my-service.query.consul SRV

...

;; ANSWER SECTION:
_geo-my-service.query.consul. 10 IN SRV 1 1 8000 node1.node.dc.consul.

;; ADDITIONAL SECTION:
node1.node.dc.consul. 10 IN A   X.X.X.X
node1.node.dc.consul. 10 IN TXT "consul-network-segment="

对于HAProxy配置:

backend my-service

    balance roundrobin
    server-template my-service-api 1 _geo-my-service.query.consul check resolvers consul

总而言之,我认为这种行为有点奇怪,RFC 2782标准对于Consul服务和准备好的查询应该工作相同。