OVN实战---《OVN and Containers》翻译

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

 

转载于:https://www.cnblogs.com/YaoDD/p/7479118.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值