docker swarm 中关于网络的问题?

默认情况下 docker swarm 服务中暴露的端口在有外部请求时会通过 router mesh 进行负载均衡。查看文档时提到了两个绕过默认负载均衡的方式,。一种是在暴露端口时设置 --publish 参数的 mode 为 host,一种是设置 --endpoint-mode 为 dnsrr。这两种方式具体有什么区别?

阅读 1k
1 个回答

有两种主要方式可以绕过默认的路由网格(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 地址,并且能够适当地处理连接失败的情况(比如一个服务实例宕机)。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题