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

OVN实战---《OVN and Containers》翻译的更多相关文章

  1. OVN实战---《A Primer on OVN》翻译

    overview 在本文中,我们将在三个host之间创建一个简单的二层overlay network.首先,我们来简单看一下,整个系统是怎么工作的.OVN基于分布式的control plane,其中各 ...

  2. OVN实战---《The OVN Load Balancer》翻译

    Overview 基于前面几篇文章的基础之上,我们接下来将要探索OVN中的load balancingz这一特性.但是在开始之前,我们先来回顾一下上一个lab中创建好的拓扑结构. The lab ne ...

  3. OVN实战---《The OVN Gateway Router》翻译

    Overview 在本文中我将在前文的基础上添加一个OVN gateway router.gateway router将使得lab network能访问我们的overlay network The l ...

  4. OVN实战---《An Introduction to OVN Routing》翻译

    Overview 在前面一篇文章的基础上,现在我将通过OVN创建一个基础的三层网络.创建的最终结果将是一对logical switches通过一个logical router相连.另外,该路由器会通过 ...

  5. 《OVN Logical Flows and ovn-trace》翻译

    在本篇文章中,我将解释什么是Logical Flow以及如何使用ovn-trace去更好地理解它们.同时,我也会用一些例子来解释,为什么使用Logical Flow这种抽象模型能让新特性的添加变得出乎 ...

  6. Spring in action(Spring实战) 第四版中文翻译

    第一部分 Spring核心 Spring提供了非常多功能,可是全部这些功能的基础是是依赖注入(DI)和面向方面编程(AOP). 第一章 Springing into action 本章包含: Spri ...

  7. 如何借助 OVN 来提高 OVS 在云计算环境中的性能

    众所周知,OpenvSwitch 以其丰富的功能和不错的性能,已经成为 Openstack 部署中最受欢迎的虚拟交换机.由于 Openstack Neutron 的架构引入了一些性能问题,比如 neu ...

  8. ovs ovn 学习资料

    0.A Primer on OVN http://blog.spinhirne.com/2016/09/a-primer-on-ovn.html 1.Open Virtual Networking W ...

  9. OVN架构

    原文地址 OVN架构 1.简介 OVN,即Open Virtual Network,是一个支持虚拟网络抽象的系统. OVN补充了OVS的现有功能,增加了对虚拟网络抽象的原生(native)支持,比如虚 ...

随机推荐

  1. httpclient4.5 的一些细节

    本文转自:http://mercymessi.iteye.com/blog/2250161 httpclient是Apache下的一个用于执行http网络访问的一个工具包. 大致流程:新建一个http ...

  2. error: No implicit Ordering defined for Any

    scala中经常遇到最头疼的问题,就是类型不匹配或者带Any,Option的提示错误信息. 最近碰到的是取最大值,但是明明已经Long类型的,却提示下面这个错误信息. 相关的源程序如下: // 获取o ...

  3. Entity Framework(三):使用特性(数据注解)创建表结构

    一.理解Code First及其约定和配置 传统设计应用的方式都是由下而上的,即我们习惯优先考虑数据库,然后使用这个以数据为中心的方法在数据之上构建应用程序.这种方法非常适合于数据密集的应用或者数据库 ...

  4. 如何让jquery-easyui的combobox像select那样不可编辑

    http://zhidao.baidu.com/link?url=td61iIn_MBCs1FvT7b-B9Lp9VzlyrcnGmSbkCy1EsSzuod5o47zTmJFRQ-xizxdqv1E ...

  5. 更新加子查询加相同的表解决办法 mysql

    UPDATE ofuser SET auid = '0' WHERE uid in (SELECT uid FROM (select tmp.* from ofuser tmp)a WHERE aui ...

  6. selenium:chromedriver与chrome版本的对应关系

    转自:http://blog.csdn.NET/huilan_same/article/details/51896672 再使用selenium打开chrome浏览器的时候,需要用chromedriv ...

  7. backbone.js初探(转)

    BackBone是JavaScript frameworks for creating MVC-like web applications,最近流行的用来建立单页面web application的工具 ...

  8. CI -- $this->load->library()详解

    我第一次加载失败,原来是文件名和类名不同的原因,先总结关于CI加载你自己的类文件注意事项: 1.第三方加载文件应放在application/libraries文件下 2.文件名和类名应该相同,并且首字 ...

  9. 【wikioi】3160 最长公共子串(后缀自动机)

    http://codevs.cn/problem/3160/ sam的裸题...(之前写了spoj上另一题sam的题目,但是spoj被卡评测现在还没评测完QAQ打算写那题题解时再来详细介绍sam的.. ...

  10. expected_conditions判断页面元素

    expected_condtions提供了16种判断页面元素的方法: 1.title_is:判断当前页面的title是否完全等于预期字符串,返回布尔值 2.title_contains:判断当前页面的 ...