盒子
盒子
文章目录
  1. 安装etcd
  2. 安装flannel

为Docker配置flannel网络

Docker的覆盖式跨主机网络有很多第三方的解决方案,其中flannelcoreOS提供的一种方案,并且支持Kubernetes。

本次的主要目的配置flannel网络,flannel同样需要一个额外的KV存储系统,它支持etcd。本次配置有两台机器:

1
2
172.18.240.119
172.18.115.116

安装etcd

这个不多做说明,假设已经已经下载编译过的etcd,在解压过后的目录中启动etcd:

1
./etcd --advertise-client-urls http://172.18.240.119:2380 --listen-client-urls http://172.18.240.119:2379,http://127.0.0.1:2379 > etcd.log 2>&1 &

安装flannel

在官方releases列表中选择一个合适的包,本次两台机器均为Ubuntu系统。登录119机器下载已经编译好的包:

1
# wget https://github.com/coreos/flannel/releases/download/v0.7.1/flannel-v0.7.1-linux-amd64.tar.gz

解压并且启动:

1
2
# tar -xvf flannel-v0.7.1-linux-amd64.tar.gz
# ./flanneld > flannel.log 2>&1 &

这样启动后flanneld会一直等待获取到etcd的网络配置信息。默认flanneld读取的是etcd中/coreos.com/network/config下的配置,现在需要设置网络配置信息:

1
# curl http://127.0.0.1:2379/v2/keys/coreos.com/network/config -XPUT -d value='{ "Network": "10.5.0.0/16", "Backend": {"Type": "vxlan"}}'

其中Network就是需要配置的子网,Type指定网络的类型,flanneld是支持两种网络类型的。现在flanneld已经可以正常从etcd读取的网络配置。

接下来需要和Docker集成,Docker daemon是支持--bip参数的,和Docker集成需要在Daemon中添加此参数。而默认flanneld会把网路片配置存储在/run/flannel/subnet.env文件中:

1
2
3
4
5
# cat /run/flannel/subnet.env
FLANNEL_NETWORK=10.5.0.0/16
FLANNEL_SUBNET=10.5.82.1/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=false

Docker是用Systemd启动的,添加EnvironmentFile并指定/run/flannel/subnet.env文件,然后添加启动参数,修改的服务如下:

1
2
3
4
5
6
7
8
9
10
11
...
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
EnvironmentFile=-/etc/default/docker
EnvironmentFile=-/run/flannel/subnet.env
ExecStart=/usr/bin/dockerd -H fd:// $DOCKER_OPTS --bip=${FLANNEL_SUBNET} --mtu=${FLANNEL_MTU}
ExecReload=/bin/kill -s HUP $MAINPID
...

可以看到添加了启动参数--bip=${FLANNEL_SUBNET} --mtu=${FLANNEL_MTU},分别指定当前机器所属的子网,以及MTU大小。现在重启服务:

1
2
# systemctl daemon-reload
# systemctl restart docker

现在119上已经配置好flanneld网络并已集成到Docker,再登录116机器。由于etcd已经在119上部署,在116机器直接启动并指定etcd地址:

1
# ./flanneld -etcd-endpoints=http://172.18.240.119:2379 > flanneld.log 2>&1 &

同样修改Systemd的服务配置为Docker添加flanneld参数然后重启服务。现在116上运行一个容器并不用再指定网络模式:

1
# docker run -dti --name qperf-server-fla arjanschaaf/centos-qperf -lp 4000

检查该容器的网络:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# docker inspect qperf-server-fla
...
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "975c88dd2f4cebcd2bdf7b5aec15825df9eab354325f3b8b7b01bb7fee512c1d",
"EndpointID": "a50315ec2efbe4b6373e3e63b5bdac77acc4047c14c6b565ad3e7f0e7c787972",
"Gateway": "10.5.10.1",
"IPAddress": "10.5.10.2",
"IPPrefixLen": 24,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:0a:05:0a:02"
}
}
...

可以看到分配的IP已经是子网下的IP,在119上运行另一个容器并测试网络:

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 run -ti --rm arjanschaaf/centos-qperf -v 10.5.10.2 -lp 4000 -ip 4001 tcp_bw tcp_lat conf
tcp_bw:
bw = 146 MB/sec
msg_rate = 2.23 K/sec
port = 4,001
send_cost = 505 ms/GB
recv_cost = 5.29 sec/GB
send_cpus_used = 7.5 % cpus
recv_cpus_used = 77.5 % cpus
tcp_lat:
latency = 399 us
msg_rate = 2.51 K/sec
port = 4,001
loc_cpus_used = 6 % cpus
rem_cpus_used = 3 % cpus
conf:
loc_node = 94a29f4e7573
loc_cpu = Intel Xeon E5-2682 v4 @ 2.50GHz
loc_os = Linux 4.4.0-82-generic
loc_qperf = 0.4.9
rem_node = 847d3f0c7aad
rem_cpu = Intel Xeon E5-2680 v3 @ 2.50GHz
rem_os = Linux 4.4.0-82-generic
rem_qperf = 0.4.9

已经可以正常通信,这是其中的网络性能测试结果。

支持一下
扫一扫,支持forsigner