【swarm】Docker swarm 的负载均衡

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了【swarm】Docker swarm 的负载均衡相关的知识,希望对你有一定的参考价值。

参考技术A Docker Swarm 的负载均衡分为两种:

Swarm集群内的service之间的相互访问需要做负载均衡,称为内部负载均衡(Internal LB)

从Swarm集群外部访问服务的公开端口,也需要做负载均衡,称外部部负载均衡(Exteral LB or Ingress LB)

内部负载均衡就是服务发现,集群内部通过DNS访问service时,Swarm默认通过VIP(virtual IP)、iptables、IPVS转发到某个容器。

当在docker swarm集群模式下创建一个服务时,会自动在服务所属的网络上给服务额外的分配一个虚拟IP,当解析服务名字时就会返回这个虚拟IP,对虚拟IP的请求会通过overlay网络自动的负载到这个服务所有的健康任务上。

这个方式也避免了客户端的负载均衡,因为只有单独的一个IP会返回到客户端,docker会处理虚拟IP到具体任务的路由,并把请求平均的分配给所有的健康任务。

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

Exteral LB 又可以称为Ingress LB 或者 Swarm Mode Routing Mesh。

看名字就知道,这个负载均衡方式和提到的Ingress网络有关。

Swarm网络要提供对外访问的服务就需要打开公开端口,并映射到宿主机。

Ingress LB就是外部通过公开端口访问集群时做的负载均衡。

当创建或更新一个服务时,你可以利用–publish选项把一个服务暴露到外部,在docker swarm模式下发布一个端口意味着在集群中的所有节点都会监听这个端口,这时当访问一个监听了端口但是并没有对应服务运行在其上的节点会发生什么呢? 

接下来就该我们的路由网格(routing mesh)出场了,路由网格是docker1.12引入的一个新特性,它结合了IPVS和iptables创建了一个强大的集群范围的L4层负载均衡,它使所有节点接收服务暴露端口的请求成为可能。

当任意节点接收到针对某个服务暴露的TCP/UDP端口的请求时,这个节点会利用预先定义过的Ingress overlay网络,把请求转发给服务对应的虚拟IP。

ingress网络和其他的overlay网络一样,只是它的目的是为了转换来自客户端到集群的请求,它也是利用我们前一小节介绍过的基于VIP的负载均衡技术。

启动服务后,你可以为应用程序创建外部DNS记录,并将其映射到任何或所有Docker swarm节点。你无需担心你的容器具体运行在那个节点上,因为有了路由网这个特性后,你的集群看起来就像是单独的一个节点一样。

上面这个图表明了路由网是怎么工作的:

1. 服务(app)拥有两份复制,并把端口映射到外部端口的8000

2. 路由网在集群中的所有节点上都暴露出8000

3. 外部对服务app的请求可以是任意节点,在本例子中外部的负载均衡器将请求转发到了没有app服务的主机上

4. docker swarm的IPVS利用ingress overlay网路将请求重新转发到运行着app服务的节点的容器中

Docker Swarm管理节点高可用分析

https://zhoujinl.github.io/2018/10/19/docker-swarm-manager-ha

Docker Swarm服务调度分析

https://zhoujinl.github.io/2018/09/20/docker-swarm-scheduler

Docker Reference Architecture: Universal Control Plane Service Discovery and Load Balancing for Swarm

  https://success.docker.com/article/ucp-service-discovery

以上是关于【swarm】Docker swarm 的负载均衡的主要内容,如果未能解决你的问题,请参考以下文章

Docker 容器技术 — Swarm 集群

Docker 容器技术 — Swarm 集群

[docker swarm] 从单容器走向负载均衡部署

网络和负载均衡器如何在 docker swarm 模式下工作?

网络和负载均衡器如何在docker swarm模式下工作?

Swarm实现Docker集群的搭建和管理。