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 记录。 为了处理这些限制,我不得不对我的设置进行两项更改:

  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 服务和准备好的查询应该是一样的。