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
2、Swarm 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的網路就分享到這,以後再繼續分享