下文给大家带来使用DNS的服务发现及内部负载均衡,希望能够给大家在实际运用中带来一定的帮助,负载均衡涉及的东西比较多,理论也不多,网上有很多书籍,今天我们就用Vecloud在行业内累计的经验来做一个解答。
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标头)扩展到群集模式路由网格。互锁和群集模式路由网络一起使用,以提供灵活和强大的服务交付。 |