Docker 再学习 (9) Swarm 的 ingress 网络

Submitted by Lizhe on Tue, 02/26/2019 - 10:41

如果容器需要对外暴露端口号, 例如

 

   ports:
      - "800:80"
      - "811:81"

那么它就会持有一个ingress网络

 像下面这样, 你会发现除了自定义的( 或者默认的 ) overlay网络, ingress 也在

           

  "MacAddress": "",
            "Networks": {
                "ingress": {
                    "IPAMConfig": {
                        "IPv4Address": "10.255.0.102"
                    },
                    "Links": null,
                    "Aliases": [
                        "05b77526e519"
                    ],
                    "NetworkID": "n2w5m0cx0u4gq22i3l8jrda29",
                    "EndpointID": "36127e4dd55d55f0a75373123a3cc2a01d5585223f831108123910ef8088e7c3",
                    "Gateway": "",
                    "IPAddress": "10.255.0.102",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:0a:ff:00:66",
                    "DriverOpts": null
                },
                "stackdemotwo_myoverlay": {
                    "IPAMConfig": {
                        "IPv4Address": "192.168.0.7"
                    },
                    "Links": null,
                    "Aliases": [
                        "05b77526e519"
                    ],
                    "NetworkID": "folbyalxz2ehbhb799gjxs6yy",
                    "EndpointID": "c8e385ff1cb10e7f7517959b4946055f55453280f0191e54e90623be6411f8f7",
                    "Gateway": "",
                    "IPAddress": "192.168.0.7",
                    "IPPrefixLen": 24,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:c0:a8:00:07",
                    "DriverOpts": null
                }
 

 

而且此网络是 overlay 的

 

[root@machine1 yamls]# docker network ls
NETWORK ID          NAME                     DRIVER              SCOPE
14d27b6d2ce5        bridge                   bridge              local
a523f7a843bc        docker_gwbridge          bridge              local
f5b2c30e8ca9        host                     host                local
n2w5m0cx0u4g        ingress                  overlay             swarm
2d0jk8hu0lz8        myoverlay                overlay             swarm
x7dzb1ztuw4b        myoverlay3               overlay             swarm
449b37124c3a        none                     null                local
mlrfnb37w1nt        stackdemo_default        overlay             swarm
folbyalxz2eh        stackdemotwo_myoverlay   overlay             swarm
39l54sing2xm        swarm_ov_network         overlay             swarm
[root@machine1 yamls]# 

那么好奇的是, 既然大家都是用ingress的overlay网络, 那么两个service是否能通过它互通呢?

我使用下面的yaml文件创建两组对外暴露端口的stack

 

[root@machine1 yamls]# docker stack deploy --compose-file test.yaml stackdemotwo

[root@machine1 yamls]# docker stack deploy --compose-file test.yaml stackdemothree

 

[root@machine1 yamls]# cat test.yaml 
version: "3"
services:
  nginxservice:
    image: nginxdemos/hello
    deploy:
      mode: replicated
      replicas: 6
    ports:
      - "8000:80"
      - "8111:81"

[root@machine1 yamls]# 
 

20190226065531

取一个 在 docker1 上的, stack two 中的容器查看

20190226065637

具体信息如下

所在主机 所在stack default overlay ingress overlay
docker1 two 10.0.7.5 10.255.0.147
docker2 two 10.0.7.4 10.255.0.146
docker1 three 10.0.8.4 10.255.0.153
docker2 three 10.0.8.5 10.255.0.154

 

  docker1_two docker1_three docker2_two docker2_three
docker1_two NA default 不通
ingress 通过
default 通过
ingress 通过
default 不通
ingress 通过
docker1_three default 不通
ingress 通过
NA default 不通
ingress 通过
default 通过
ingress 通过
docker2_two default 通过
ingress 通过
default 不通
ingress 通过
NA default 不通
ingress 通过
docker2_three default 不通
ingress 通过
default 通过
ingress 通过
default 不通
ingress 通过
NA

 

根据以上结果, ingress果然是全通的, 因为走的都是一个网络, 但是 自定义的 ( 默认的 ) default overlay 网络, 是完全根据是否在一个stack中来区分网络的

 

 

如果删除 test.yaml中的ports 部分, 也就是说不需要映射端口, 那么ingress就不会被加入到这个stack的容器中

20190226072226