docker的服务发现和负载均衡

1.使用DNS进行服务发下

docker引擎据由内部的DNS服务器,可以为用户定义的网桥(network)、覆盖网络igressoverla(ovelay)、macvlan网络中主机上的所有容器提供名称解析。

每个容器内都有一个NDS解析器,将dns查询结果转发到docker引擎(docker守护程序),该引擎充当dns服务器。docker引擎检查dns查询是属于容器还是属于集群service的请求,如果是容器

则docker引擎会查找与容器名称相匹配的ip,或者service在其键值存储中查找并将ip或者service虚拟ip返回给请求者。

服务发现是网络范围的,这意味着只有位于同一网络上的容器或任务才能使用嵌入式DNS功能。如果容器或者service不在同一网络中,则docker引擎会将dns查询转发到默认DNS服务器解析。

2.内部负载均衡

在docker swarm集群创建服务时,会自动为他们分配一个虚拟ip,该虚拟IP是服务网络的一部分。解析服务名称时返回vip。通过覆盖网络(overlay)自动将vip的流量发送到服务的所有的健康任务中。

docker负责路由并在健康的服务中平均分配流量。

创建overlay网络

docker network create  -d overlay  mylay

查看swarm创建服务时分配的vip

docker service inspect  服务名  | grep  Addr

DNS循环(DNS RR)负载平衡是服务的另一个负载平衡选项(配置为--endpoint-mode)。

在DNS RR模式下,不会为每个服务创建VIP。Docker DNS服务器以循环方式将服务名称解析为单个容器IP

3.swarm集群路由网


路由网的原理:集群中所有的节点都对外公布tcp/udp端口,接收来自外部的请求连接流量,之后通过内核的IPVS负载均衡器将ingress覆盖网络上的流量重定向到健康的服务副本。

路由网是由docker engine 1.12中引入的,它组合ipvs和iptable创建了一个集群范围内的传输层L4负载均衡。它允许集群中所有节点接收已发布端口上的请求连接。

当任何集群节点接收到tcp/upd端口service的流量的,就会使用服务创建时指定的覆盖网络将请求流量分发到服务的vip igress。

启动服务后,您可以为应用程序创建外部DNS记录(对外公布端口 --public 80:80),并将其映射到任何或所有Docker swarm节点。

4.swarm第7层路由(互锁代理)

群集模式路由网络非常适合传输层路由。它使用服务的已发布端口路由到服务。互锁是一种新功能,可在应用层(L7)上启用服务发现。

此第7层路由通过添加应用层功能(例如检查HTTP标头)扩展到群集模式路由网格。互锁和群集模式路由网络一起使用,以提供灵活和强大的服务交付。


猜你喜欢

转载自blog.51cto.com/12182612/2428465