以下是解釋(轉載他人):
名詞解釋
覆蓋網絡: 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
這樣跨主機容器間網絡就能通啦