centos7下配置docker跨主机网络-overlay

docker 跨主机容器通讯有多重实现方式,之前介绍过 Flannel,本节内容我们来介绍下 overlay 实现方式。

Docker提供了 overlay driver,用户可以创建基于 VxLANoverlay 网络。VxLAN 可将二层数据封装到 UDP 进行传输。

一、环境介绍

节点 IP
docker-node1 192.168.1.10
docker-node2 192.168.1.11
docker-node3 192.168.1.12

1、Docker overlay网络需要一个 key-value 数据库用于保存网络信息状态,包括Network,Endpoint,IP等。ConsulEtcdZookeeper 都是docker支持的 key-value 软件。
由于对 etcd 比较熟悉,这里我们使用 etcd 来实现此功能。在上面3个节点中配置 etcd 集群。
2、上面3个节点上均安装 docker 服务,最后实现 container 的跨主机互通功能。

二、配置ETCD集群

1、安装etcd

1
yum install etcd

2、修改配置文件 /etc/etcd/etcd.conf
docker-node1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# [member]
# 节点名称
ETCD_NAME="docker-node1"
# 数据存放位置
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
# 监听其他 Etcd 实例的地址
ETCD_LISTEN_PEER_URLS="http://192.168.1.10:2380"
# 监听客户端地址
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379,http://0.0.0.0:4001"

#[Clustering]
# 通知其他 Etcd 实例地址
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.1.10:2380"
# 通知客户端地址
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.1.10:2379"
# 初始化集群内节点地址
ETCD_INITIAL_CLUSTER="docker-node1=http://192.168.1.10:2380,docker-node2=http://192.168.1.11:2380;docker-node2=http://192.168.1.12:2380"
# 初始化集群 token
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
# 初始化集群状态,new 表示新建
ETCD_INITIAL_CLUSTER_STATE="new"

另外两个节点配置相同,注意需要修改的地方。
3、在3个节点中分别启动etcd服务

1
systemctl start etcd.service

4、查询集群健康状态,在任意节点下操作都行

1
2
3
4
5
6
etcdctl cluster-health

member a3330a6a071bfd27 is healthy: got healthy result from http://192.168.1.10:2379
member d38b84af8836a104 is healthy: got healthy result from http://192.168.1.12:2379
member ff3afdb92f5c1db7 is healthy: got healthy result from http://192.168.1.11:2379
cluster is healthy

5、查询节点列表

1
2
3
4
5
etcdctl member list

a3330a6a071bfd27: name=docker-node1 peerURLs=http://192.168.1.10:2380 clientURLs=http://192.168.1.10:2379 isLeader=false
d38b84af8836a104: name=docker-node3 peerURLs=http://192.168.1.12:2380 clientURLs=http://192.168.1.12:2379 isLeader=true
ff3afdb92f5c1db7: name=docker-node2 peerURLs=http://192.168.1.11:2380 clientURLs=http://192.168.1.11:2379 isLeader=false

三、配置docker

1、修改docker启动配置参数

docker-node1上修改 docker daemon的配置文件

1
2
3
vim /etc/systemd/system/multi-user.target.wants/docker.service

ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock --cluster-store=etcd://192.168.1.10:2379 --cluster-advertise=eth0:2376

配置docker要连接的etcd地址
--cluster-store=etcd://192.168.1.10:2379
告知etcd自己的连接地址
--cluster-advertise=eth0:2376
重启docker服务

1
2
systemctl daemon-reload
systemctl restart docker.service

以上步骤docker-node2和docker-node3上配置相同。

2、创建overlay network

此步骤在docker-node1上创建一个 overlay network 网络。
查看创建之前的docker网络:

1
2
3
4
5
6
7
docker network ls

NETWORK ID NAME DRIVER SCOPE
5c7e54daa1ff bridge bridge local
8fb277c469e1 docker_gwbridge bridge local
fb13863ef80c host host local
23bab817ac94 none null local

创建一个名词叫 demooverlay 网络:

1
docker network crate -d overlay demo

查看创建后的docker网络:

1
2
3
4
5
6
7
8
docker network ls

NETWORK ID NAME DRIVER SCOPE
5c7e54daa1ff bridge bridge local
b1dd7731cec1 demo overlay global
8fb277c469e1 docker_gwbridge bridge local
fb13863ef80c host host local
23bab817ac94 none null local

可以使用下面命令查看新建的 demo 网络详细信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
docker network inspect demo

[
{
"Name": "demo",
"Id": "b1dd7731cec1cb07386bb3d69c9bd31661096ba0a1f7aaeb8764c8c20342d224",
"Created": "2018-10-23T11:51:47.097147743+08:00",
"Scope": "global",
"Driver": "overlay",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "10.0.0.0/24",
"Gateway": "10.0.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]

在docker-node2和docker-node3上查看,这个demo的overlay netowrk已经被同步创建。因为他们共享一个Etcd集群,这个网络信息保存在Etcd中。

四、测试跨主机容器连通性

在node1、node2、node3 三个节点上分别创建3个容器,名词分别为:app1、app2、app3
docker-node1

1
docker run -d --name app1 --network demo busybox /bin/sh -c "while true; do sleep 3600; done"

docker-node2

1
docker run -d --name app2 --network demo busybox /bin/sh -c "while true; do sleep 3600; done"

docker-node3

1
docker run -d --name app3 --network demo busybox /bin/sh -c "while true; do sleep 3600; done"

进入容器 app1 中查看网络信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
docker exec -it app1 /bin/sh

# 查看IP信息
ip a

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
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
15: eth0@if16: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1450 qdisc noqueue
link/ether 02:42:0a:00:00:02 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.2/24 brd 10.0.0.255 scope global eth0
valid_lft forever preferred_lft forever
17: eth1@if18: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth1
valid_lft forever preferred_lft forever

# 查看路由信息
ip route

default via 172.17.0.1 dev eth1
10.0.0.0/24 dev eth0 scope link src 10.0.0.2
172.17.0.0/16 dev eth1 scope link src 172.17.0.2

可以看出有2个网卡,其中 eth0 10.0.0.2 是专门进行跨主机通讯用的网卡。
通过ping测试检查,3个container可以互相通讯,配置完成。