我需要知道是否有任何解决方案可以解决我的问题。我有一个 BIND DNS 服务器和 consul 作为服务发现者。这就是我想要的简单图表:
我如何配置此示例设置并让 BIND 将 A 记录解析为健康负载均衡器服务器的 IP 地址?
如果客户端向 DNS 服务器查询 A 记录domain.example
,则必须获取健康(192.168.1.100
) 服务器
consul 的 DNS 配置示例显示了如何配置 SRV 记录,而不是 A 记录。如何才能让它与健康服务器的 A 记录一起工作。
我需要告诉 consul 绑定询问记录,但是怎么做呢?我的示例区域文件:
$TTL 300 ;
$ORIGIN example.com.
@ 1D IN SOA ns1.example.com. hostmaster.example.com. (
2002022401 ; serial
3H ; refresh
15 ; retry
1w ; expire
3h ; nxdomain ttl
)
www IN A 192.168.0.2 ; how can i tell bind using consul as IP resolver on this record
consul 使用端口进行解析,我怎样才能告诉 bind 使用 consul。
答案1
我相信大家都太关注 BIND 服务器了。根据 Consul 文档,你只需要 BIND 即可转发 DNS 查询从端口 53 到 Consul 使用的端口 8600。Consul 是此设置中的 DNS 服务器。
Consul 使用检查确定两个(或更多)服务器中的哪一个是“健康”服务器。
接下来它可以响应A 和 SRV 记录正如在文档中所见。
因此,与其让我们通读整个 Consul 文档并为您制定一个可行的配置,不如您向我们提供您的配置文件并告诉我们哪些地方没有按预期工作。这样,我们就可以更轻松地帮助您解决手头的问题。
我需要告诉领事绑定询问记录,但是怎么做呢?
这个问题的答案就在文档!请阅读文档!
答案2
嗯...很遗憾,你在生产中做到这一点会有些困难。
50% 的问题在于更新“健康”记录以指向健康服务器。有多种方法可以使用 bind 进行动态更新,但遗憾的是,没有办法说服 bind 本身进行某种检查以查看服务器是否健康。您需要想办法在达到健康/不健康状态时触发动态更新。
50% 的问题也与缓存有关。事实上,DNS 的设计就是缓存。DNS 记录上有一个定义的“TTL”字段,本质上是缓存记录的定义时间。当您更新“健康”记录时,客户端将被迫等待,直到达到 TTL,然后重新查询记录。某些应用程序有一个内置方法,如果连接断开或无法建立,它将尝试重新查询记录,但不能保证一定会这样做。
您最好使用防火墙规则拒绝不健康服务器上的连接,并仅依靠 DNS 服务器来宣传两个服务器,并允许应用程序先尝试一个,然后再尝试另一个(循环)。