STEP BY STEP创建大二层网络
STEP BY STEP创建大二层网络
背景
在一个客户项目中,需要在两台物理主机上创建多台虚机,并且保证这些虚机都在同一个二层网络里。
因为当时还不清楚具体的客户需求,所以我们一方面和售前交流获取具体用户需求的信息,比如两台物理机的位置,他们的网络连接情况等等。与此同时,我们也准备了两套方案来应备可能的情况。
最终的情况比我们想象的要简单,两个物理宿机本身就在同一个二层网络里面,而且有外部的DHCP服务可以使用。使用一个简单的FLAT网络模型就可以满足客户的需求。
在我们准备的另外一套方案里面,可以满足两台物理宿机在不同的地点,只能三层可达,而且DHCP服务也需要我们自行解决的需求。
现在通过一个实验和大家分享一下我们的预备方案,顺便也理解一下如何使用openvswitch通过vxlan协议构建overlay 网络解决在不同的数据中心的主机上创建同一个二层的网络这一问题。
实验描述
我们将试图构建下面的二层网络。VM1和VM2是我们模拟的处于同一个二层的虚拟主机。这两个虚拟主机所在的宿主主机分别位于我们研发北京的实验室和阿里云杭州数据中心的一台虚机。这两台宿主机通过Internet可以互访。
这两个虚机VM1和VM2的IP地址都是通过左边的研发北京实验室宿主机上面的dhcp服务获得的同一网段的地址。最终,VM1和VM2获得同一网段IP地址,并且可以互通。
实验步骤
为了安全起见,我们隐藏了宿主机真实的IP信息。
在研发北京实验室主机上
a) 使用openvswitch 创建交换机 br0
ovs-vsctl add-br br0
b) 在上述的br0上创建一个vlan100的内部接口qdhcp用来连接dhcp服务进程,启动dhcp服务
1.ovs-vsctl add-port br0 qdhcp -- set interface qdhcp type=internal
ovs-vsctl set port qdhcp tag=100
2.启动qdhcp接口并且 设置IP地址
ip link set dev qdhcp up
ip addr add 172.17.0.1/24 dev qdhcp
3.启动dnsmasq进程绑定上述创建的qdhcp接口,并且指定通过它分配的IP地址范围
dnsmasq --strict-order --bind-interfaces --interface=qdhcp --except-interface=lo --leasefile-ro --dhcp- range=172.17.0.2,172.17.0.254,255.255.255.0,12h --conf-file=
c) 使用netnamespace来模拟和创建VM1
1. 创建VM1
ip netns add VM1
2. 创建veth pair虚拟接口用来连接VM1和openvswitch的交换机br0
ip link add veth0 type veth peer name veth1
3. 把上述创建的veth pair虚拟接口的一端veth0连接到br0上,并且设置vlan为100
ovs-vsctl add-port br0 veth0
ip link set dev veth0 up
ovs-vsctl set port veth0 tag=100
4. 把上述创建的veth pair虚拟接口的一端veth1连接到VM1上,并且通过dhclient使得veth1接口获得ip地址。
ip link set veth1 netns VM1
ip netns exec VM1 ip link set dev veth1 up
ip netns exec VM1 dhclient -i veth1
至此,我们可以看到VM1的接口veth1已经通过本机的dnsmasq获得IP地址172.17.0.254
d) 创建openvswitch br0的vxlan接口
1. 指定接口的另外一端是的位于杭州阿里云的另外一台主机的ip地址121.43.*.*。指定key为12345,这个key将会被用作 vxlan协议的vni。
ovs-vsctl add-port br0 vxlan -- set interface vxlan type=vxlan options:remote_ip=121.43.*.* options:key=12345
121.43.*.* (需要用真实的IP代替)
2. 设置这个vxlan接口为trunk模式。
ovs-vsctl set port vxlan vlan_mode=trunk
在杭州阿里云的主机上
a) 使用openvswitch 创建交换机 br0
ovs-vsctl add-br br0
b) 使用netnamespace来模拟和创建VM2
1. 创建VM2
ip netns add VM2
2. 创建veth pair虚拟接口用来连接VM2和openvswitch的交换机br0
ip link add veth0 type veth peer name veth1
3. 把上述创建的veth pair虚拟接口的一端veth0连接到br0上,并且设置vlan为100
ovs-vsctl add-port br0 veth0
ip link set dev veth0 up
ovs-vsctl set port veth0 tag=100
4. 把上述创建的veth pair虚拟接口的一端veth1连接到VM2上,并且通过dhclient使得veth1接口获得ip地址。
ip link set veth1 netns VM2
ip netns exec VM2 ip link set dev veth1 up
ip netns exec VM2 dhclient -i veth1
至此,我们可以看到VM2的接口veth1已经通过研发北京实验室主机上的dnsmasq服务获得IP地址172.17.0.18
c) 创建openvswitch br0的vxlan接口
1. 指定接口的另外一端是的位于研发 北京实验室的另外一台主机的ip地址183.84.*.*。指定key为12345,这个key将会被用作vxlan协议的vni。
ovs-vsctl add-port br0 vxlan -- set interface vxlan type=vxlan options:remote_ip=183.84.*.* options:key=12345
183.84.*.* (需要用真实的IP代替)
2. 设置这个vxlan接口为trunk模式
ovs-vsctl set port vxlan vlan_mode=trunk
连通性测试
a) 在研发北京实验室主机上测试VM1到VM2的连通性
ip netns exec VM1 ping 172.17.0.18
ping 172.17.0.18
PING 172.17.0.18 (172.17.0.18): 56 data bytes
64 bytes from 172.17.0.18: icmp_seq=0 ttl=53 time=18.756 ms
64 bytes from 172.17.0.18: icmp_seq=1 ttl=53 time=12.976 ms
^C
--- 172.17.0.18ping statistics ---
2 packets transmitted, 2 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 12.976/15.866/18.756/2.890 ms
b) 在杭州阿里云的主机上测试VM2到VM1的连通性
ip netns exec VM2 ping 172.17.0.254
ping 172.17.0.254
PING 172.17.0.18 (172.17.0.254): 56 data bytes
64 bytes from 172.17.0.254: icmp_seq=0 ttl=53 time=18.756 ms
64 bytes from 172.17.0.254: icmp_seq=1 ttl=53 time=12.976 ms
^C
--- 172.17.0.18ping statistics ---
2 packets transmitted, 2 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 12.976/15.866/18.756/2.890 ms
c) 通过分别在北京和杭州两台主机上使用tcpdump抓包,我们可以很清楚的看到icmp报文是如何被封装成vxlan报文进行传递的