`

docker swarm-服务发现与负载均衡原理分析

阅读更多
本文主要翻译自Docker Reference Architecture: Universal Control Plane 2.0 Service Discovery and Load Balancing
1.介绍
    服务发现组件用来注册一个服务,并发布此服务的连接信息从而使其他服务知道如何连接到它。当应用转向微服务结构或者是面向服务的架构时,服务发现已经变成分布式系统必不可少的一部分,也增加了操作这些环境的复杂性。
    DockerEE、DockerCS 引擎通过直接包含服务发现和负载均衡机制来提升使用它的组织执行devops的积极性,并且使开发能动态的发现其他服务的应用变得简单,通过操作引擎也使得应用扩容变得简单。
    Docker利用service来发布应用。一个service包含了一组从同一个镜像创建的容器,每个service由执行在工作节点的任务和定义好的应用的状态两部分组成。当发布一个service,这个service的定义也包含在了service的创建中,在定义中包括组成service的容器,发布的端口,使用的网络,复制的个数等信息,所有的这些属性组成了service的预期状态。当一个节点的健康检查失败或者是一个service中某个特定的任务检查失败时,集群会自动维护service的一致状态,把失败的任务转发到其他健康的节点上。
2.内容
  本文包含了DockerEE中服务发现和负载均衡的解决方法。当service创建后Docker会利用DNS来做服务发现。并且內建了一个特殊的路由网络来保证应用的高可用性,从而实现外部负载均衡。
3.服务发现
  docker利用内嵌的DNS服务为单个docker引擎中的容器以及swarm 模式下的task提供服务发现能力。docker引擎有一个内部的DNS服务来为运行在该宿主机上的所有容器提供名称解析的功能,无论容器是运行在用户自定义的bridge, overlay, 和 MACVLAN 网络。每一个docker容器(或者是docker swarm中的一个任务,也是以容器运行)都有一个域名解析器,可以把域名查询请求转发到宿主机上的docker引擎上的域名服务,docker 引擎收到请求后就会在发出请求的容器所在的所有网络中检查域名对应的是不是一个容器或者是服务,如果是,docker引擎就会从存储的key-value建值对中查找这个容器名、任务名、或者服务名对应的IP地址,并把这个IP地址或者是服务的虚拟IP地址返回给发起请求的域名解析器。
  由上可知,docker的服务发现的作用范围是网络级别,也就意味着只有在同一个网络上的容器或任务才能利用内嵌的DNS服务来相互发现,不在同一个网络里面的服务是不能解析名称的,另外,为了安全和性能只有当一个节点上有容器或任务在某个网络里面时,这个节点才会存储那个网络里面的DNS记录。
  如果目的容器或服务和源容器不在同一个网络里面,Docker引擎会把这个DNS查询转发到配置的默认DNS服务

在上面的例子中,总共有两个服务myservice和client,其中myservice有两个容器,这两个服务在同一个网里面。在client里针对docker.com和myservice各执行了一个curl操作,下面时执行的流程:
  • 为了client解析docker.com和myservice,DNS查询进行初始化
  • 容器内建的解析器在127.0.0.11:53拦截到这个DNS查询请求,并把请求转发到docker引擎的DNS服务
  • myservice被解析成服务对应的虚拟IP,在接下来的内部负载均衡阶段再被解析成一个具体任务的IP地址。如果是容器名称这一步直接解析成容器对应的IP地址。
  • docker.com在mynet网络上不能被解析成服务,所以这个请求被转发到配置好的默认DNS服务器上

4.内部负载均衡
  当在docker swarm集群模式下创建一个服务时,会自动在服务所属的网络上给服务额外的分配一个虚拟IP,当解析服务名字时就会返回这个虚拟IP。对虚拟IP的请求会通过overlay网络自动的负载到这个服务所有的健康任务上。这个方式也避免了客户端的负载均衡,因为只有单独的一个虚拟IP会返回到客户端,docker会处理虚拟IP到具体任务的路由,并把请求平均的分配给所有的健康任务。

如果想观察一个服务对应的虚拟IP,执行docker service inspect myservice 命令,会看到类似于下面的结果
# 创建overlay网络:mynet
$ docker network create -d overlay mynet
a59umzkdj2r0ua7x8jxd84dhr

# 利用mynet网络创建myservice服务,并复制两份
$ docker service create --network mynet --name myservice --replicas 2 busybox ping localhost
8t5r8cr0f0h6k2c3k7ih4l6f5

# 通过下面的命令查看myservice对应的虚拟IP
$ docker service inspect myservice
...

"VirtualIPs": [
                {
                    "NetworkID": "a59umzkdj2r0ua7x8jxd84dhr",
                    "Addr": "10.0.0.3/24"
                },
]

swarm中服务还有另外一种负载均衡技术可选DNS round robin (DNS RR) (在创建服务时通过--endpoint-mode配置项指定),在DNSRR模式下,docker不再为服务创建VIP,docker DNS服务直接利用轮询的策略把服务名称直接解析成一个容器的IP地址。

5.外部负载均衡
  当创建或更新一个服务时,你可以利用--publish选项把一个服务暴露到外部,在docker swarm模式下发布一个端口意味着在集群中的所有节点都会监听这个端口,这时当访问一个监听了端口但是并没有对应服务运行在其上的节点会发生什么呢?
  接下来就该我们的路由网(routing mesh)出场了,路由网时docker1.12引入的一个新特性,它结合了IPVS和iptables创建了一个强大的集群范围的L4层负载均衡,它使所有节点接收服务暴露端口的请求成为可能。当任意节点接收到针对某个服务暴露的TCP/UDP端口的请求时,这个节点会利用预先定义过的Ingress overlay网络,把请求转发给服务对应的虚拟IP。ingress网络和其他的overlay网络一样,只是它的目的是为了转换来自客户端到集群的请求,它也是利用我们前一小节介绍过的基于VIP的负载均衡技术。
  当启动服务时,你可以为你的应用创建一个外部的DNS服务,并把它映射到你集群的任意节点或者是所有节点,你无需担心你的容器具体运行在那个节点上,因为有了路由网这个特性后,你的集群看起来就像是单独的一个节点一样。
#在集群中创建一个复制两份的服务,并暴露在8000端口
$ docker service create --name app --replicas 2 --network appnet --publish 8000:80 nginx


上面这个图表明了路由网是怎么工作的:
  • 服务(app)拥有两份复制,并把端口映射到外部端口的8000
  • 路由网在集群中的所有节点上都暴露出8000
  • 外部对服务app的请求可以是任意节点,在本例子中外部的负载均衡器将请求转发到了没有app服务的主机上
  • docker swarm的IPVS利用ingress overlay网路将请求重新转发到运行着app服务的节点的容器中
  • 大小: 115.1 KB
  • 大小: 22.2 KB
  • 大小: 74.7 KB
分享到:
评论

相关推荐

    Docker Swarm 管理资源.rar

    综上所述,Docker Swarm提供了强大的资源管理能力,包括服务编排、负载均衡、故障恢复、网络管理和安全控制等。通过熟练掌握这些知识点,你可以更有效地管理和优化Docker容器集群,实现高效的资源利用。

    Swarm-2.2-java.zip

    2. **服务发现和服务路由**:Swarm提供了自动的服务发现和负载均衡功能。在Java应用中,可以通过服务标签和服务端点来发现和连接到其他服务,这简化了微服务架构中的通信问题。 3. **容器编排**:Swarm支持声明式...

    深入浅出分布式技术原理 教程 下载 下载3.zip

    7. 分布式服务治理:包括服务发现、负载均衡、熔断和降级等策略,以确保服务的稳定性和性能。例如,Netflix的Eureka和Zuul。 8. 微服务架构:将大型应用程序分解为一组小型、独立的服务,每个服务都可以独立部署和...

    大型网站技术架构:核心原理与案例分析+李智慧.zip

    7. **容器化与Docker**:Docker提供了轻量级的虚拟化,便于部署和管理服务,Kubernetes或Docker Swarm等工具则用于容器编排。 8. **消息队列**:RabbitMQ、Kafka等消息中间件用于异步处理和解耦系统组件,提高系统...

    大规模并行数据处理.pptx

    为了提高系统的性能和效率,合理的数据分发与负载均衡策略是必不可少的。 1. **数据分区策略**: - **哈希分区**:将数据映射到预定义的哈希空间,不同的哈希值对应不同的分区。 - **范围分区**:将数据按有序...

    distributed-systems-technologies-and-cases-analysis, 《分布式系统常用技术及案例分析》示例源码.zip

    7. **负载均衡**:Nginx和HAProxy用于在网络层分配流量,确保服务的高可用性。 8. **容错机制**:例如断路器模式(Hystrix)、重试策略、死信队列等,这些都是保证系统稳定性的关键。 9. **服务发现**:如Consul,...

    大型分布式网站架构设计与实践.带目录书签.完整版

    4. 微服务架构:介绍微服务架构的设计原则,包括服务拆分、API Gateway、服务注册与发现、容错机制等,以实现灵活的系统设计和独立部署。 5. 负载均衡与调度:分析负载均衡的重要性,讲解不同的负载均衡算法和技术...

    基于Spring cloud的在线考试系统-examOnline.zip

    2. Ribbon:Ribbon是客户端负载均衡器,用于在消费服务时,从Eureka获取服务列表并进行负载均衡。在“examOnline”中,Ribbon帮助考试系统在调用其他服务时,自动选择合适的服务器进行请求,提高系统的可用性。 3. ...

    微服务架构平台构建指南 (2).pdf

    5. **容器化与编排**:利用Docker等容器技术封装服务,通过Kubernetes或Docker Swarm进行服务的编排和管理。 ### 三.服务拆分理论和原理及方法 服务拆分需遵循业务边界划分,采用如康威定律来指导,即组织如何...

    谷粒商城分布式doc文档.zip

    谷粒商城可能采用了如Dubbo或Spring Cloud等流行的分布式服务框架,用于服务治理、负载均衡、熔断和降级等。这些框架使得服务之间的调用变得简单,同时也提供了强大的监控和管理能力。 3. 微服务架构 微服务架构...

    PyPI 官网下载 | Red-DiscordBot-3.1.8.tar.gz

    Red-DiscordBot的设计理念与云原生不谋而合,它支持容器化部署,可以轻松集成到Kubernetes或Docker Swarm等容器编排系统中,从而实现快速部署和扩展。此外,通过与其他云服务的集成,如数据库服务、消息队列等,可以...

    亿级流量网站架构核心技术

    负载均衡策略包括轮询、最少连接、IP哈希等,以确保服务的稳定性和响应速度。 2. **分布式缓存**:利用Memcached或Redis等分布式缓存系统,将热点数据存储在内存中,降低数据库访问压力,提高数据读取速度。缓存...

    Medical-Monitoring-Platform-源码.rar

    负载均衡和集群设置可能通过Nginx、Kubernetes或Docker Swarm实现。 9. **用户认证与权限管理**:平台可能使用OAuth 2.0或JWT(JSON Web Tokens)进行用户身份验证,以及RBAC(Role-Based Access Control)进行权限...

    架构解密.从分布式到微服务

    4. 微服务治理:服务注册与发现、熔断、限流、降级、健康检查等,Spring Cloud和Netflix OSS提供了丰富的微服务治理工具。 5. 数据库隔离:每个微服务拥有自己的数据库,可能采用读写分离、分库分表等技术来应对...

    主流分布式系统相关知识和区别

    - **负载均衡**:合理分配任务和资源,避免单点过载,提高整体效率。 - **并行处理**:利用多节点同时处理任务,加快计算速度。 3. 主流分布式系统的比较: - **Hadoop**:开源框架,主要用于大数据处理,由HDFS...

    Java资深工程师简历模板

    - **负载均衡与自动化部署**: - **负载均衡组件**:熟练使用Nginx、Zookeeper等进行负载均衡配置。 - **自动化部署工具**:掌握Git、Jenkins、Gradle等自动化部署工具的使用。 - **容器化部署**:了解Docker及其...

    java学习路线pdf版本

    - **负载均衡**:Ribbon、Feign。 - **熔断/降级**:Hystrix。 - **配置中心**:Config、Apollo、Nacos。 - **分布式事务**:2PC、3PC、XA模式、TCC模式、Seata、SAGA模式、LCN模式。 10. **前端技术**: - **...

    Java架构师需要具备的能力共2页.pdf.zip

    3. **分布式系统设计**:理解分布式系统的设计原则,如CAP定理、微服务架构、服务发现、负载均衡、分布式事务处理等。熟悉相关的开源工具,如Zookeeper、Eureka、Consul等。 4. **数据库设计与优化**:精通SQL,...

Global site tag (gtag.js) - Google Analytics