SDN控制器之OVN实验二:使用OVN配置路由器

概览

基于我上一篇文章中的实验环境,我现在将第三层网络基础功能添加到OVN中。最终呈现出来的将是由逻辑路由器连接的一对逻辑交换机。另外,路由器将被配置为通过OVN中内置的DHCP服务来提供IP地址。

重构逻辑组件

由于设置开始变得更加复杂,我们将重新构建网络架构。新的逻辑网络拓扑如下:

  • 2台逻辑交换机 switches: "dmz"和"inside"

  • 逻辑路由器"tenant1",它连接着两个逻辑交换机

  • IP网络"dmz" :172.16.255.128/26

  • IP网络"inside":172.16.255.192/26

  • 每个逻辑交换机上各有一对"虚拟机"

新的逻辑网络如下图所示

理解路由

在本次实验中,我们将创建一个OVN路由器,即"分布式逻辑路由器"(DLR)。 DLR不同于传统路由器,因为它不是实际的设备,而是逻辑结构(与逻辑交换机不同)。 DLR仅作为OVS中的一个功能而存在:换句话说,每个OVS实例能够在overlay网络转发流量之前先在本地模拟出一个三层路由器。

创建逻辑交换机和逻辑路由器

在ubuntu1上定义逻辑交换机:

  1. ovn-nbctl ls-add inside

  2. ovn-nbctl ls-add dmz

  3. 添加逻辑路由器及其关联的路由器和交换机端口:

  4. # 添加路由器tenant1

  5. ovn-nbctl lr-add tenant1

  6.  
  7. # 为路由器tenant1创建一个连接到dmz交换机的端口

  8. ovn-nbctl lrp-add tenant1 tenant1-dmz 02:ac:10:ff:01:29 172.16.255.129/26

  9.  
  10. # 为dmz交换机创建用于连接到路由器tenant1的端口dmz-tenant1

  11. ovn-nbctl lsp-add dmz dmz-tenant1

  12. ovn-nbctl lsp-set-type dmz-tenant1 router

  13. ovn-nbctl lsp-set-addresses dmz-tenant1 02:ac:10:ff:01:29

  14. ovn-nbctl lsp-set-options dmz-tenant1 router-port=tenant1-dmz

  15.  
  16. #为路由器tenant1创建一个连接到inside交换机的端口

  17. ovn-nbctl lrp-add tenant1 tenant1-inside 02:ac:10:ff:01:93 172.16.255.193/26

  18.  
  19. #为inside交换机创建用于连接到路由器tenant1的端口inside-tenant1

  20. ovn-nbctl lsp-add inside inside-tenant1

  21. ovn-nbctl lsp-set-type inside-tenant1 router

  22. ovn-nbctl lsp-set-addresses inside-tenant1 02:ac:10:ff:01:93

  23. ovn-nbctl lsp-set-options inside-tenant1 router-port=tenant1-inside

  24.  
  25. ovn-nbctl show

添加 DHCP

OVN中的DHCP与大多数的解决方案有点不同。大多数人的想法是管理员将:

1.给定子网定义一组DHCP选项

2.创建逻辑交换机端口,给该端口定义MAC地址和IP地址

3.为该端口分配DHCP选项。

4.将端口安全设置为仅允许分配的地址

下面,我们将要给4台虚拟机配置逻辑端口。在ubuntu1上:

  1. ovn-nbctl lsp-add dmz dmz-vm1

  2. ovn-nbctl lsp-set-addresses dmz-vm1 "02:ac:10:ff:01:30 172.16.255.130"

  3. ovn-nbctl lsp-set-port-security dmz-vm1 "02:ac:10:ff:01:30 172.16.255.130"

  4.  
  5. ovn-nbctl lsp-add dmz dmz-vm2

  6. ovn-nbctl lsp-set-addresses dmz-vm2 "02:ac:10:ff:01:31 172.16.255.131"

  7. ovn-nbctl lsp-set-port-security dmz-vm2 "02:ac:10:ff:01:31 172.16.255.131"

  8.  
  9. ovn-nbctl lsp-add inside inside-vm3

  10. ovn-nbctl lsp-set-addresses inside-vm3 "02:ac:10:ff:01:94 172.16.255.194"

  11. ovn-nbctl lsp-set-port-security inside-vm3 "02:ac:10:ff:01:94 172.16.255.194"

  12.  
  13. ovn-nbctl lsp-add inside inside-vm4

  14. ovn-nbctl lsp-set-addresses inside-vm4 "02:ac:10:ff:01:95 172.16.255.195"

  15. ovn-nbctl lsp-set-port-security inside-vm4 "02:ac:10:ff:01:95 172.16.255.195"

  16.  
  17. ovn-nbctl show

您可能已经注意到,与上一个实验不同,现在通过一条命令就能定义mac和IP地址。 IP地址定义实现了我们的2个目的:
1.它通过允许OVN在本地应答其知道的IP / MAC的ARP请求来实现ARP抑制。
2.从哪个端口收到到DHCP请求,就会从哪个接口分配IP地址。通过这种方式来实现DHCP。

接下来,我们需要定义DHCP选项并将它们分配给逻辑端口。这里的过程将与我们以前看到的有点不同,因为我们将直接与OVN NB数据库进行交互。用这种方式的原因是需要捕获我们创建的DHCP_Options条目的UUID,以便我们可以将UUID分配给交换机端口。为此,我们将把捕获的ovn-nbctl命令的结果输出到一对bash变量中。

  1. dmzDhcp="$(ovn-nbctl create DHCP_Options cidr=172.16.255.128/26 \

  2. options="\"server_id\"=\"172.16.255.129\" \"server_mac\"=\"02:ac:10:ff:01:29\" \

  3. \"lease_time\"=\"3600\" \"router\"=\"172.16.255.129\"")"

  4. echo $dmzDhcp

  5.  
  6. insideDhcp="$(ovn-nbctl create DHCP_Options cidr=172.16.255.192/26 \

  7. options="\"server_id\"=\"172.16.255.193\" \"server_mac\"=\"02:ac:10:ff:01:93\" \

  8. \"lease_time\"=\"3600\" \"router\"=\"172.16.255.193\"")"

  9. echo $insideDhcp

  10.  
  11. ovn-nbctl dhcp-options-list

如果您想了解有关OVN NB数据库的更多信息,请参阅ovn-nb的手册(译者注:http://openvswitch.org/support/dist-docs/ovn-nb.5.pdf)。

现在,我们将使用存储在变量中的UUID为我们的逻辑交换机端口分配DHCP_Options。

  1. ovn-nbctl lsp-set-dhcpv4-options dmz-vm1 $dmzDhcp

  2. ovn-nbctl lsp-get-dhcpv4-options dmz-vm1

  3.  
  4. ovn-nbctl lsp-set-dhcpv4-options dmz-vm2 $dmzDhcp

  5. ovn-nbctl lsp-get-dhcpv4-options dmz-vm2

  6.  
  7. ovn-nbctl lsp-set-dhcpv4-options inside-vm3 $insideDhcp

  8. ovn-nbctl lsp-get-dhcpv4-options inside-vm3

  9.  
  10. ovn-nbctl lsp-set-dhcpv4-options inside-vm4 $insideDhcp

  11. ovn-nbctl lsp-get-dhcpv4-options inside-vm4

配置虚拟机

与上一个实验一样,我们将使用OVS内部端口和网络命名空间构建的"伪虚拟机"。现在的区别是,我们将使用DHCP进行地址分配。

接下来我们将设置虚拟机。

ubuntu2:

  1. ip netns add vm1

  2. ovs-vsctl add-port br-int vm1 -- set interface vm1 type=internal

  3. ip link set vm1 address 02:ac:10:ff:01:30

  4. ip link set vm1 netns vm1

  5. ovs-vsctl set Interface vm1 external_ids:iface-id=dmz-vm1

  6. ip netns exec vm1 dhclient vm1

  7. ip netns exec vm1 ip addr show vm1

  8. ip netns exec vm1 ip route show

  9.  
  10. ip netns add vm3

  11. ovs-vsctl add-port br-int vm3 -- set interface vm3 type=internal

  12. ip link set vm3 address 02:ac:10:ff:01:94

  13. ip link set vm3 netns vm3

  14. ovs-vsctl set Interface vm3 external_ids:iface-id=inside-vm3

  15. ip netns exec vm3 dhclient vm3

  16. ip netns exec vm3 ip addr show vm3

  17. ip netns exec vm3 ip route show

  18. On ubuntu3:

  19. ip netns add vm2

  20. ovs-vsctl add-port br-int vm2 -- set interface vm2 type=internal

  21. ip link set vm2 address 02:ac:10:ff:01:31

  22. ip link set vm2 netns vm2

  23. ovs-vsctl set Interface vm2 external_ids:iface-id=dmz-vm2

  24. ip netns exec vm2 dhclient vm2

  25. ip netns exec vm2 ip addr show vm2

  26. ip netns exec vm2 ip route show

  27.  
  28. ip netns add vm4

  29. ovs-vsctl add-port br-int vm4 -- set interface vm4 type=internal

  30. ip link set vm4 address 02:ac:10:ff:01:95

  31. ip link set vm4 netns vm4

  32. ovs-vsctl set Interface vm4 external_ids:iface-id=inside-vm4

  33. ip netns exec vm4 dhclient vm4

  34. ip netns exec vm4 ip addr show vm4

  35. ip netns exec vm4 ip route show

测试网络连通性

在ubuntu2上,从vm1测试网络连通性:

  1. # ping vm1的默认网关

  2. root@ubuntu2:~# ip netns exec vm1 ping 172.16.255.129

  3. PING 172.16.255.129 (172.16.255.129) 56(84) bytes of data.

  4. 64 bytes from 172.16.255.129: icmp_seq=1 ttl=254 time=0.689 ms

  5. 64 bytes from 172.16.255.129: icmp_seq=2 ttl=254 time=0.393 ms

  6. 64 bytes from 172.16.255.129: icmp_seq=3 ttl=254 time=0.483 ms

  7.  
  8. # 从 overlay网络ping vm2(跨越整个 tenant1)

  9. root@ubuntu2:~# ip netns exec vm1 ping 172.16.255.131

  10. PING 172.16.255.131 (172.16.255.131) 56(84) bytes of data.

  11. 64 bytes from 172.16.255.131: icmp_seq=1 ttl=64 time=2.16 ms

  12. 64 bytes from 172.16.255.131: icmp_seq=2 ttl=64 time=0.573 ms

  13. 64 bytes from 172.16.255.131: icmp_seq=3 ttl=64 time=0.446 ms

  14.  
  15. # 经过 router ping通 vm3(跨越整个 overlay网络)

  16. root@ubuntu2:~# ip netns exec vm1 ping 172.16.255.194

  17. PING 172.16.255.194 (172.16.255.194) 56(84) bytes of data.

  18. 64 bytes from 172.16.255.194: icmp_seq=1 ttl=63 time=1.37 ms

  19. 64 bytes from 172.16.255.194: icmp_seq=2 ttl=63 time=0.077 ms

  20. 64 bytes from 172.16.255.194: icmp_seq=3 ttl=63 time=0.076 ms

  21.  
  22. #经过 router ping 通vm4(跨越整个 overlay网络)

  23. root@ubuntu2:~# ip netns exec vm1 ping 172.16.255.195

  24. PING 172.16.255.195 (172.16.255.195) 56(84) bytes of data.

  25. 64 bytes from 172.16.255.195: icmp_seq=1 ttl=63 time=1.79 ms

  26. 64 bytes from 172.16.255.195: icmp_seq=2 ttl=63 time=0.605 ms

  27. 64 bytes from 172.16.255.195: icmp_seq=3 ttl=63 time=0.503 ms

结语

OVN使得第三层overlay网络易于部署和管理。 另外像DHCP的服务直接构建到系统中的方式,有助于减少构建有效的SDN解决方案所需的外部组件的数量。 在下一篇文章中,将讨论如何将我们(当前隔离的)overlay网络连接到外部世界。

原文:https://blog.csdn.net/zhengmx100/article/details/58137383?utm_source=blogxgwz0

猜你喜欢

转载自blog.csdn.net/qq_42196196/article/details/83064932