我正在尝试使用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动态解析端口。
答案 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记录。 为了解决这些限制,我必须对设置进行两项更改:
以下是结果:
$ 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服务和准备好的查询应该工作相同。