【问题标题】:HAProxy SRV record load-balancing using Consul DNS prepared queries使用 Consul DNS 准备查询的 HAProxy SRV 记录负载平衡
【发布时间】:2018-06-20 15:08:03
【问题描述】:

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

我的 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 中的给定服务上收到 Socket error: No port available for the TCP connection 错误:

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 动态解析端口

【问题讨论】:

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


    【解决方案1】:

    好的,我想通了。

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

    【讨论】:

    • “HAProxy 需要符合 RFC 2782 的地址来解析 SRV 记录”对我帮助很大!
    • 请务必在resolvers部分增加accepted_payload_size,否则当DNS查询的响应超过默认值512时,服务发现将不起作用。我建议将其设置为最大值; accepted_payload_size 8192。参考:cbonte.github.io/haproxy-dconv/1.9/…
    猜你喜欢
    • 2016-08-21
    • 2018-08-20
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-25
    • 1970-01-01
    相关资源
    最近更新 更多