HAProxy 从操作系统使用 DNS?

Jen*_*ens 7 dns haproxy kubernetes

我在 hsproxy.cfg 中为后端服务器使用 dns 名称,例如

backend s0
    server server0 server0.x.y.local:8080

backend s1
    server server1 server1.x.y.local:8080
Run Code Online (Sandbox Code Playgroud)

启动后名称解析工作正常。但是一旦后端服务器的 ipadress 更改,对 haproxy 的请求需要很长时间(例如 25 秒),然后以 503 响应(原因:SC)。它不会更新或重新解析 dns 名称。但是curl那台机器上的一个工作正常,所以操作系统正确地更新了这些 dns 条目的 ip 地址。所以看起来 haproxy 在启动时缓存 IP 地址并且从不更改它们。

我在 kubernetes 集群中使用 haproxy 作为 pod(不确定这是否重要)。

从我在官方文档中读到的内容来看,libc 选项应该使用操作系统解析吗?我试过放置init-addr libc但它没有帮助,haproxy 在机器上仍然以长时间运行的 503 响应,dns 完美解析。

我还看到在使用resolver条目时可以进行一些微调,您可以在其中配置刷新时间等。如果没有 haproxy.cfg 中的硬编码名称服务器,而只使用操作系统中的名称服务器,这是否可行?

Sim*_* K. 11

除非您另有说明,否则 HAProxy 确实缓存已解析的 IP 似乎是正确的。

正如您已经发现使用解析器和自定义检查间隔的配置应该可以解决问题(resolvers dns check inter 1000hold valid),但是您也正确地认为这也需要一个resolvers部分。从 HAProxy 1.9 开始,您可以使用parse-resolv-conf本地解析器:

resolvers mydns
  parse-resolv-conf
  hold valid 10s

backend site-backend
  balance leastconn
  server site server.example.com:80 resolvers mydns check inter 1000
Run Code Online (Sandbox Code Playgroud)

HAProxy 文档可以帮助您进一步配置:https : //cbonte.github.io/haproxy-dconv/1.9/configuration.html#5.3.2-parse-resolv-conf