『中级篇』集群服务间通信之RoutingMesh(47)
2018-10-01 22:14:42
李明
  • 访问次数: 379
  • 注册日期: 2018-07-09
  • 最后登录: 2020-03-30

原创文章,欢迎转载。转载请注明:转载自 IT人故事会,谢谢!
原文链接地址: 『中级篇』集群服务间通信之RoutingMesh(47)

上次讲了通过service create 部署了wordpress,我们的这个wordpress有2个service组成一个wordpress,一个mysql。这2个service运行在不同的机器上边,并且他们之前是可以进行通信的,可以通过servicename的方式通信。先创建mysql,wordpress查找mysql就是通过servicename这种方式。懂网络的老铁应该就知道了,这里面肯定有DNS的功劳在里面。

1662ffa14e3ff6a1?w=1240&h=864&f=png&s=52

实验的方式了解这个网络
  • 必须创建overlay的network

sudo docker network create -d overlay demo

1662ffa14efdb19c?w=1240&h=262&f=png&s=52

  • 创建一个service,这个service 使用whoami,这个image,这个image的作用,就是访问后,返回当前访问的主机名称

docker service create --name whoami -p 8000:8000 --network demo jwilder/whoami #查看service 里面的服务 docker service ls #查看whoami的信息 docker service ps whoami #因为service ps whoami 在manager上运行,直接在manager查看ps下 docker ps

1662ffa14f01ad32?w=1240&h=91&f=png&s=168
1662ffa14f752511?w=1240&h=156&f=png&s=32

#访问下本地manager的whoami curl 127.0.0.1:8000

1662ffa1516f345a?w=813&h=64&f=png&s=3164

  • 创建一个service,这个service 使用busybox,之前创建过是一个比较简单的image,这个是为了当客户端service之间的访问。

docker service create --name client -d --network demo busybox sh -c "while true;do sleep 3600;done" docker service ls #运行在swam-worker1机器上 docker service ps client

1662ffa14fe3cfd5?w=1240&h=47&f=png&s=109

#在swam-work1上进行运行 172.28.128.4  docker exec -it busybox的容器ID sh ping whoami

1662ffa21cfddd3c?w=1240&h=109&f=png&s=19
1662ffa2273408f1?w=939&h=119&f=png&s=469

ping whoami ip地址是10.0.0.247

  • 测试whoami的ip是否发生变化

在manager下进行scale 扩展为2个,查看到一个在worker2上边,并在worker2的ps上可以查看到whoami的运行,尝试继续ping whoami,结果ip不发生变化。

#manager机器上进行扩展 docker service scale whoami=2 #worker2 上运行 查看whoami 是否存在 docker ps #worker1 上ping whoami发现ip没有发生变化10.0.0.247 ping whoami

1662ffa228af85d4?w=1240&h=544&f=png&s=46

为什么呢 ip不发生变化,其实我们ping的地址是一个虚拟的ip,docker 集群默认使用 Overlay 网络驱动,Overlay 驱动实现了跨主机集群内部虚拟网络。它的作用:将运行的多个容器(不同主机),附加(attach to)到一个网络默认情况下,服务发现为群集中的每个服务分配虚拟IP地址(VIP)和 动态 DNS,使其可以通过服务名称将其提供给同一网络上的容器。即在一个 Overlay 虚拟网络内,使用服务名称访问,将实现任务级别的负载均衡在群集中使用覆盖网络,需要在群集节点之间打开以下端口:
端口7946 TCP / UDP用于容器网络发现。
端口4789 UDP用于容器覆盖网络。
机器进行迁移的时候有一套map<k,v>关系,虚拟ip 和实际的ip 有个对应的关系,

  • 轮训的负载机制

wget whoami:8000 more index.html #因为目前就有2个whoami, #所以可以看到第三次执行wget获取的时候发现id重复了也变成了65beb6796165

1662ffa22a331d39?w=1240&h=453&f=png&s=63

Routing Mesh的体验
  1. Internal --- Container 和Container 之间的访问通过overlay网络(通过VIP虚拟IP)

  2. Ingress---- 如果服务有绑定接口,则此服务可以通过任意swarm节点的响应接口访问

Load Balancing

现在有3台机器1个client,2个web,他们3个连通在同一个swam下,当client访问web的时候其实,其实是访问10.0.9.4,然后通过负载的方式映射到10.0.9.5或者10.0.9.6上面。

1662ffa240fa9a48?w=1240&h=634&f=png&s=27
1662ffa247228dc7?w=1240&h=692&f=png&s=44

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