您的位置:首页 > 运维架构 > Docker

Docker网络解决方案-Flannel

2015-04-17 23:16 399 查看
以下是解释(转载他人):

名词解释

覆盖网络: overlay networks,运行在一个网上的网(应用层网络),并不依靠ip地址来传递消息,而是采用一种映射机制,把ip地址和identifiers做映射来资源定位。

原理

每个主机配置一个ip段和子网个数。例如,可以配置一个覆盖网络使用
10.100.0.0/16段,每个主机/24个子网。因此主机a可以接受10.100.5.0/24,主机B可以接受10.100.18.0/24的
包。flannel使用etcd来维护分配的子网到实际的ip地址之间的映射。对于数据路径,flannel
使用udp来封装ip数据报,转发到远程主机。选择UDP作为转发协议是因为他能穿透防火墙。例如,AWS Classic无法转发IPoIP or
GRE 网络包,是因为它的安全组仅仅支持TCP/UDP/ICMP。
下图解释了数据报通过覆盖网络转发的路线:



技术细节

flannel 使用etcd存储配置数据和子网分配信息。flannel 启动之后,后台进程首先检索配置和正在使用的子网列表,然后选择一个可用的子网,然后尝试去注册它。
etcd也存储这个每个主机对应的ip。flannel 使用etcd的watch机制监视
/coreos.com/network/subnets
下面所有元素的变化信息,并且根据他来维护一个路由表。为了提高性能,flannel优化了Universal TAP/TUN设备,对TUN和UDP之间的ip分片做了代理。

部署:
环境说明:
一共2台主机,etcd服务放到第一台服务器。 ----首先先关闭docker服务

(1)下载文件
host1:
curl -L  https://github.com/coreos/etcd/releases/download/v2.0.9/etcd-v2.0.9-linux-amd64.tar.gz -o etcd-v2.0.9-linux-amd64.tar.gz
git clone
apt-get install linux-libc-dev
cd flannel; ./build
host2:
git clone
apt-get install linux-libc-dev
cd flannel; ./build
(2)配置
host1:
tar -zxvf etcd-v2.0.9-linux-amd64.tar.gz
cd etcd-v2.0.9-linux-amd64/
./etcd --listen-client-urls=http://0.0.0.0:4001 --listen-peer-urls=http://0.0.0.0:7001 &
./etcdctl mk /coreos.com/network/config '{"Network":"192.168.0.0/16"}'
(3)启动flannel
host1:
ip link set dev docker0 down
brctl delbr docker0
cd flannel/bin/
./flanneld -iface=eth0 &
source /run/flannel/subnet.env
docker -d --bip=${FLANNEL_SUBNET} --mtu=${FLANNEL_MTU} &
host2:
ip link set dev docker0 down
brctl delbr docker0
cd flannel/bin/
./flanneld -etcd-endpoints=http://host1_ip:4001 -iface=eth0 &
source /run/flannel/subnet.env
docker -d --bip=${FLANNEL_SUBNET} --mtu=${FLANNEL_MTU} &
(4)测试,host1,host2各自启动一个docker,测试连通性
host1:

docker run -t -i --name=peer ubuntu:12.04
root@1b8d4381a351:/# ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 02:42:0a:00:1b:05
inet addr:192.168.16.3  Bcast:0.0.0.0  Mask:255.255.255.0
inet6 addr: fe80::42:aff:fe00:1b05/64 Scope:Link
UP BROADCAST RUNNING  MTU:1472  Metric:1
RX packets:21 errors:0 dropped:0 overruns:0 frame:0
TX packets:16 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1618 (1.6 KB)  TX bytes:1096 (1.0 KB)
host2:

docker run -t -i --name=peer ubuntu:12.04
root@2413381a351:/# ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 02:42:0a:00:1b:05
inet addr:192.168.33.3  Bcast:0.0.0.0  Mask:255.255.255.0
inet6 addr: fe80::42:aff:fe00:1b05/64 Scope:Link
UP BROADCAST RUNNING  MTU:1472  Metric:1
RX packets:21 errors:0 dropped:0 overruns:0 frame:0
TX packets:16 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1618 (1.6 KB)  TX bytes:1096 (1.0 KB)


root@1b8d4381a351:/# ping 192.168.33.3
PING 192.168.33.3 (192.168.33.3) 56(84) bytes of data.
64 bytes from 192.168.33.3: icmp_seq=1 ttl=64 time=0.100 ms
64 bytes from 192.168.33.3: icmp_seq=2 ttl=64 time=0.092 ms
64 bytes from 192.168.33.3: icmp_seq=3 ttl=64 time=0.143 ms


这样跨主机容器间网络就能通啦

本文出自 “TNT、运维之路” 博客,请务必保留此出处http://tntdba.blog.51cto.com/1199791/1634722
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: