Service 之间如何通信?- 每天5分钟玩转 Docker 容器技术(101)
2017-12-04 07:49
766 查看
微服务架构的应用由若干 service 组成。比如有运行 httpd 的 web 前端,有提供缓存的 memcached,有存放数据的 mysql,每一层都是 swarm 的一个 service,每个 service 运行了若干容器。在这样的架构中,service 之间是必然要通信的。
[b]服务发现[/b]
一种实现方法是将所有 service 都 publish 出去,然后通过 routing mesh 访问。但明显的缺点是把 memcached 和 mysql 也暴露到外网,增加了安全隐患。
如果不 publish,那么 swarm 就要提供一种机制,能够:
让 service 通过简单的方法访问到其他 service。
当 service 副本的 IP 发生变化时,不会影响访问该 service 的其他 service。
当 service 的副本数发生变化时,不会影响访问该 service 的其他 service。
这其实就是服务发现(service discovery)。Docker Swarm 原生就提供了这项功能,通过服务发现,service 的使用者不需要知道 service 运行在哪里,IP 是多少,有多少个副本,就能与 service 通信。下面我们开始实践。
创建 overlay 网络
要使用服务发现,需要相互通信的 service 必须属于同一个 overlay 网络,所以我们先得创建一个新的 overlay 网络。
直接使用
很遗憾,目前
overlay 网络。
部署 service 到 overlay
部署一个 web 服务,并将其挂载到新创建的 overlay 网络。
部署一个 util 服务用于测试,挂载到同一个 overlay 网络。
容器处于运行的状态,我们才能够进入到容器中访问 service
验证
通过
util 所在的节点为 swarm-worker1。
登录到 swarm-worker1,在容器 util.1 中 ping 服务
可以看到
IP 为
其实哪个副本的 IP 都不是。
的 VIP(Virtual IP),swarm 会将对 VIP 的访问负载均衡到每一个副本。
我们可以执行下面的命令查看每个副本的 IP。
IP。不过对于服务的使用者(这里是 util.1),根本不需要知道
IP,也不需要知道
VIP,只需直接用 service 的名字
Service 的访问就讨论到这里,下一节我们学习 Rolling Update。
书籍:
1.《每天5分钟玩转Docker容器技术》
https://item.jd.com/16936307278.html
2.《每天5分钟玩转OpenStack》
https://item.jd.com/12086376.html
[b]服务发现[/b]
一种实现方法是将所有 service 都 publish 出去,然后通过 routing mesh 访问。但明显的缺点是把 memcached 和 mysql 也暴露到外网,增加了安全隐患。
如果不 publish,那么 swarm 就要提供一种机制,能够:
让 service 通过简单的方法访问到其他 service。
当 service 副本的 IP 发生变化时,不会影响访问该 service 的其他 service。
当 service 的副本数发生变化时,不会影响访问该 service 的其他 service。
这其实就是服务发现(service discovery)。Docker Swarm 原生就提供了这项功能,通过服务发现,service 的使用者不需要知道 service 运行在哪里,IP 是多少,有多少个副本,就能与 service 通信。下面我们开始实践。
创建 overlay 网络
要使用服务发现,需要相互通信的 service 必须属于同一个 overlay 网络,所以我们先得创建一个新的 overlay 网络。
docker network create --driver overlay myapp_net
直接使用
ingress行不行?
很遗憾,目前
ingress没有提供服务发现,必须创建自己的
overlay 网络。
部署 service 到 overlay
部署一个 web 服务,并将其挂载到新创建的 overlay 网络。
docker service create --name my_web --replicas=3 --network myapp_net httpd
部署一个 util 服务用于测试,挂载到同一个 overlay 网络。
docker service create --name util --network myapp_net busybox sleep 10000000
sleep 10000000的作用是保持 busybox
容器处于运行的状态,我们才能够进入到容器中访问 service
my_web。
验证
通过
docker service ps util确认
util 所在的节点为 swarm-worker1。
登录到 swarm-worker1,在容器 util.1 中 ping 服务
my_web。
可以看到
my_web的
IP 为
10.0.0.2,这是哪个副本的 IP 呢?
其实哪个副本的 IP 都不是。
10.0.0.2是
my_webservice
的 VIP(Virtual IP),swarm 会将对 VIP 的访问负载均衡到每一个副本。
我们可以执行下面的命令查看每个副本的 IP。
docker exec util.1.bpon0vvbgve6lz3fp08sgana6 nslookup tasks.my_web
10.0.0.3、
10.0.0.4、
10.0.0.5才是各个副本自己的
IP。不过对于服务的使用者(这里是 util.1),根本不需要知道
my_web副本的
IP,也不需要知道
my_web的
VIP,只需直接用 service 的名字
my_web就能访问服务。
Service 的访问就讨论到这里,下一节我们学习 Rolling Update。
书籍:
1.《每天5分钟玩转Docker容器技术》
https://item.jd.com/16936307278.html
2.《每天5分钟玩转OpenStack》
https://item.jd.com/12086376.html
相关文章推荐
- Service 之间如何通信?- 每天5分钟玩转 Docker 容器技术(101)
- Service 之间如何通信?- 每天5分钟玩转 Docker 容器技术(101)
- Service 之间如何通信?- 每天5分钟玩转 Docker 容器技术(101)
- 容器在 Weave 中如何通信和隔离?- 每天5分钟玩转 Docker 容器技术(65)
- overlay 如何实现跨主机通信?- 每天5分钟玩转 Docker 容器技术(52)
- 容器在 Weave 中如何通信和隔离?- 每天5分钟玩转 Docker 容器技术(65)
- 如何滚动更新 Service?- 每天5分钟玩转 Docker 容器技术(102)
- 容器在 Weave 中如何通信和隔离?- 每天5分钟玩转 Docker 容器技术(65)
- 如何访问 Service?- 每天5分钟玩转 Docker 容器技术(99)
- Weave 如何与外网通信?- 每天5分钟玩转 Docker 容器技术(66)
- 如何实现 Service 伸缩?- 每天5分钟玩转 Docker 容器技术(97)
- 外网如何访问 Service?- 每天5分钟玩转 Docker 容器技术(139)
- Weave 如何与外网通信?- 每天5分钟玩转 Docker 容器技术(66)
- 如何实现 Service 伸缩?- 每天5分钟玩转 Docker 容器技术(97)
- Weave 如何与外网通信?- 每天5分钟玩转 Docker 容器技术(66)
- 如何实现 Service 伸缩?- 每天5分钟玩转 Docker 容器技术(97)
- Weave 如何与外网通信?- 每天5分钟玩转 Docker 容器技术(66)
- 如何滚动更新 Service?- 每天5分钟玩转 Docker 容器技术(102)
- 如何实现 Service 伸缩?- 每天5分钟玩转 Docker 容器技术(97)
- 如何访问 Service?- 每天5分钟玩转 Docker 容器技术(99)