Overview
在本篇文章中,我们要讨论的是OVN和容器的集成。到本次实验中,我们将会创建一个包含有一对容器的“虚拟机”,这些容器会直接和OVN logical switch相连,并且可以供逻辑网络内的所有虚拟机直接访问。
The OVN Container Networking Model
根据ovn-architecture的man page,OVN的容器网络策略是和容器宿主机进行VLAN trunk connection,并且要求来自每一个容器的流量都用一个单独的VLAN进行隔离。当然,这就要求OVN和容器宿主机之间进行合作,从而保证它们对于给定容器使用的VLAN tag是同步的。同时这也要求容器宿主机从内部保证容器之间是相互隔离的。
下面我们进一步对细节进行讨论,基本的想法是我们利用OVN创建一个logical port用于连接容器宿主机。之后再为我们的容器定义logical port,并将它们映射到"parent" VM logical port,并且定义相应的VLAN tag。之后,OVN会配置OVS flows,将来自parent VM的logical port的标有VLAN的流量映射到合适的container logical port。具体如下图所示:
The Existing Setup
在进一步操作之前,我们先来回顾一下已有的拓扑结构
The lab network
The OVN logical network:
Defining the Logical Network
在本次实验中,我们要创建一个新的fake "VM",vm5,用来存放我们的fake "containers"。这个新的虚拟机会插入到已经存在的dmz交换机上,和vm1,vm2一起。对于新的虚拟机和它的容器,我们都将使用DHCP来配置IP。
在为vm5创建logical port之前,我们需要先确定在之前的lab中,我们为dmz创建的DHCP options。我们将通过直接对OVN northbound DB进行查找来获取该信息。以下是查找的结果。
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"}
我们需要的是"172.16.255.128/26"这个网络的UUID(在我们这个例子中是c0c29381-c945-4507-922a-cb87f76c4581)。获取该UUID以备后用。
接下来为vm5创建logical port。这些操作我们应该已经很熟悉了。需要注意的是,将其中的{uuid}用上文获取的UUID替换。
ubuntu1
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内的容器创建logical port。这和创建普通的logical port几乎没什么不同,不过是加了一些额外的设置。
ubuntu1
# create the logical port for 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} # set the parent logical port and vlan tag for c51 ovn-nbctl set Logical_Switch_Port dmz-c51 parent_name=dmz-vm5 ovn-nbctl set Logical_Switch_Port dmz-c51 tag=51 # create the logical port for 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} # set the parent logical port and vlan tag for c52 ovn-nbctl set Logical_Switch_Port dmz-c52 parent_name=dmz-vm5 ovn-nbctl set Logical_Switch_Port dmz-c52 tag=52
因此,唯一的不同仅仅只是我们为container logical port设置了parent_name和tag。我们可以通过数据库的记录来确认这一点。例如,以下是我们的输出:
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
Configure vm5
对于本次实验,首先需要记住的是,我们使用的并不是真正的虚拟机,我们仅仅通过直接在Ubuntu主机上模拟它们来作为ovs internal ports。对于vm1-vm4我们是直接在br-int创建这些internal port的,但对于vm5,我们的要求有所不同,因此我们会使用一个专门的ovs bridge。这个bridge叫做br-vm5,它并不由OVN管理,当你真正对一个容器宿主机进行配置时,需要对这样一个网桥进行配置。这个网桥会为虚拟机和它的容器提供网络,并且会被配置为进行VLAN tagging操作。下图显示了当我们配置完成时的拓扑结构:
这个实验的配置是非常简单的,我将所有容器都放在了同一个logical switch中,事实上这不是必须的,我可以将container logical switch放在任何logical switch上。
那接下来就开始吧。第一步是对vm5进行配置,这一步我们将放在ubuntu2上进行。
# create the bridge for vm5 ovs-vsctl add-br br-vm5 # create patch port on br-vm5 to br-int ovs-vsctl add-port br-vm5 brvm5-brint -- set Interface brvm5-brint type=patch options:peer=brint-brvm5 # create patch port on br-int to br-vm5. set external id to dmz-vm5 since this is our connection to 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 # create vm5 within a namespace, vm5 traffic will be untagged 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
从vm5 ping 它的默认网关确认连通性:
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
Configuring the vm5 "Containers"
现在vm5已经启动并正常工作了,接下来我们就能配置它的fake "containers"了。这看起来和配置我们的fake "vm"相同,只是我们还需要对它进行vlan tagging的配置。
# create c51 within a namespace. c51 traffic will be tagged with vlan 51 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 # create c52 within a namespace. c52 traffic will be tagged with vlan 52 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
进行连通性确认:
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
Final Words
根据ovn-architecture guide,如果你直接在hypervisor运行容器,或者将他们直接绑定在integration bridge上,那么随着系统的扩展,它们可能会使整个OVN系统停滞。上文这种嵌套的网络解决方案就比较好,因为它有效地减少了integration bridge上的VIF的数目,因此它能最小化对性能带来的影响。再次强调,本文的目的不是为了对真实世界容器解决方案的模拟,仅仅只是为了说明OVN内置的容器网络特性。
原文链接:http://blog.spinhirne.com/2016/10/ovn-and-containers.html