我在hsproxy.cfg中为后端服务器使用dns名称
backend s0
server server0 server0.x.y.local:8080
backend s1
server server1 server1.x.y.local:8080
启动后,名称解析可以正常工作。但是,一旦后端服务器的IP地址更改,请求haproxy的请求就会花费很长时间(例如25秒),然后以503响应(原因:SC)。它不会更新或重新解析dns名称。但是该机器上的curl
可以正常工作,因此操作系统可以正确更新这些dns条目的ip地址。因此,看起来haproxy会在启动时缓存ip地址,而从不对其进行更改。
我正在使用haproxy作为kubernetes集群内部的pod(不确定是否重要)。
从我在官方文档中看到的内容来看,libc选项应该使用操作系统的解析吗?我曾尝试将init-addr libc
放进去,但没有帮助,haproxy仍然可以在机器上永久运行503并永远响应,而dns可以完美解析。
我还看到使用resolver
条目时可能会进行一些微调,您可以在其中配置刷新时间等。在haproxy.cfg中不使用硬编码名称服务器而仅使用操作系统中的硬编码名称服务器的情况下,是否有可能进行微调?系统吗?
答案 0 :(得分:8)
除非另有说明,否则HAProxy确实会缓存已解析的IP,这似乎是正确的。
您已经发现使用解析器和自定义检查间隔进行配置应该可以解决问题(resolvers dns check inter 1000
和hold 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
HAProxy文档可以帮助您进行进一步的配置:https://cbonte.github.io/haproxy-dconv/1.9/configuration.html#5.3.2-parse-resolv-conf