Docker網絡解決方案-Flannel

以下是解釋(轉載他人):

名詞解釋

覆蓋網絡: 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。
下圖解釋了數據報通過覆蓋網絡轉發的路線:

packet-01.png

技術細節

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


這樣跨主機容器間網絡就能通啦

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章