Notice: Constant WP_DEBUG already defined in /var/www/html/wordpress/wp-content/plugins/changyan/sohuchangyan.php on line 12

Notice: Constant WP_DEBUG_LOG already defined in /var/www/html/wordpress/wp-content/plugins/changyan/sohuchangyan.php on line 13

Notice: Constant WP_DEBUG_DISPLAY already defined in /var/www/html/wordpress/wp-content/plugins/changyan/sohuchangyan.php on line 14
如何配置OVN路由器?【zoues.com】 – zoues

LOADING

Follow me

如何配置OVN路由器?【zoues.com】
五月 11, 2017|ITPaaSSDN

如何配置OVN路由器?【zoues.com】

如何配置OVN路由器?【zoues.com】

译者简介:郑敏先,就职于诺云系统(上海)有限公司。工作地点为南京的诺云研发中心。担任解决方案工程师。 本人博客为:http://blog.csdn.net/zhengmx100

原文链接:http://blog.spinhirne.com/2016/09/an-introduction-to-ovn-routing.html

概览

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

重构逻辑组件

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

  • 2 台逻辑交换机 switches: “dmz” 和“inside”
  • 逻辑路由器“tenant1”,它连接着两个逻辑交换机
  • IP网络“dmz” :172.16.255.128/26
  • IP网络“inside”:172.16.255.192/26
  • 每个逻辑交换机上各有一对“虚拟机”

新的逻辑网络如下图所示
如何配置OVN路由器?

理解路由

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

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

在ubuntu1上定义逻辑交换机:

Java

1
2
ovnnbctl lsadd inside
ovnnbctl lsadd dmz

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

Java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 添加路由器tenant1
ovnnbctl lradd tenant1
 
# 为路由器tenant1创建一个连接到dmz交换机的端口
ovnnbctl lrpadd tenant1 tenant1dmz 02:ac:10:ff:01:29 172.16.255.129/26
 
# dmz交换机创建用于连接到路由器tenant1的端口dmztenant1
ovnnbctl lspadd dmz dmztenant1
ovnnbctl lspsettype dmztenant1 router
ovnnbctl lspsetaddresses dmztenant1 02:ac:10:ff:01:29
ovnnbctl lspsetoptions dmztenant1 routerport=tenant1dmz
 
#为路由器tenant1创建一个连接到inside交换机的端口
ovnnbctl lrpadd tenant1 tenant1inside 02:ac:10:ff:01:93 172.16.255.193/26
 
#inside交换机创建用于连接到路由器tenant1的端口insidetenant1
ovnnbctl lspadd inside insidetenant1
ovnnbctl lspsettype insidetenant1 router
ovnnbctl lspsetaddresses insidetenant1 02:ac:10:ff:01:93
ovnnbctl lspsetoptions insidetenant1 routerport=tenant1inside
 
ovnnbctl show

添加 DHCP

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

1.给定子网定义一组DHCP选项
2.创建逻辑交换机端口,给该端口定义MAC地址和IP地址
3.为该端口分配DHCP选项。
4.将端口安全设置为仅允许分配的地址

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

Java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
ovnnbctl lspadd dmz dmzvm1
ovnnbctl lspsetaddresses dmzvm1 “02:ac:10:ff:01:30 172.16.255.130”
ovnnbctl lspsetportsecurity dmzvm1 “02:ac:10:ff:01:30 172.16.255.130”
 
ovnnbctl lspadd dmz dmzvm2
ovnnbctl lspsetaddresses dmzvm2 “02:ac:10:ff:01:31 172.16.255.131”
ovnnbctl lspsetportsecurity dmzvm2 “02:ac:10:ff:01:31 172.16.255.131”
 
ovnnbctl lspadd inside insidevm3
ovnnbctl lspsetaddresses insidevm3 “02:ac:10:ff:01:94 172.16.255.194”
ovnnbctl lspsetportsecurity insidevm3 “02:ac:10:ff:01:94 172.16.255.194”
 
ovnnbctl lspadd inside insidevm4
ovnnbctl lspsetaddresses insidevm4 “02:ac:10:ff:01:95 172.16.255.195”
ovnnbctl lspsetportsecurity insidevm4 “02:ac:10:ff:01:95 172.16.255.195”
 
ovnnbctl 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变量中。

Java

1
2
3
4
5
6
7
8
9
10
11
dmzDhcp=“$(ovn-nbctl create DHCP_Options cidr=172.16.255.128/26 /
options=”/server_id/=/172.16.255.129/ /server_mac/=/02:ac:10:ff:01:29/ /
/lease_time/=/3600/ /router/=/172.16.255.129/“)”
echo $dmzDhcp
 
insideDhcp=“$(ovn-nbctl create DHCP_Options cidr=172.16.255.192/26 /
options=”/server_id/=/172.16.255.193/ /server_mac/=/02:ac:10:ff:01:93/ /
/lease_time/=/3600/ /router/=/172.16.255.193/“)”
echo $insideDhcp
 
ovnnbctl dhcpoptionslist

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

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

Java

1
2
3
4
5
6
7
8
9
10
11
ovnnbctl lspsetdhcpv4options dmzvm1 $dmzDhcp
ovnnbctl lspgetdhcpv4options dmzvm1
 
ovnnbctl lspsetdhcpv4options dmzvm2 $dmzDhcp
ovnnbctl lspgetdhcpv4options dmzvm2
 
ovnnbctl lspsetdhcpv4options insidevm3 $insideDhcp
ovnnbctl lspgetdhcpv4options insidevm3
 
ovnnbctl lspsetdhcpv4options insidevm4 $insideDhcp
ovnnbctl lspgetdhcpv4options insidevm4

配置虚拟机

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

接下来我们将设置虚拟机。
在ubuntu2上:

Java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
ip netns add vm1
ovsvsctl addport brint vm1 set interface vm1 type=internal
ip link set vm1 address 02:ac:10:ff:01:30
ip link set vm1 netns vm1
ovsvsctl set Interface vm1 external_ids:ifaceid=dmzvm1
ip netns exec vm1 dhclient vm1
ip netns exec vm1 ip addr show vm1
ip netns exec vm1 ip route show
 
ip netns add vm3
ovsvsctl addport brint vm3 set interface vm3 type=internal
ip link set vm3 address 02:ac:10:ff:01:94
ip link set vm3 netns vm3
ovsvsctl set Interface vm3 external_ids:ifaceid=insidevm3
ip netns exec vm3 dhclient vm3
ip netns exec vm3 ip addr show vm3
ip netns exec vm3 ip route show

在 ubuntu3上:

Java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
ip netns add vm2
ovsvsctl addport brint vm2 set interface vm2 type=internal
ip link set vm2 address 02:ac:10:ff:01:31
ip link set vm2 netns vm2
ovsvsctl set Interface vm2 external_ids:ifaceid=dmzvm2
ip netns exec vm2 dhclient vm2
ip netns exec vm2 ip addr show vm2
ip netns exec vm2 ip route show
 
ip netns add vm4
ovsvsctl addport brint vm4 set interface vm4 type=internal
ip link set vm4 address 02:ac:10:ff:01:95
ip link set vm4 netns vm4
ovsvsctl set Interface vm4 external_ids:ifaceid=insidevm4
ip netns exec vm4 dhclient vm4
ip netns exec vm4 ip addr show vm4
ip netns exec vm4 ip route show

测试网络连通性

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

Java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# ping vm1的默认网关
root@ubuntu2:~# ip netns exec vm1 ping 172.16.255.129
PING 172.16.255.129 (172.16.255.129) 56(84) bytes of data.
64 bytes from 172.16.255.129: icmp_seq=1 ttl=254 time=0.689 ms
64 bytes from 172.16.255.129: icmp_seq=2 ttl=254 time=0.393 ms
64 bytes from 172.16.255.129: icmp_seq=3 ttl=254 time=0.483 ms
 
# overlay网络ping vm2(跨越整个 tenant1
root@ubuntu2:~# ip netns exec vm1  ping 172.16.255.131
PING 172.16.255.131 (172.16.255.131) 56(84) bytes of data.
64 bytes from 172.16.255.131: icmp_seq=1 ttl=64 time=2.16 ms
64 bytes from 172.16.255.131: icmp_seq=2 ttl=64 time=0.573 ms
64 bytes from 172.16.255.131: icmp_seq=3 ttl=64 time=0.446 ms
 
# 经过 router ping vm3(跨越整个 overlay网络)
root@ubuntu2:~# ip netns exec vm1  ping 172.16.255.194
PING 172.16.255.194 (172.16.255.194) 56(84) bytes of data.
64 bytes from 172.16.255.194: icmp_seq=1 ttl=63 time=1.37 ms
64 bytes from 172.16.255.194: icmp_seq=2 ttl=63 time=0.077 ms
64 bytes from 172.16.255.194: icmp_seq=3 ttl=63 time=0.076 ms
 
#经过 router ping vm4(跨越整个 overlay网络)
root@ubuntu2:~# ip netns exec vm1  ping 172.16.255.195
PING 172.16.255.195 (172.16.255.195) 56(84) bytes of data.
64 bytes from 172.16.255.195: icmp_seq=1 ttl=63 time=1.79 ms
64 bytes from 172.16.255.195: icmp_seq=2 ttl=63 time=0.605 ms
64 bytes from 172.16.255.195: icmp_seq=3 ttl=63 time=0.503 ms

结语

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

no comments
Share