设为首页收藏本站language 语言切换
查看: 525|回复: 0
收起左侧

如何配置集成容器的OVN网络?

[复制链接]
发表于 2017-7-27 17:39:28 | 显示全部楼层 |阅读模式
概览接着我的上一篇文章,本文讨论的主题是集成的容器的OVN。 在本实验结束时,我们将创建一个容器主机“VM”(虚拟机),其中包含一对容器。 这些容器将直接绑定到OVN逻辑交换机中,并且可以直接从逻辑网络内的所有虚拟机访问。
OVN 容器网络模型根据官方的OVN架构文档,OVN的容器网络选择使用VLAN Trunk作为连接到容器主机VM的方式,并要求来自每个容器的流量被隔离在一个唯一的VLAN内。这也意味着在OVN和容器主机之间必须对VLAN信息进行同步,以确保它们在同一时间给特定容器使用哪个VLAN tag。通过这种方式,它对容器主机施加了一定程度的控制,以确保主机上的容器被相互隔离。
我把OVN实现步骤细分为三步:
  • 创建一个连接主机VM的逻辑端口。
  • 为容器定义逻辑端口,将它们映射到“父”虚拟机逻辑端口,并定义要使用的VLAN tag。
  • OVN配置OVS流,将被VLAN标记的流量从“父”虚拟机的逻辑端口映射到目标容器的逻辑端口。
下图描述了这种设计:

当前环境信息在开始之前,请花点时间看一下当前环境信息。
物理网络拓扑:

OVN 逻辑网络拓扑:

定义逻辑网络在本次实验中,我将创建一个新的伪“虚拟机”,vm5,它将托管我们的伪“容器”。新虚拟机将接入到现有的DMZ交换机,和vm1和vm2相邻。 我们将对新虚拟机及其容器使用DHCP。在为vm5创建逻辑端口之前,我们需要查看在上一篇文章中为DMZ网络创建的DHCP选项。 我们将直接查询OVN北向数据库以获取此DHCP选项相关信息。
我这个实验环境的输出结果是:
                                                                                Java

                                                root@ubuntu1:~# ovn-nbctl list DHCP_Options_uuid               : 7e32cec4-957e-46fa-a4cc-34218e1e17c8cidr                : "172.16.255.192/26"external_ids        : {}options             : {lease_time="3600", router="172.16.255.193", server_id="172.16.255.193", server_mac="02:ac:10:ff:01:93"}_uuid               : c0c29381-c945-4507-922a-cb87f76c4581cidr                : "172.16.255.128/26"external_ids        : {}options             : {lease_time="3600", router="172.16.255.129", server_id="172.16.255.129", server_mac="02:ac:10:ff:01:29"}
                                                       
                                        1
2
3
4
5
6
7
8
9
10

                               
root@ubuntu1:~# ovn-nbctl list DHCP_Options
_uuid               : 7e32cec4-957e-46fa-a4cc-34218e1e17c8
cidr                : "172.16.255.192/26"
external_ids        : {}
options             : {lease_time="3600", router="172.16.255.193", server_id="172.16.255.193", server_mac="02:ac:10:ff:01:93"}

_uuid               : c0c29381-c945-4507-922a-cb87f76c4581
cidr                : "172.16.255.128/26"
external_ids        : {}
options             : {lease_time="3600", router="172.16.255.129", server_id="172.16.255.129", server_mac="02:ac:10:ff:01:29"}

                       
               

我们获取到了192.16.255.128/26”网络的UUID(在我的环境是c0c29381-c945-4507-922a-cb87f76c4581)。 捕获此UUID以在稍后的命令中使用。
让我们为vm5创建逻辑端口。 你现在应该对这些命令不陌生了。 请务必将{uuid}替换为上述DHCP选项条目中的UUID。
在ubuntu1上执行:
                                                                                Java

                                                ovn-nbctl lsp-add dmz dmz-vm5ovn-nbctl lsp-set-addresses dmz-vm5 "02:ac:10:ff:01:32 172.16.255.132"ovn-nbctl lsp-set-port-security dmz-vm5 "02:ac:10:ff:01:32 172.16.255.132"ovn-nbctl lsp-set-dhcpv4-options dmz-vm5 {uuid}
                                                       
                                        1
2
3
4

                               
ovn-nbctl lsp-add dmz dmz-vm5
ovn-nbctl lsp-set-addresses dmz-vm5 "02:ac:10:ff:01:32 172.16.255.132"
ovn-nbctl lsp-set-port-security dmz-vm5 "02:ac:10:ff:01:32 172.16.255.132"
ovn-nbctl lsp-set-dhcpv4-options dmz-vm5 {uuid}

                       
               

现在我们将为在vm5上运行的容器创建逻辑端口。 此过程几乎与创建正常的逻辑端口相同,需要注意有几个新的命令。
在ubuntu1上进行如下操作:
                                                                                Java

                                                # 创建逻辑端口c51ovn-nbctl lsp-add dmz dmz-c51ovn-nbctl lsp-set-addresses dmz-c51 "02:ac:10:ff:01:33 172.16.255.133"ovn-nbctl lsp-set-port-security dmz-c51 "02:ac:10:ff:01:33 172.16.255.133"ovn-nbctl lsp-set-dhcpv4-options dmz-c51 {uuid}#设置c51的父逻辑端口和vlan tagovn-nbctl set Logical_Switch_Port dmz-c51 parent_name=dmz-vm5ovn-nbctl set Logical_Switch_Port dmz-c51 tag=51#创建逻辑端口c52ovn-nbctl lsp-add dmz dmz-c52ovn-nbctl lsp-set-addresses dmz-c52 "02:ac:10:ff:01:34 172.16.255.134"ovn-nbctl lsp-set-port-security dmz-c52 "02:ac:10:ff:01:34 172.16.255.134"ovn-nbctl lsp-set-dhcpv4-options dmz-c52 {uuid}#设置c52的父逻辑端口和vlan tagovn-nbctl set Logical_Switch_Port dmz-c52 parent_name=dmz-vm5ovn-nbctl set Logical_Switch_Port dmz-c52 tag=52
                                                       
                                        1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

                               
# 创建逻辑端口c51
ovn-nbctl lsp-add dmz dmz-c51
ovn-nbctl lsp-set-addresses dmz-c51 "02:ac:10:ff:01:33 172.16.255.133"
ovn-nbctl lsp-set-port-security dmz-c51 "02:ac:10:ff:01:33 172.16.255.133"
ovn-nbctl lsp-set-dhcpv4-options dmz-c51 {uuid}

#设置c51的父逻辑端口和vlan tag
ovn-nbctl set Logical_Switch_Port dmz-c51 parent_name=dmz-vm5
ovn-nbctl set Logical_Switch_Port dmz-c51 tag=51

#创建逻辑端口c52
ovn-nbctl lsp-add dmz dmz-c52
ovn-nbctl lsp-set-addresses dmz-c52 "02:ac:10:ff:01:34 172.16.255.134"
ovn-nbctl lsp-set-port-security dmz-c52 "02:ac:10:ff:01:34 172.16.255.134"
ovn-nbctl lsp-set-dhcpv4-options dmz-c52 {uuid}

#设置c52的父逻辑端口和vlan tag
ovn-nbctl set Logical_Switch_Port dmz-c52 parent_name=dmz-vm5
ovn-nbctl set Logical_Switch_Port dmz-c52 tag=52

                       
               

因此,唯一的区别是为容器逻辑端口设置了一个parent_name和vlan tag。 您可以通过查看数据库条目来验证这些。
我这个实验环境的输出结果是:
                                                                                Java

                                                root@ubuntu1:~# ovn-nbctl find Logical_Switch_Port name="dmz-c51"_uuid               : ea604369-14a9-4e25-998f-ec99c2e7e47eaddresses           : ["02:ac:10:ff:01:31 172.16.255.133"]dhcpv4_options      : c0c29381-c945-4507-922a-cb87f76c4581dhcpv6_options      : []dynamic_addresses   : []enabled             : []external_ids        : {}name                : "dmz-c51"options             : {}parent_name         : "dmz-vm5"port_security       : ["02:ac:10:ff:01:31 172.16.255.133"]tag                 : 51tag_request         : []type                : ""up                  : false
                                                       
                                        1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

                               
root@ubuntu1:~# ovn-nbctl find Logical_Switch_Port name="dmz-c51"
_uuid               : ea604369-14a9-4e25-998f-ec99c2e7e47e
addresses           : ["02:ac:10:ff:01:31 172.16.255.133"]
dhcpv4_options      : c0c29381-c945-4507-922a-cb87f76c4581
dhcpv6_options      : []
dynamic_addresses   : []
enabled             : []
external_ids        : {}
name                : "dmz-c51"
options             : {}
parent_name         : "dmz-vm5"
port_security       : ["02:ac:10:ff:01:31 172.16.255.133"]
tag                 : 51
tag_request         : []
type                : ""
up                  : false

                       
               


配置 vm5关于这个实验的第一件事情是,我们没有使用真正的虚拟机,而是直接在Ubuntu主机上把ovs内部端口模拟成虚拟机。 对于vm1,vm2,vm3和vm4,我们直接在br-int上创建这些内部端口,但对于vm5,我们的实验要求有点不同,因此我们将使用专用的ovs网桥。 这个br-vm5的网桥不会由OVN管理,并且将模拟真实的容器主机VM内部的ovs网桥。 此网桥将为VM及其容器提供本地网络连接,并将执行VLAN tagging。
配置完成之后就是下图:

我的实验配置很简单,我把容器都放在同一个逻辑交换机上。然而没有要求必须这样做,其实我可以将容器逻辑端口放置在任一台逻辑交换机上。
第一步是创建vm5。
在ubuntu2主机上进行如下操作:
                                                                                Java

                                                #为vm5创建网桥ovs-vsctl add-br br-vm5#在br-vm5上创建到br-int的patch端口ovs-vsctl add-port br-vm5 brvm5-brint -- set Interface brvm5-brint type=patch options:peer=brint-brvm5#在br-int上创建到br-vm5 patch端口。 因为与vm5的连接的,所以将外部id设置为dmz-vm5。ovs-vsctl add-port br-int brint-brvm5 -- set Interface brint-brvm5 type=patch options:peer=brvm5-brintovs-vsctl set Interface brint-brvm5 external_ids:iface-id=dmz-vm5#在命名空间中创建vm5。 vm5流量将被进行untag操作ovs-vsctl add-port br-vm5 vm5 -- set interface vm5 type=internalip link set vm5 address 02:ac:10:ff:01:32ip netns add vm5ip link set vm5 netns vm5ip netns exec vm5 dhclient vm5
                                                       
                                        1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

                               
#为vm5创建网桥
ovs-vsctl add-br br-vm5

#在br-vm5上创建到br-int的patch端口
ovs-vsctl add-port br-vm5 brvm5-brint -- set Interface brvm5-brint type=patch options:peer=brint-brvm5

#在br-int上创建到br-vm5 patch端口。 因为与vm5的连接的,所以将外部id设置为dmz-vm5。
ovs-vsctl add-port br-int brint-brvm5 -- set Interface brint-brvm5 type=patch options:peer=brvm5-brint
ovs-vsctl set Interface brint-brvm5 external_ids:iface-id=dmz-vm5

#在命名空间中创建vm5。 vm5流量将被进行untag操作
ovs-vsctl add-port br-vm5 vm5 -- set interface vm5 type=internal
ip link set vm5 address 02:ac:10:ff:01:32
ip netns add vm5
ip link set vm5 netns vm5
ip netns exec vm5 dhclient vm5

                       
               

通过ping vm5的默认网关来验证网络连通性:
                                                                                Java

                                                root@ubuntu2:~# ip netns exec vm5 ping 172.16.255.129PING 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.797 ms64 bytes from 172.16.255.129: icmp_seq=2 ttl=254 time=0.509 ms64 bytes from 172.16.255.129: icmp_seq=3 ttl=254 time=0.404 ms
                                                       
                                        1
2
3
4
5

                               
root@ubuntu2:~# ip netns exec vm5 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.797 ms
64 bytes from 172.16.255.129: icmp_seq=2 ttl=254 time=0.509 ms
64 bytes from 172.16.255.129: icmp_seq=3 ttl=254 time=0.404 ms

                       
               


配置“容器”现在vm5已经启动了,我们可以配置它的伪“容器”。 除了vlan相关配置之外,它们看起来几乎完全和我们的伪“虚拟机”们一模一样。
                                                                                Java

                                                #在命名空间中创建c51。 c51流量将打上vlan 51的tagip netns add c51ovs-vsctl add-port br-vm5 c51 tag=51 -- set interface c51 type=internalip link set c51 address 02:ac:10:ff:01:33ip link set c51 netns c51ip netns exec vm5 dhclient c51#在命名空间中创建c52。 c52流量将打上vlan 52的tagip netns add c52ovs-vsctl add-port br-vm5 c52 tag=52 -- set interface c52 type=internalip link set c52 address 02:ac:10:ff:01:34ip link set c52 netns c52ip netns exec c52 dhclient c52
                                                       
                                        1
2
3
4
5
6
7
8
9
10
11
12
13

                               
#在命名空间中创建c51。 c51流量将打上vlan 51的tag
ip netns add c51
ovs-vsctl add-port br-vm5 c51 tag=51 -- set interface c51 type=internal
ip link set c51 address 02:ac:10:ff:01:33
ip link set c51 netns c51
ip netns exec vm5 dhclient c51

#在命名空间中创建c52。 c52流量将打上vlan 52的tag
ip netns add c52
ovs-vsctl add-port br-vm5 c52 tag=52 -- set interface c52 type=internal
ip link set c52 address 02:ac:10:ff:01:34
ip link set c52 netns c52
ip netns exec c52 dhclient c52

                       
               

测试网络连通性:
                                                                                Java

                                                root@ubuntu2:~# ip netns exec c51 ping 172.16.255.129PING 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=1.33 ms64 bytes from 172.16.255.129: icmp_seq=2 ttl=254 time=0.420 ms64 bytes from 172.16.255.129: icmp_seq=3 ttl=254 time=0.371 msroot@ubuntu2:~# ip netns exec c52 ping 172.16.255.129PING 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=1.53 ms64 bytes from 172.16.255.129: icmp_seq=2 ttl=254 time=0.533 ms64 bytes from 172.16.255.129: icmp_seq=3 ttl=254 time=0.355 ms
                                                       
                                        1
2
3
4
5
6
7
8
9
10
11

                               
root@ubuntu2:~# ip netns exec c51 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=1.33 ms
64 bytes from 172.16.255.129: icmp_seq=2 ttl=254 time=0.420 ms
64 bytes from 172.16.255.129: icmp_seq=3 ttl=254 time=0.371 ms

root@ubuntu2:~# ip netns exec c52 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=1.53 ms
64 bytes from 172.16.255.129: icmp_seq=2 ttl=254 time=0.533 ms
64 bytes from 172.16.255.129: icmp_seq=3 ttl=254 time=0.355 ms

                       
               


结语如果按照ovn官方架构文档,直接在虚拟机管理程序上运行容器,或者直接用patch端口连接到集成网桥,那么在网络规模特别大的情况下,OVN系统可能会崩溃。
“嵌套”网络解决方案是很好的,因为它大大减少了集成桥上的VIF的数量,从而最小化容器本身的性能损失。
最后再说明一下,本实验的重点不是建立一个完全真实的容器环境,而是展示OVN的内置的容器网络功能集。
                                                                       
                       
                                                                                《SDN实战特训营第七期》课程详情 http://edu.sdnlab.com/training/480.html 转发文章至朋友圈,咨询报名即可享受9.5折优惠
您需要登录后才可以回帖 登录 | 论坛注册

本版积分规则

QQ|Archiver|手机版|小黑屋|sitemap|鸿鹄论坛 ( 京ICP备14027439号 )  

GMT+8, 2025-2-23 12:18 , Processed in 0.057315 second(s), 22 queries , Redis On.  

  Powered by Discuz!

  © 2001-2025 HH010.COM

快速回复 返回顶部 返回列表