默认情况下 docker swarm 服务中暴露的端口在有外部请求时会通过 router mesh 进行负载均衡。查看文档时提到了两个绕过默认负载均衡的方式,。一种是在暴露端口时设置 --publish 参数的 mode 为 host,一种是设置 --endpoint-mode 为 dnsrr。这两种方式具体有什么区别?
默认情况下 docker swarm 服务中暴露的端口在有外部请求时会通过 router mesh 进行负载均衡。查看文档时提到了两个绕过默认负载均衡的方式,。一种是在暴露端口时设置 --publish 参数的 mode 为 host,一种是设置 --endpoint-mode 为 dnsrr。这两种方式具体有什么区别?
2 回答973 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
1 回答1.6k 阅读✓ 已解决
2 回答1.4k 阅读
1 回答1.7k 阅读
1.2k 阅读
1 回答795 阅读
有两种主要方式可以绕过默认的路由网格(routing mesh)负载均衡
1.设置 --publish mode=host:
当使用 --publish mode=host 时,Docker 不会使用 routing mesh 来处理节点间的端口映射。而是直接将服务容器的端口映射到宿主机的相应端口上。这意味着外部流量会直接路由到运行服务任务的具体节点,不经过内部负载均衡。
这种模式的优势是可以减少负载均衡带来的额外延迟,对于需要高性能、低延迟的应用尤为有用。然而,它的缺点是如果服务只部署在某些节点上,那么只有这些节点能直接接收和处理外部请求。
2.设置 --endpoint-mode=dnsrr:
dnsrr 代表 DNS round-robin。当服务的 --endpoint-mode 设置为 dnsrr 时,Docker Swarm 的 DNS 服务会为服务的每个实例返回一个 IP 地址列表,并轮流解析(round-robin)这些地址。客户端接收到这些 IP 地址后,可以直接连接到其中一个服务实例。
这种模式的优势在于它允许客户端缓存 DNS 响应并直接连接到服务实例,减少了通过 routing mesh 的额外网络跳转。但是,这种方式要求客户端能够处理 DNS 解析结果中的多个 IP 地址,并且能够适当地处理连接失败的情况(比如一个服务实例宕机)。