我在我的hsproxy.cfg中为我的后端服务器使用了DNS名称,如
backend s0
server server0 server0.x.y.local:8080
backend s1
server server1 server1.x.y.local:8080
启动后,名称解析工作正常,但一旦后台服务器的ipadress发生变化,向haproxy的请求就会耗费很长时间(比如25秒),然后以503响应(原因:SC)。但是一旦后端服务器的ipadress发生变化,对haproxy的请求就会花费很长时间(比如25秒),然后回复503(原因:SC)。它不会更新或重新解析dns名称。但是一个 curl
的工作正常,所以操作系统正确地更新了这些 dns 条目的 ip adress。因此,看起来haproxy在启动时缓存了ip adress,并且从未改变它们。
我在kubernetes集群中使用haproxy作为pod(不知道这是否重要)。
根据我在官方文档中读到的内容,libc选项应该使用操作系统解析。我试过把 init-addr libc
但是没有用,haproxy在机子上的时候还是永远的响应长跑503,dns完美解析。
我也看到了,在使用一个 resolver
条目,在那里你可以配置刷新时间等。是否可以不在haproxy.cfg中硬编码nameservers,而只使用操作系统中的名字?
似乎是正确的,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.iohaproxy-dconv1.9configuration.html#5.3.2-parse-resolv-conf。