Docker Swarm服务发现和负载均衡的原理是什么


今天小编给大家分享一下Docker Swarm服务发现和负载均衡的原理是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。使用的技术docker 使用了 linux 内核 iptables 和 ipvs 的功能来实现服务发现和负载均衡。iptables 是 linux 内核中可用的包过滤技术,它可用于根据数据包的内容进行分类、修改和转发决策。ipvs 是 linux 内核中可用的传输级负载均衡器。准备工作swarm 集群:【manager】node1、【worker】node2客户端镜像:registry.cn-hangzhou.aliyuncs.com/anoy/ubuntu服务端镜像:registry.cn-hangzhou.aliyuncs.com/anoy/vote如图所示,我们将在 swarm 集群中部署 “client” 服务 和 “vote” 服务,其中 “vote” 服务部署多个副本。客户端请求 “vote” 服务时,输出结果中包含服务端的容器 id,这样就更方便演示网络请求。集群状态使用如下命令,创建 overlay 网络:基于 dns 的负载均衡下图描述了基于 dns 的负载均衡是如何工作的:dns server 内嵌于 docker 引擎。docker dns 解析服务名 “vote” 并返回容器 id 地址列表(随机排序)。客户端通常会挑第一个 ip 访问,因此负载均衡可能发生在服务器的不同实例之间。使用如下命令创建 2 个基于 dns 负载均衡的服务 “client” 、 “vote”:查看服务信息:可以看出 “client” 运行于 node2,在 node2 上进入 client 容器,使用 dig 来解析服务名 “vote”,如下所示,”vote” 解析到 10.0.0.6 和 10.0.0.5使用 ping 解析 “vote” 服务,如下所示,交替解析到 10.0.0.6 和 10.0.0.5如果使用 curl,如下所示,请求也能解析到不同的容器基于 dns 负载均衡存在如下问题:某些应用程序将 dns 主机名缓存到 ip 地址映射,这会导致应用程序在映射更改时超时具有非零 dns ttl 值会导致 dns 条目反映最新的详细信息时发生延迟基于 vip 的负载均衡基于 vip 的负载均衡克服了基于 dns 负载均衡的一些问题。在这种方法中,每个服务都有一个 ip 地址,并且该 ip 地址映射到与该服务关联的多个容器的 ip 地址。在这种情况下,与服务关联的服务 ip 不会改变,即使与该服务关联的容器死亡并重新启动。下图描述了基于 vip 的负载均衡是如何工作的:dns server 会将服务名 “vote” 解析到 vip,使用 iptables 和 ipvs,vip 实现 2 个服务端 “vote” 容器的负载均衡。使用如下命令创建 2 个 vip 模式的服务 “client” 、 “vote”:查看这 2 个服务和它们的服务 ip:在 “client” 的容器中使用如下命令,可以看到服务名 “vote” 映射到 vip “10.0.0.9”service ip “10.0.0.9” 使用 linux 内核的 iptables 和 ipvs 负载均衡到 2 个容器。iptables 实现防火墙规则,ipvs 实现负载均衡。为了证明这一点,我们需要使用 nsenter 进入容器的网络空间 (namespace)。为此,我们需要找到网络的命名空间。如下是 node2 上的网络命名空间:前 2 个命名空间是用于 overlay 网络,后面的用于容器。下面的命令用于找到 “client” 容器的网络命名空间:sandboxid 即为 “client” 容器的网络命名空间。使用如下命令,我们就能够进入到 “client” 容器的网络命令空间:下面,我们可以看到 iptables 的转发规则和 ipvs 输出:service ip “10.0.0.9” 使用 iptables output 链获得标记 0x103 (十六进制 -> 十进制:259),然后 ipvs 使用此标记并将它负载均衡到 “10.0.0.10” 和 “10.0.0.11” 。查看 vote 服务的 2 个容器的 ip 如下所示,即 vip “10.0.0.9” 负载均衡到不同的容器实例:进入 client 服务的容器,使用 curl 请求 vote 服务,输出结果如下,即请求分发到不同的容器:路由网格 (routing mesh)使用路由网格,服务暴露的端口会暴露在 swarm 集群中的所有工作节点。docker 是通过创建 “ingress” overlay 网络来实现这一点的,所有节点默认使用内在的 sandbox 网络命名空间成为 “ingress” overlay 网络的一部分。下图描述了 routing mesh 如何实现负载均衡的:首先,会将 hostname 或 ip 映射到 sandbox ip,sandbox 中的 iptables 和 ipvs 负责将请求负载均衡到 2 香港云主机 个 vote 容器。ingress sandbox 网络命名空间驻留在 swarm 集群中的所有工作节点,它通过将主机映射的端口负载均衡到后端容器来协助路由网格功能。使用如下命令创建 vote 服务,使用路由网格暴露端口到所有节点:复制代码代码如下:docker service create –name vote –network overlay1 –replicas 2 -p 8080:80 registry.cn-hangzhou.aliyuncs.com/anoy/vote下图显示了 sandbox、容器和每个节点的网络之间的映射关系:如图所示,sandbox 和 vote 容器是 “ingress” 网络的一部分,它有助于路由网格。client 容器和 vote 容器是 “overlay1” 网络的一部分,它有助于内部负载均衡。所有容器都是默认 “docker_gwbridge” 网络的一部分。遵循 iptables 中的 nat 规则显示,端口 8080 上的主机流量发送到 node1 里的 sandbox:进入 node1 上的 sandbox 网络命名空间 (ingress_sbox),查看 iptables 的转发规则和 ipvs 输出:端口 8080 标记为 0x105 (十六进制 -> 十进制:261),ipvs 使用此标记将它负载均衡到 “10.255.0.5” 和 “10.255.0.6” 。查看 vote 服务的 2 个容器的 ip 如下所示,即主机端口 8080 的流量会负载均衡到不同的容器实例:验证负载均衡,在 node1 上通过 node2 的 ip 和 8080 端口请求 vote 服务:在 node2 上通过 node1 的 ip 和 8080 端口请求 vote 服务:以上就是“Docker Swarm服务发现和负载均衡的原理是什么”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注开发云行业资讯频道。

相关推荐: java webstart问题怎么解决

这篇文章主要介绍“java webstart问题怎么解决”,在日常操作中,相信很多人在java webstart问题怎么解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java webstart问题怎么解决”的疑惑有所帮助!接…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 07/03 22:06
下一篇 07/03 22:06

相关推荐