Docker Swarm环境搭配HAProxy的负载均衡及访问入口配置问题咨询
Docker Swarm场景下HAProxy适配与入口控制方案解答
是否需要关闭Docker Swarm自带的负载均衡?
不需要完全关闭Swarm内置的ingress路由网格。你核心需求是限制外部访问入口,只要不让应用服务直接通过ingress网络对外暴露端口即可,ingress本身可以保留用于集群内部的服务发现与跨节点流量转发,完全关闭反而会影响Swarm集群的原生服务调度能力。
禁止其他节点对外暴露应用访问能力的操作方法
核心是禁用应用服务的ingress模式端口映射,具体操作如下:
- 部署应用服务时,不要使用默认的
-p 对外端口:容器端口参数,该参数默认会绑定ingress网络,触发所有集群节点监听对应对外端口 - 如果应用已经配置了ingress端口暴露,可执行
docker service update --publish-rm 对外端口:容器端口 目标服务名移除对外端口映射 - 若确定不需要任何服务通过ingress对外暴露,也可以彻底禁用ingress网络的对外路由能力:先执行
docker network inspect ingress --format '{{.ID}}'获取ingress网络ID,再执行docker network update --ingress=false ingress网络ID即可,该操作会导致所有已绑定ingress的服务对外端口失效,非必要不建议执行。
能否将负载均衡部署在Swarm集群的单个节点上?
完全可以,推荐两种部署方案:
- 直接在指定的入口节点(如管理节点)宿主机上安装HAProxy,监听宿主机的80/443端口,反向代理到Swarm内部overlay网络的应用服务地址即可
- 容器化部署HAProxy时,添加节点约束强制其仅运行在指定入口节点,同时使用host模式绑定端口避免端口扩散到其他节点,部署命令参考:
docker service create --name haproxy \ --constraint node.hostname==你的入口节点主机名 \ --network 应用所属的overlay网络名称 \ --publish mode=host,target=80,published=80 \ --publish mode=host,target=443,published=443 \ haproxy:latest
ingress网络和HAProxy同时运行是否会抵消HAProxy的价值?
完全不会,两者定位不同可实现互补:
- Swarm的ingress路由网格仅负责集群内部的服务发现、跨节点流量转发,只要你没有将应用服务直接通过ingress对外暴露端口,外部流量完全无法绕过HAProxy直接访问集群内部应用
- HAProxy可实现ingress不具备的SSL卸载、七层路由规则配置、限流熔断、访问日志统计、WAF接入等能力,完全可以发挥其自身价值
- 若要降低性能损耗,可将HAProxy和后端应用加入同一个overlay网络,HAProxy直接通过服务名访问后端应用,流量仅在内部网络转发,ingress带来的性能损耗可以忽略不计。
内容的提问来源于stack exchange,提问作者Aline137
相关产品推荐
相关产品推荐

