Docker Swarm网络

1、swarm网络

swarm网络会用到以下几种网络

网络 类型 用途
docker_gwbridge bridge 容器与宿主机通信的网络
ingress overlay service在多个主机的容器的路由
自定义网络 overlay 可以将service挂在自定义的网络下

2、service路由方式vip

在swarm里创建一个service会依据该service挂载的网络数分配对应的虚拟ip,也就是说如果该服务分配一个自定义网络,那么它就会分配给该服务一个vip,但是如果该服务分配有两个自定义网络,那么会有两个vip,同时会给每一个副本容器分配一个ip,下面用具体的例子来说明,以下是部署了一个nginx服务(包含一个容器副本)和hello服务(包含三个容器副本),看下面两个服务的yaml文件网络部分截图

nginx

...
networks:
  service_overlay:
    external: true

hello

...
networks:
  service_overlay:
    external: true
  monitor_overlay:
    external: true

下面做测试,我们先仔细观察服务hello的某个容器副本内部情况
docker exec -it fe277f144998 sh

11ce10

这上面有三块网卡,其中eth0(10.255.x.x)这是ingress分配给service hello的ip,eth1 eth2是自定义的两个网络,eth3(172.18.x.x)是brifge网络

分别登录三个hello容器副本
/service # nslookup hello
第一二个副本返回

Server:         127.0.0.11
Address:        127.0.0.11:53

Non-authoritative answer:
Name:   hello
Address: 10.0.2.47   ## hello虚拟IP1

Non-authoritative answer:

第三个副本返回

Server:         127.0.0.11
Address:        127.0.0.11:53

Non-authoritative answer:
Non-authoritative answer:
Name:   hello
Address: 10.0.4.30    ## hello虚拟IP2   

ping hello
第一二个副本

PING hello (10.0.2.47): 56 data bytes
64 bytes from 10.0.2.47: seq=0 ttl=64 time=0.064 ms
64 bytes from 10.0.2.47: seq=1 ttl=64 time=0.134 ms
64 bytes from 10.0.2.47: seq=2 ttl=64 time=0.149 ms

第三个副本

PING hello (10.0.4.30): 56 data bytes
64 bytes from 10.0.4.30: seq=0 ttl=64 time=0.063 ms
64 bytes from 10.0.4.30: seq=1 ttl=64 time=0.146 ms
64 bytes from 10.0.4.30: seq=2 ttl=64 time=0.092 ms

前面说过一个service挂在自定义的网络上,swarm会自动给每一个网络分配一个虚拟路由IP,这里hello应用刚好有两个网络,分配了2个VIP,上面已经验证了这两个vip,同时vip会将请求通过ingress网格负载到应用的副本集中,那么应用的副本集ip是怎么样的呢

分别登录三个hello容器副本
执行命令
nslookup tasks.hello
第一二个副本返回

Server:         127.0.0.11
Address:        127.0.0.11:53

Non-authoritative answer:
Non-authoritative answer:
Name:   tasks.hello
Address: 10.0.2.61   
Name:   tasks.hello
Address: 10.0.2.62
Name:   tasks.hello
Address: 10.0.2.60

第三个副本返回

Server:         127.0.0.11
Address:        127.0.0.11:53

Non-authoritative answer:
Non-authoritative answer:
Name:   tasks.hello
Address: 10.0.4.45
Name:   tasks.hello
Address: 10.0.4.43
Name:   tasks.hello
Address: 10.0.4.44

以上两个网段的ip就是两个自定义网络分配个3副本容器的独立ip,可以使用命令来查看各个ip对应的是哪个副本容器
nslookup 10.0.4.44
返回

Server:         127.0.0.11
Address:        127.0.0.11:53

Non-authoritative answer:
44.4.0.10.in-addr.arpa  name = wrapper_hello.1.k0x7lls1x0kngnxl7lox0ow6j.service_overlay