使用通道,在不同的节点部署虚拟2层网络
我们可以通过使用TAG来跨节点组件2层网络,但是根据协议来说,VLAN的TAG最多只能定12个bit长度的(VID):
16 bits | 3 bits | 1 bit | 12 bits |
---|---|---|---|
TPID | PCP | CFI | VID |
当环境中的需要需要的vlan的TAG多于4096的时候就会出现问题,因此需要用其他的解决方案。
参照GRE的文档https://tools.ietf.org/html/rfc2890,使用其中的KEY作为标记,32位的长度就使得我们有足够的标记用来使用。
注:本文是一个简单的模型,并没有做成生产环境的模型,下一节我们将首先分析一个生产环境中的例子,并模拟该生产环境。
首先我们使用TAG创建跨节点的2层网络
此时我们需要两台物理机,在此我使用一台物理机和一台虚拟机来进行模拟的,约定为物理机A(server_1, ip: 10.180.66.3)和物理机B(servier_2,ip:10.180.64.184)
首先我们先初始化server_1中模拟环境
(server_1)(使用上一节说的脚本)
# ./init_vms
+ ovs-vsctl add-br br-int
+ ip netns add vm_a_1
+ ip netns add vm_a_2
+ ip netns add vm_b_1
+ ip netns add vm_b_2
+ ovs-vsctl add-port br-int vm_a_1 -- set interface vm_a_1 type=internal
+ ovs-vsctl add-port br-int vm_a_2 -- set interface vm_a_2 type=internal
+ ovs-vsctl add-port br-int vm_b_1 -- set interface vm_b_1 type=internal
+ ovs-vsctl add-port br-int vm_b_2 -- set interface vm_b_2 type=internal
+ ip link set vm_a_1 netns vm_a_1
+ ip link set vm_a_2 netns vm_a_2
+ ip link set vm_b_1 netns vm_b_1
+ ip link set vm_b_2 netns vm_b_2
+ ip netns exec vm_a_1 ifconfig vm_a_1 up
+ ip netns exec vm_a_2 ifconfig vm_a_2 up
+ ip netns exec vm_b_1 ifconfig vm_b_1 up
+ ip netns exec vm_b_2 ifconfig vm_b_2 up
root@www /home/abaobo/tmp 2015-08-17 19:28:45
# ip netns exec vm_a_1 ip a a 10.1.0.1/24 dev vm_a_1
root@www /home/abaobo/tmp 2015-08-17 19:29:50
# ip netns exec vm_a_2 ip a a 10.1.0.2/24 dev vm_a_2
root@www /home/abaobo/tmp 2015-08-17 19:30:00
# ip netns exec vm_b_2 ip a a 10.1.0.12/24 dev vm_b_2
root@www /home/abaobo/tmp 2015-08-17 19:30:10
# ip netns exec vm_b_1 ip a a 10.1.0.11/24 dev vm_b_1
ovs-vsctl add-port br-int gre_tun -- set interface gre_tun type=gre options:remote_ip=10.180.64.184
接下来我们初始化server_2中模拟环境
(server_2)(在此我们只初始化两个模拟)
# ./init_vm
+ ovs-vsctl add-br br-int
+ ip netns add vm_a_1
+ ip netns add vm_b_1
+ ovs-vsctl add-port br-int vm_a_1 -- set interface vm_a_1 type=internal
+ ovs-vsctl add-port br-int vm_b_1 -- set interface vm_b_1 type=internal
+ ip link set vm_a_1 netns vm_a_1
+ ip link set vm_b_1 netns vm_b_1
+ ip netns exec vm_a_1 ifconfig vm_a_1 up
+ ip netns exec vm_b_1 ifconfig vm_b_1 up
root@cnsdev-network-dca5999d-f2e4-4cec-80ac-1e673baa3b90 ~/tmp 19:31:16
# ip netns exec vm_a_1 ip a a 10.1.0.101/24 dev vm_a_1
root@cnsdev-network-dca5999d-f2e4-4cec-80ac-1e673baa3b90 ~/tmp 19:31:46
# ip netns exec vm_b_1 ip a a 10.1.0.111/24 dev vm_b_1
root@cnsdev-network-dca5999d-f2e4-4cec-80ac-1e673baa3b90 ~/tmp 19:32:09
# ovs-vsctl add-port br-int gre_tun -- set interface gre_tun type=gre options:remote_ip=10.180.66.3
此时我们已经初始化完我们需要的环境,在server_1中的vm_a_1(10.1.0.1)的网络环境中ping宿主物理机server_2的vm_a_1(10.1.0.101):
root@www /home/abaobo/tmp 2015-08-17 20:27:24
# ip netns exec vm_a_2 ping 10.1.0.101 -c 1
PING 10.1.0.101 (10.1.0.101) 56(84) bytes of data.
64 bytes from 10.1.0.101: icmp_seq=1 ttl=64 time=3.02 ms
--- 10.1.0.101 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 3.027/3.027/3.027/0.000 ms
此时我们已经满足了跨节点组件2层网络的目的,根据上面的vlan的TAG格式我们可以看出,该TAG只有12个bit的长度,也就是说整个环境中只允许存在不超过4096个2层隔离网络,对于云计算来说,这个远远不能满足我们的需求。
使用带标记的tunnel来跨物理节点组建隔离的2层网络。
本文章我们主要讲述通过使用GRE通道方式组建,参见技术资料:
- 原GRE,https://tools.ietf.org/html/rfc2784,
- 带扩展包头的GRE,https://tools.ietf.org/html/rfc2890,
在扩展的GRE包头格式资料,从中我们可以看出,扩展的包头多了一个key和一个Sequence,长度都为为32bit,在此我们使用的是key来标记分区分不同网络的,32 位的长度几乎为我们地球上的每一个人创建一个私有网络,足够了。
接下来我们来尝试组建一个这样的网络,
- 1, 上面的基础上,分别再两个server上,我们把用户A的所有虚拟机使用tag打上标签1,把所有的用户B的虚拟机打上标签2。
(server_1)
root@www /home/abaobo/tmp 2015-08-17 20:49:19
# ovs-vsctl set port vm_a_1 tag=1 -- set port vm_a_2 tag=1
root@www /home/abaobo/tmp 2015-08-18 09:20:19
# ovs-vsctl set port vm_b_1 tag=2 -- set port vm_b_2 tag=2
root@www /home/abaobo/tmp 2015-08-18 09:20:34
#
(server_2)
root@cnsdev-network-dca5999d-f2e4-4cec-80ac-1e673baa3b90 ~/tmp 20:26:31
# ovs-vsctl set port vm_a_1 tag=1
root@cnsdev-network-dca5999d-f2e4-4cec-80ac-1e673baa3b90 ~/tmp 09:20:50
# ovs-vsctl set port vm_b_1 tag=2
root@cnsdev-network-dca5999d-f2e4-4cec-80ac-1e673baa3b90 ~/tmp 09:20:58
#
然后我们在server_1上用vm_a_1分别ping,server_1的vm_a_2和server_2的vm_a_1
(server_1)
root@cnsdev-network-dc