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. jsp页面和js代码中使用sessionScope获取session值

    场景:有些实体对象可以放到HttpSession对象中,保正在一个会话期间可以随时获取这个对象的属性,例如可以将登录用户的信息写入session,以保证页面随时可以获取并显示这个用户的状态信息.下面以 ...

  2. 改进cocos2dx中lua读ccb的方法

    cocos2dx自带的CCBProxy真弱,还好提供了一个CCBReaderLoader.lua,但是也不好用, 于是修改了一下CCBReaderLoader,下面直接贴代码了. function N ...

  3. Unix系统编程()brk,sbrk

    在堆上分配内存 进程可以通过增加堆的大小来分配内存,所谓堆是一段长度可变的连续虚拟内存,始于进程的未初始化数据段末尾,随着内存的分配和释放而增减.通常将堆的当前内存边界称为"program ...

  4. 《javascript征途》学习笔记

    基础 1. 只有函数有作用域 2. 如果在<script src>的src 中设置了src特性,则script元素包含的任意代码就无效了.应该分开放到不同的script块中. 3. 外部j ...

  5. MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架

    MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以使用简单的XML或注解用 ...

  6. 用 free 或 delete 释放了内存之后,立即将指针设置为 NULL,防止产 生“野指针”

    用 free 或 delete 释放了内存之后,立即将指针设置为 NULL,防止产 生“野指针”. #include <iostream> using namespace std; /* ...

  7. 《网络编程》非堵塞 I/O

    概述 在前面文章中,我们介绍了 I/O 的五种模型<I/O 模型>.从那里能够知道,非堵塞式的 I/O 是进程调用 I/O 操作时.若数据未准备就绪.则马上返回一个 EWOULDBLOCK ...

  8. PyQt的QString 和 QStringList

    在Qt的C++实现中的QString 和 QStringList 在Python的实现中等效替换为 "str1" 和 ["str1","str2&qu ...

  9. jQuery功能函数详解

    jQuery通过$.browser对象获取浏览器信息. 属性 说明msie 如果是ie为true,否则为falsemozilla 如果是mozilla相关的浏览器为true,否则为falsesafar ...

  10. JavaScript 二、eval 和 with 函数

    /* * ========================================================= * * JavaScript 词法欺骗 * * 1.欺骗词法作用域,会导致 ...