如何在HAProxy配置中正确访问docker-compose创建的多副本服务
问题根因
- Docker Compose 副本模式下,单个服务的所有副本对应的统一DNS记录为
tasks.<服务名>(你的服务名为ws,对应记录就是tasks.ws),直接使用ws_1这类主机名无法解析是因为Docker没有生成对应格式的DNS记录。 - 原本的配置只写了单条
server s1 ws:8080,HAProxy默认只会在启动时解析一次域名并缓存结果,因此所有请求只会路由到缓存中对应的单个副本。
解决方案:调整HAProxy配置
你只需要修改haproxy.cfg,新增DNS解析器配置,使用server-template自动绑定所有副本即可,完整配置参考如下:
# 新增Docker内置DNS解析器配置 resolvers docker_dns nameserver dns1 127.0.0.11:53 hold valid 10s frontend http bind *:8080 mode http use_backend all backend all mode http balance roundrobin # 配置轮询负载均衡策略,可按需调整为其他策略 # 自动生成4个后端服务器,绑定所有ws服务副本 server-template ws 4 tasks.ws:8080 check resolvers docker_dns
参数说明
resolvers docker_dns:指定使用Docker内置的DNS服务器127.0.0.11,每10秒刷新一次解析结果,后续副本扩容/缩容时HAProxy会自动识别,无需手动修改配置。server-template ws 4 tasks.ws:8080:自动生成ws-1到ws-4共4个后端节点,自动关联tasks.ws解析出来的所有副本IP,check参数开启后端健康检查,异常节点会自动被剔除。
兼容性方案(不支持server-template的旧版HAProxy)
如果你使用的HAProxy版本不支持server-template,也可以手动配置4个后端节点:
backend all mode http balance roundrobin server s1 tasks.ws:8080 check resolvers docker_dns init-addr none server s2 tasks.ws:8080 check resolvers docker_dns init-addr none server s3 tasks.ws:8080 check resolvers docker_dns init-addr none server s4 tasks.ws:8080 check resolvers docker_dns init-addr none
init-addr none参数允许HAProxy启动时即使没有解析到域名也不报错,运行过程中会自动重试解析。
修改配置后重启HAProxy服务即可生效,请求会自动负载均衡到4个ws副本。
内容的提问来源于stack exchange,提问作者jbos1234
相关产品推荐
相关产品推荐

