使用

假设etcd部署在主机192.168.94.110:2379。另有两台主机192.168.94.111192.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.110ping通的主机上,执行下面的命令进行配置:

$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/16Backend类型为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.111192.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.111192.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,验证网络连通,与上面操作步骤相同,不再赘述。