HAProxy SRV 记录使用 Consul DNS 准备查询的负载平衡
HAProxy SRV record load-balancing using Consul DNS prepared queries
我正在尝试使用 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="
还有一个 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 _my-service._tcp.service.consul check resolvers consul
但是,当我使用 Consul 准备好的查询时,我收到 套接字错误:没有可用于 TCP 连接的端口 HAProxy 中给定服务的错误:
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 动态解析端口。
好的,我明白了。
首先,service (_my-service._tcp.service.consul) 解析是预期的,如 Consul 的 DNS 接口文档的 this 部分所述。
Consul 的 DNS 配置为使用这种形式解析服务 (RFC 2782):
_service._protocol[.service][.datacenter][.consul]
这就是 _my-service._tcp.service.consul
正常工作的原因。
但是,我准备好的查询也配置为匹配此正则表达式:^geo-(.*?)$,所以当我 运行 dig _geo-my-service._tcp.query.consul
,它 与正则表达式 不匹配,因此无法解决。这解释了为什么我无法在遵守 RFC 2782 标准地址的同时解决准备好的查询。
也就是说,HAProxy 需要符合 RFC 2782 的地址 来解析 SRV 记录。
为了处理这些限制,我不得不对我的设置进行两项更改:
- 我将准备好的查询正则表达式更改为 ^_geo-(.*?)$ 因此 RFC 2782 地址将匹配
- 我在 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 服务和准备好的查询应该是一样的。
我正在尝试使用 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="
还有一个 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 _my-service._tcp.service.consul check resolvers consul
但是,当我使用 Consul 准备好的查询时,我收到 套接字错误:没有可用于 TCP 连接的端口 HAProxy 中给定服务的错误:
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 动态解析端口。
好的,我明白了。
首先,service (_my-service._tcp.service.consul) 解析是预期的,如 Consul 的 DNS 接口文档的 this 部分所述。 Consul 的 DNS 配置为使用这种形式解析服务 (RFC 2782):
_service._protocol[.service][.datacenter][.consul]
这就是 _my-service._tcp.service.consul
正常工作的原因。
但是,我准备好的查询也配置为匹配此正则表达式:^geo-(.*?)$,所以当我 运行 dig _geo-my-service._tcp.query.consul
,它 与正则表达式 不匹配,因此无法解决。这解释了为什么我无法在遵守 RFC 2782 标准地址的同时解决准备好的查询。
也就是说,HAProxy 需要符合 RFC 2782 的地址 来解析 SRV 记录。 为了处理这些限制,我不得不对我的设置进行两项更改:
- 我将准备好的查询正则表达式更改为 ^_geo-(.*?)$ 因此 RFC 2782 地址将匹配
- 我在 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 服务和准备好的查询应该是一样的。