1. 程式人生 > >Swarm mode環境模型-小結篇

Swarm mode環境模型-小結篇

環境準備:1)搭建一個swarm mode叢集環境

[email protected]:/home/docker/xu/swarm# docker node ls
ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
2bjtayk2pbbcl384ef9dxvyi0 *  docker1   Down    Active        Leader
b4f80o1a32afg5buim66w71se    docker2   Down    Active  

2)建立一個基於overlay的mysql(名稱)網路

[email protected]:/home/docker/xu/swarm# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
1b1c3a449781        bridge              bridge              local               
041a4a5c12d7        docker_gwbridge     bridge              local               
a7c3520d5f74        host                host                local               
10xf6wjdp7kc        ingress             overlay             swarm               
2t21vsd267ms        mysql               overlay             swarm   
a5b817842a3a none null local

1、Swarm mode有個內建的overlay網路ingress,該網路主要是用於swarm vip方式的負載均衡

[email protected]:/home/docker/xu/swarm# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
1b1c3a449781        bridge              bridge              local               
041a4a5c12d7        docker_gwbridge     bridge              local               
a7c3520d5f74        host                host                local               
10xf6wjdp7kc        ingress             overlay             swarm  
2t21vsd267ms mysql overlay swarm a5b817842a3a none null local

2Swarm mode vip負載均衡的官方解釋

The swarm manager uses ingress load balancing to expose the services you want to make available externally to the swarm. The swarm manager can automatically assign the service a PublishedPort or you can configure a PublishedPort for the service. You can specify any unused port. If you do not specify a port, the swarm manager assigns the service a port in the 30000-32767 range.

External components, such as cloud load balancers, can access the service on the PublishedPort of any node in the cluster whether or not the node is currently running the task for the service. All nodes in the swarm route ingress connections to a running task instance.

3、Routing Mesh是實現vip負載均衡的關鍵技術, Routing Mesh的目的是每個主機上都為服務預留埠, 保證每臺

器上都可以訪問到服務。實現的辦法就是Ingress網路, 之前我們提到容器中會多出一塊網路,我們Inspect ingress

絡,同時會發現網路對應的容器上多出一個容器 ingress-sbox。

[email protected]:/home/docker/xu/swarm# docker service inspect mysql
[
    {
        "ID": "ayxboy2ry1qlxojpslz9ujh0p",
        "Version": {
            "Index": 153
        },
        "CreatedAt": "2017-01-04T03:10:52.670583716Z",
        "UpdatedAt": "2017-01-04T03:10:52.848750019Z",
        "Spec": {
            "Name": "mysql",
            "TaskTemplate": {
                "ContainerSpec": {
                    "Image": "docker1:5000/mysql",
                    "Env": [
                        "MYSQL_ROOT_PASSWORD=123456"
                    ]
                },
                "Resources": {
                    "Limits": {},
                    "Reservations": {}
                },
                "RestartPolicy": {
                    "Condition": "any",
                    "MaxAttempts": 0
                },
                "Placement": {}
            },
            "Mode": {
                "Replicated": {
                    "Replicas": 3
                }
            },
            "UpdateConfig": {
                "Parallelism": 1,
                "FailureAction": "pause"
            },
            "Networks": [
                {
                    "Target": "2t21vsd267ms5b4q1p5loga6g"
                }
            ],
            "EndpointSpec": {
                "Mode": "vip",
                "Ports": [
                    {
                        "Protocol": "tcp",
                        "TargetPort": 3306,
                        "PublishedPort": 3306
                    }
                ]
            }
        },
        "Endpoint": {
            "Spec": {
                "Mode": "vip",
                "Ports": [
                    {
                        "Protocol": "tcp",
                        "TargetPort": 3306,
                        "PublishedPort": 3306
                    }
                ]
            },
            "Ports": [
                {
                    "Protocol": "tcp",
                    "TargetPort": 3306,
                    "PublishedPort": 3306
                }
            ],
            "VirtualIPs": [
                {
                    "NetworkID": "10xf6wjdp7kc8fvw4g96eu4h5",
                    "Addr": "10.255.0.6/16"  //對應的是ingress網路
                },
                {
                    "NetworkID": "2t21vsd267ms5b4q1p5loga6g",
                    "Addr": "10.0.0.2/24"  //對應的是mysql網路
                }
            ]
        },
        "UpdateStatus": {
            "StartedAt": "0001-01-01T00:00:00Z",
            "CompletedAt": "0001-01-01T00:00:00Z"
        }
    }
]
[email protected]:/home/docker/xu/swarm# docker network inspect ingress 
[
    {
        "Name": "ingress",
        "Id": "10xf6wjdp7kc8fvw4g96eu4h5",
        "Scope": "swarm",
        "Driver": "overlay",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "10.255.0.0/16",
                    "Gateway": "10.255.0.1"
                }
            ]
        },
        "Internal": false,
        "Containers": {
            "f94593ea66347a64f44e81177f4fc444dc5ba9eeac97b36007ad38825381fc36": {
                "Name": "mysql.1.dk3fhi1d01j3x8lzg26rehmva",
                "EndpointID": "dbde133c6e6d3e9f15a911681e350f933e4d1e94e1cdc8fa1015aed1e33eefc0",
                "MacAddress": "02:42:0a:ff:00:07",
                "IPv4Address": "10.255.0.7/16",
                "IPv6Address": ""
            },
            "ingress-sbox": {
                "Name": "ingress-endpoint",
                "EndpointID": "dfc75c3e1818a9aba28343cdda481fea11819bb46ac2d8b763a5914bbf87fe30",
                "MacAddress": "02:42:0a:ff:00:03",
                "IPv4Address": "10.255.0.3/16",
                "IPv6Address": ""
            }
        },
        "Options": {
            "com.docker.network.driver.overlay.vxlanid_list": "256"
        },
        "Labels": {}
    }
]

4、vip 負載均衡資料流量

主機埠(例如8080) =>  容器Ingress-sbox(例如10.255.0.3/16,如上ingress配置) =>  IPVS分發到containers。 

訪問主機之後資料包流到了一個特殊的Sandbox容器裡, 這個容器和我們的容器共享一個Ingress網路,通過Iptables

和IPVS等重定向到了最終容器之上。 達到了服務在任何一臺主機的8080埠都可達的目的。 

5、DNS負載均衡與vip負載不一樣,它主要依賴的使用者自定義的overlay網路,例如本實驗中的mysql

如何確定是建立支援dns或者是vip方式的負載均衡服務,主要是由引數--endpoint-mode決定,例如:

1)dns方式

docker service create --network overlay-test  --name mysql --replicas=3 --endpoint-mode=dnsrr dockertest1:5000/mysql

2)vip方式
docker service create --network overlay-test -p 3306:3306  --name mysql --replicas=3 --endpoint-mode=vip dockertest1:5000/mysql

dns方式是不允許有-p這個引數的,同時vip是預設模式,所以在建立VIP型別,也可以不加--endpoint-mode引數。建立的DNS型別的時候,容器中不會出現ingress網路,請

看下面的程式碼塊:

[email protected]:/home/docker/xu/swarm# docker exec -ti 66d0 /bin/bash
[email protected]:/# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
272: [email protected]: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP group default 
    link/ether 02:42:0a:00:00:02 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.2/24 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:aff:fe00:2/64 scope link 
       valid_lft forever preferred_lft forever
278: [email protected]: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:12:00:04 brd ff:ff:ff:ff:ff:ff
    inet 172.18.0.4/16 scope global eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::42:acff:fe12:4/64 scope link 
       valid_lft forever preferred_lft forever


其中1)lo網絡卡不用多說, 是本地網絡卡, 也叫回環網絡卡;

2)eth1和docker_gwbridge網橋構成的網路可以使容器內的服務可以在主機上訪問, 主機上telnet 172.18.0.4可以訪問到我們的服務,如下圖

3)eth0屬於之前建立的mysql網路,可以通過檢視inspect網路得出該結果docker network inspect mysql

[email protected]:/home/docker/xu/swarm# docker network inspect mysql
[
    {
        "Name": "mysql",
        "Id": "2t21vsd267ms5b4q1p5loga6g",
        "Scope": "swarm",
        "Driver": "overlay",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "10.0.0.0/24",
                    "Gateway": "10.0.0.1"
                }
            ]
        },
        "Internal": false,
        "Containers": {
            "66d0acd4ac010a0e488483074fa8dc5c1be3631c0be0121567676df5bdc5cf38": {
                "Name": "mysql.1.9d4pzyi0okzdzwh501j3u8d1r",
                "EndpointID": "1463b3e479b582530db5e92513d90df25f8ab28917c48346576b9d73e9c12b33",
                "MacAddress": "02:42:0a:00:00:02",
                "IPv4Address": "10.0.0.2/24",
                "IPv6Address": ""
            },
            "cfe34fdf93dd4739c5f71125527368646631d5c4d4a89b30f768d16d9c38ea12": {
                "Name": "mysql.2.cstky0b52xnumtfgq98zngo3j",
                "EndpointID": "8d2f38ee93bc4f4e57f4bb5201d9297ff36587d34592f14f46aaea690e72cc46",
                "MacAddress": "02:42:0a:00:00:0f",
                "IPv4Address": "10.0.0.15/24",
                "IPv6Address": ""
            }
        },
        "Options": {
            "com.docker.network.driver.overlay.vxlanid_list": "257"
        },
        "Labels": {}
    }
]







該service啟動了兩個任務,分別對應的container的ip是10.0.0.2和10.0.0.15

DNS型別的service也不會有vim出現,請看下面DNS型別的配置格式

[email protected]:/home/docker/xu/swarm# docker service inspect mysql
[
    {
        "ID": "68zci8gtfsprbuscfibad5ypz",
        "Version": {
            "Index": 862
        },
        "CreatedAt": "2017-01-04T05:21:53.149763995Z",
        "UpdatedAt": "2017-01-04T05:21:53.149763995Z",
        "Spec": {
            "Name": "mysql",
            "TaskTemplate": {
                "ContainerSpec": {
                    "Image": "docker1:5000/mysql",
                    "Env": [
                        "MYSQL_ROOT_PASSWORD=123456"
                    ]
                },
                "Resources": {
                    "Limits": {},
                    "Reservations": {}
                },
                "RestartPolicy": {
                    "Condition": "any",
                    "MaxAttempts": 0
                },
                "Placement": {}
            },
            "Mode": {
                "Replicated": {
                    "Replicas": 2
                }
            },
            "UpdateConfig": {
                "Parallelism": 1,
                "FailureAction": "pause"
            },
            "Networks": [
                {
                    "Target": "2t21vsd267ms5b4q1p5loga6g"
                }
            ],
            "EndpointSpec": {
                "Mode": "dnsrr"
            }
        },
        "Endpoint": {
            "Spec": {}
        },
        "UpdateStatus": {
            "StartedAt": "0001-01-01T00:00:00Z",
            "CompletedAt": "0001-01-01T00:00:00Z"
        }
    }
]


關於Swarm mode的網路就分享到這,以後再繼續分享