101、Service 之间如何通信?(Swarm08)
微服务架构的应用由若干 service 构成。比如有运行 httpd 的 web 前端,有提供缓存的 memcached ,有存放数据的 mysql ,每一层都是 swarm 的一个service,每个service 运行了若干容器,在这样的架构中,service 之间必然是要通信的。
服务发现
一种实现方法是将所有的service都publish出去,然后通过 routing mesh 访问,但明显的缺点是把 memcached和mysql 也暴露到外网,增加了安全隐患。
如果不publish,那么swarm就要提供一种机制,能够:
1、让service通过简单的方法访问到其他service
2、当service副本的IP发生变化时,不会影响其他service的访问
3、当service的副本数量发生变化是,不会影响其他service的访问
这其实就是服务发现(service discovery)。Docker Swarm 原生就支持了这项功能,通过服务发现,service的使用者不需要知道service运行在哪里,IP是多少,有多少副本,就能与service通信。
root@host03:~# docker network create --driver overlay myapp_net # 要使用服务发现功能,service必须同属于一个overlay网络,而且默认的ingress 网络不支持服务发现
n8yf7inqz24q4dr5oxrqktoag
root@host03:~# docker network ls
NETWORK ID NAME DRIVER SCOPE
c31c660ab056 bridge bridge local
b5ff39d0ca1f docker_gwbridge bridge local
e9f624212e28 host host local
sngp88bsqode ingress overlay swarm
n8yf7inqz24q myapp_net overlay swarm
39b5e5857095 none null local
root@host03:~# docker service create --name my_web --replicas 3 --network myapp_net httpd # 创建一个3副本的web类 service
g8abjt515s0uhduj9lxrjmf54
overall progress: 3 out of 3 tasks
1/3: running [==================================================>]
2/3: running [==================================================>]
3/3: running [==================================================>]
verify: Service converged
root@host03:~# docker service create --name util --network myapp_net busybox sleep 100000 # 创建一个工具类service
extbn3ije96vebjx77ud5w0k7
overall progress: 1 out of 1 tasks
1/1: running [==================================================>]
verify: Service converged
root@host03:~# docker service ps util # 查看该service运行在哪个 node 上
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
8o8cz8cvawi5 util.1 busybox:latest host01 Running Running 34 seconds ago
root@host01:~# docker network ls # 查看新建的 myapp_net 已经自动推送到其他的 node上
NETWORK ID NAME DRIVER SCOPE
d4b0862f06c8 bridge bridge local
d883d53943b2 docker_gwbridge bridge local
358643b57976 host host local
sngp88bsqode ingress overlay swarm
n8yf7inqz24q myapp_net overlay swarm
f5d2888b2321 none null local
root@host01:~# docker exec util.1.8o8cz8cvawi5jsgv3xkdypqvn ping -c 3 my_web # 在工具类service中ping之前创建的web service,是可以ping通的,但解析到的IP并不是副本的IP地址,而是该service的VIP,该VIP具有负载均衡的功能
PING my_web (10.0.0.2): 56 data bytes
64 bytes from 10.0.0.2: seq=0 ttl=64 time=0.133 ms
64 bytes from 10.0.0.2: seq=1 ttl=64 time=0.100 ms
64 bytes from 10.0.0.2: seq=2 ttl=64 time=0.091 ms
--- my_web ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.091/0.108/0.133 ms
root@host01:~# docker exec util.1.8o8cz8cvawi5jsgv3xkdypqvn nslookup tasks.my_web # 通过nslookup 命令查看各副本的IP地址
Server: 127.0.0.11
Address: 127.0.0.11:53
Non-authoritative answer:
Name: tasks.my_web
Address: 10.0.0.5
Name: tasks.my_web
Address: 10.0.0.4
Name: tasks.my_web
Address: 10.0.0.3