使用
假设etcd部署在主机192.168.94.110:2379
。另有两台主机192.168.94.111
和192.168.94.114
,是我们准备部署flannel网络的主机,下面我们就以此为基础使用flannel可执行文件和flannel镜像两种方式部署flannel网络。
使用flannel可执行二进制文件
1. 部署etcd
flannel的网络配置信息是从etcd处获取的,首先我们需要部署etcd,如果已经部署好etcd,可忽略此步。
在192.168.94.110
主机上执行etcd
命令,启动etcd服务:
$ etcd --name infra0 --initial-advertise-peer-urls http://192.168.94.110:2380 \
--listen-peer-urls http://192.168.94.110:2380 \
--listen-client-urls http://192.168.94.110:2379,http://127.0.0.1:2379 \
--advertise-client-urls http://192.168.94.110:2379 \
--initial-cluster-token etcd-cluster-1 \
--initial-cluster infra0=http://192.168.94.110:2380 \
--initial-cluster-state new
2. 设置etcd中的网络配置信息
flannel从etcd读取配置项。默认从/coreos.com/network/config
读取配置项。在任意一台可与192.168.94.110
ping通的主机上,执行下面的命令进行配置:
$etcdctl --endpoints=192.168.94.110:2379 set /coreos.com/network/flannel_test/config '{ "Network": "10.7.0.0/16", "Backend": { "Type": "host-gw" } }'
配置了网络名为flannel_test
的网络,其配置项中包括子网信息10.7.0.0/16
,Backend
类型为host-gw
。
可通过下面的命令,验证是否设置成功:
$ etcdctl --endpoints=192.168.94.110:2379 get /coreos.com/network/flannel_test/config
{ "Network": "10.7.0.0/16", "Backend": { "Type": "host-gw" } }
3. 配置flannel
192.168.94.111
主机上配置:
(1) 从etcd获取网络配置信息
$ sudo flanneld -etcd-endpoints=http://192.168.94.110:2379 -networks=flannel_test
I0503 07:03:59.244497 02618 main.go:275] Installing signal handlers
I0503 07:03:59.246158 02618 main.go:130] Determining IP address of default interface
I0503 07:03:59.248211 02618 main.go:188] Using 192.168.94.111 as external interface
I0503 07:03:59.249188 02618 main.go:189] Using 192.168.94.111 as external endpoint
I0503 07:03:59.259330 02618 etcd.go:204] Picking subnet in range 10.7.1.0 ... 10.7.255.0
I0503 07:03:59.262616 02618 etcd.go:84] Subnet lease acquired: 10.7.9.0/24
I0503 07:03:59.263249 02618 hostgw.go:100] Watching for new subnet leases
注意,此处需要root权限,即
sudo
运行,否则,flannel无法添加路由信息。
可以看到,etcd为192.168.94.111
上的flannel分配的子网信息为:10.7.9.0/24
。
可在目录/run/flannel/networks/
看到生成了flannel_test.env文件:
$ ls /run/flannel/networks/
flannel_test.env
$ cat /run/flannel/networks/flannel_test.env
FLANNEL_NETWORK=10.7.0.0/16
FLANNEL_SUBNET=10.7.9.1/24
FLANNEL_MTU=1500
FLANNEL_IPMASQ=false
(2)配置docker daemon
设置环境变量:
$ source /run/flannel/networks/flannel_test.env
停止docker daemon(有多种方式,在此我使用直接结束docker daemon进程的方式):
$ sudo kill $(ps -ef|grep "docker daemon"|awk '{print $2}')
kill: can't kill pid 2968: No such process
重启docker daemon,配置docker0网桥:
$ sudo docker daemon --bip=${FLANNEL_SUBNET} --mtu=${FLANNEL_MTU}
注:如果此处启动docker daemon时有其他配置项请自行配置,比如镜像中心地址等等。
(3)启动一个容器,验证是否按配置的子网信息分配容器IP
$ docker run --rm -it busybox
/ # ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:0A:07:09:02
inet addr:10.7.9.2 Bcast:0.0.0.0 Mask:255.255.255.0
inet6 addr: fe80::42:aff:fe07:902/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:12 errors:0 dropped:0 overruns:0 frame:0
TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1016 (1016.0 B) TX bytes:508 (508.0 B)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
可看到,容器的IP地址为10.7.9.2
,正是子网内的IP地址。
192.168.94.114
主机上配置:
(1) 从etcd获取网络配置信息
$ sudo flanneld -etcd-endpoints=http://192.168.94.110:2379 -networks=flannel_test
I0503 07:44:21.638715 03268 main.go:275] Installing signal handlers
I0503 07:44:21.641335 03268 main.go:130] Determining IP address of default interface
I0503 07:44:21.642886 03268 main.go:188] Using 192.168.94.114 as external interface
I0503 07:44:21.643892 03268 main.go:189] Using 192.168.94.114 as external endpoint
I0503 07:44:21.652852 03268 etcd.go:204] Picking subnet in range 10.7.1.0 ... 10.7.255.0
I0503 07:44:21.662660 03268 etcd.go:84] Subnet lease acquired: 10.7.23.0/24
I0503 07:44:21.663136 03268 hostgw.go:100] Watching for new subnet leases
I0503 07:44:21.672256 03268 hostgw.go:140] Subnet added: 10.7.9.0/24 via 192.168.94.111
注意,此处需要root权限,即
sudo
运行,否则,flannel无法添加路由信息。
可以看到,etcd为192.168.94.114
上的flannel分配的子网信息为:10.7.23.0/24
。
可在目录/run/flannel/networks/
看到生成了flannel_test.env文件:
$ ls /run/flannel/networks/
flannel_test.env
$ cat /run/flannel/networks/flannel_test.env
FLANNEL_NETWORK=10.7.0.0/16
FLANNEL_SUBNET=10.7.23.1/24
FLANNEL_MTU=1500
FLANNEL_IPMASQ=false
并且,在最后一行,将192.168.94.111
上的子网信息也加入了flannel中,这样192.168.94.111
和192.168.94.114
的flannel网络已经连通,可正常通信。
Subnet added: 10.7.9.0/24 via 192.168.94.111
(2)配置docker daemon
设置环境变量:
$ source /run/flannel/networks/flannel_test.env
停止docker daemon(有多种方式,在此我使用直接结束docker daemon进程的方式):
$ sudo kill $(ps -ef|grep "docker daemon"|awk '{print $2}')
kill: can't kill pid 2968: No such process
重启docker daemon,配置docker0网桥:
$ sudo docker daemon --bip=${FLANNEL_SUBNET} --mtu=${FLANNEL_MTU}
注:如果此处启动docker daemon时有其他配置项请自行配置,比如镜像中心地址等等。
(3)启动一个容器,验证是否按配置的子网信息分配容器IP,并验证是否能和192.168.94.111
上的容器连通。
$ docker run --rm -it busybox
/ # ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:0A:07:17:02
inet addr:10.7.23.2 Bcast:0.0.0.0 Mask:255.255.255.0
inet6 addr: fe80::42:aff:fe07:1702/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:12 errors:0 dropped:0 overruns:0 frame:0
TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1016 (1016.0 B) TX bytes:508 (508.0 B)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
/ # ping 10.7.9.2
PING 10.7.9.2 (10.7.9.2): 56 data bytes
64 bytes from 10.7.9.2: seq=0 ttl=62 time=2.649 ms
64 bytes from 10.7.9.2: seq=1 ttl=62 time=0.918 ms
64 bytes from 10.7.9.2: seq=2 ttl=62 time=0.702 ms
64 bytes from 10.7.9.2: seq=3 ttl=62 time=0.666 ms
可看到,容器的IP地址为10.7.23.2
,正是子网内的IP地址。
并且,在容器内部ping 10.7.9.2
,ping通了192.168.94.111
上的容器。
至此flannel网络成功搭建,在主机192.168.94.111
和192.168.94.114
上运行的容器可成功互联互通。
使用flannel镜像
利用flannel镜像搭建网络与使用flannel可执行文件基本相同。不同之处就在于,将启动flannel可执行文件,改为启动flannel容器。
启动flannel容器命令如下:
docker run -it --restart=always -v /run/flannel/:/run/flannel --privileged --net=host --name=flannel registry.hundsun.com/flannel:0.5.5 /bin/bash -c "/opt/bin/flanneld -etcd-endpoints=http://192.168.94.110:2379 -networks=flannel_test"
注意:一定要加上
--privileged
参数,否则容器没有权限修改路由信息。 或使用docker-compose启动容器,docker-compose.yml文件内容如下:
version: '2'
flannel:
container_name: flannel
image: registry.hundsun.com/flannel:0.5.5
network_mode: "host"
restart: always
volumes:
- /run/flannel/:/run/flannel
command: /bin/bash -c "/opt/bin/flanneld -etcd-endpoints=http://192.168.94.110:2379 -networks=flannel_test"
privileged: true
其后,设置环境变量,配置并重启docker daemon,验证网络连通,与上面操作步骤相同,不再赘述。