手工實現docker的vxlan


前幾天了解了一下docker overlay的原理,然后一直想驗證一下自己的理解是否正確,今天模仿docker手工搭建了一個overlay網絡。先上拓撲圖,其實和上次畫的基本一樣。我下面提到的另一台機器是和下面拓撲圖配置方法一樣的一台機器,我就不重復畫了。

首先實現圖上紅線部分,這部分是訪問本機的container,主要涉及負載均衡(sandbox_1)和一個交換機(sandbox_2),不涉及overlay網絡。

  • 創建各個namespace和必要的veth
ip netns add sandbox_1
ip netns add sandbox_2
ip netns add container
ip link add pandora_bridge type bridge
ip addr add 172.18.0.1/16 dev pandora_bridge
ip link add veth100 type veth peer name veth101
ip link set veth100 master pandora_bridge
ip link set veth101 netns sandbox_1
ip link set pandora_bridge up
ip link set veth100 up
ip link add veth102 type veth peer name veth103
ip link set veth102 netns sandbox_1
ip link set veth103 netns sandbox_2
ip link add veth104 type veth peer name veth105
ip link set veth104 netns sandbox_2
ip link set veth105 netns container
  •  設置sandbox_1里的路由和負載均衡
ip netns exec sandbox_1 bash
ip addr add 172.18.0.2/16 dev veth101
ip addr add 10.0.0.2/24 dev veth102
ip route add default via 172.18.0.1
ip link set veth101 up
ip link set veth102 up
ipvsadm -A -t 172.18.0.2:80 -s rr
ipvsadm -a -t 172.18.0.2:80 -r 10.0.0.4 -m
iptables -t nat -I POSTROUTING -d 10.0.0.0/24 -m ipvs --ipvs -j SNAT --to-source 10.0.0.2
echo 1 >/proc/sys/net/ipv4/vs/conntrack   #這個地方困擾我很久
  •  設置sandbox_2里的交換機
ip netns exec sandbox_2 bash
ip link add edge_bridge type bridge
ip link set veth103 master edge_bridge
ip link set veth104 master edge_bridge
ip addr add 10.0.0.1/24 dev edge_bridge
ip link set edge_bridge up
ip link set veth103 up
ip link set veth104 up
  •  啟動容器
ip netns exec container bash
ip addr add 10.0.0.4/24 dev veth105
ip link set veth105 up
ip route add default via 10.0.0.1
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
  •  把外網口ens33的數據包轉到這個處理流程
iptables -t nat -I PREROUTING -d 192.168.228.148 -p tcp --dport 80 -j DNAT --to-destination 172.18.0.2

 上面這些步驟設置完整個紅色的流程就能走通了。我在設置的時候負載均衡那里數據包始終不走POSTROUTING鏈,沒法設置SNAT,浪費了不少時間,后來谷歌發現需要設置echo 1 >/proc/sys/net/ipv4/vs/conntrack,這個參數具體什么意思我還沒去查。其他設置都很好理解。

 

然后處理綠線的部分,這個是overlay最關鍵的地方

  • 創建vxlan並且加入交換機,注意這個vxlan一定要在namespace 1里創建然后挪到sandbox_2,而且這個proxy也很重要,因為我們需要vxlan的arp代理功能(和普通設備的arp代理不一樣),因為在overlay網絡里廣播非常耗資源,我們使用靜態arp和vxlan的arp代理處理arp請求。
ip link add vxlan0 type vxlan id 100 dstport 4789 proxy
ip link set vxlan0 netns sandbox_2
  •  在vxlan0設置靜態arp,這兩個mac地址是我另一台機器上container和sandbox_2里的設備
ip netns exec sandbox_2 bash
arp -i vxlan0 -s 10.0.0.12 1e:66:c0:a0:95:3f
arp -i vxlan0 -s 10.0.0.14 3a:7f:72:5b:5d:dd
  •  在vxlan0上設置轉發,告訴vxlan0那些數據包需要發給overlay的其他節點,這兩個mac地址和上面兩個對應,ip地址是另一台機器的ip地址
ip netns exec sandbox_2 bash
bridge fdb add 3a:7f:72:5b:5d:dd dev vxlan0 dst 192.168.228.149
bridge fdb add 1e:66:c0:a0:95:3f dev vxlan0 dst 192.168.228.149
  •  配置負載均衡,把部分流量轉到另一台機器
ipvsadm -a -t 172.18.0.2:80 -r 10.0.0.14:80 -m

到這里這台機器就配置好了。

 

另一台機器配置方法一樣,我就直接把命令貼出來了

ip netns add sandbox_1
ip netns add sandbox_2
ip netns add container
ip link add pandora_bridge type bridge
ip addr add 172.18.0.1/16 dev pandora_bridge
ip link add veth100 type veth peer name veth101
ip link set veth100 master pandora_bridge
ip link set veth101 netns sandbox_1
ip link set pandora_bridge up
ip link set veth100 up
ip link add veth102 type veth peer name veth103
ip link set veth102 netns sandbox_1
ip link set veth103 netns sandbox_2
ip link add veth104 type veth peer name veth105
ip link set veth104 netns sandbox_2
ip link set veth105 netns container
iptables -t nat -I PREROUTING -d 192.168.228.149 -p tcp --dport 80 -j DNAT --to-destination 172.18.0.2
ip link add vxlan0 type vxlan id 100 dstport 4789 proxy
ip link set vxlan0 netns sandbox_2

ip netns exec sandbox_1 bash
ip addr add 172.18.0.2/16 dev veth101
ip addr add 10.0.0.12/24 dev veth102
ip link set veth101 up
ip link set veth102 up
ip route add default via 172.18.0.1
ipvsadm -A -t 172.18.0.2:80 -s rr
ipvsadm -a -t 172.18.0.2:80 -r 10.0.0.14 -m
ipvsadm -a -t 172.18.0.2:80 -r 10.0.0.4 -m
iptables -t nat -I POSTROUTING -d 10.0.0.0/24 -m ipvs --ipvs -j SNAT --to-source 10.0.0.12
echo 1 >/proc/sys/net/ipv4/vs/conntrack

ip netns exec sandbox_2 bash
ip link add edge_bridge type bridge
ip link set veth103 master edge_bridge
ip link set veth104 master edge_bridge
ip addr add 10.0.0.11/24 dev edge_bridge
ip link set edge_bridge up
ip link set veth103 up
ip link set veth104 up
ip link set vxlan0 master edge_bridge
ip link set vxlan0 up
arp -i vxlan0 -s 10.0.0.4 2a:bb:1a:0f:2c:3a
arp -i vxlan0 -s 10.0.0.2 0e:a8:06:71:ca:cc
bridge fdb add 2a:bb:1a:0f:2c:3a dev vxlan0 dst 192.168.228.148
bridge fdb add 0e:a8:06:71:ca:cc dev vxlan0 dst 192.168.228.148

ip netns exec container bash
ip addr add 10.0.0.14/24 dev veth105
ip link set veth105 up
ip route add default via 10.0.0.11
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM