Overview

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

The lab network

The OVN logical network

The OVN Load Balancer

The OVN load balancer用于为OVN逻辑网络空间中的负载提供基本的负载均衡的功能。由于它的简单特性,它并不是用来替代基于应用的,专有的load balancer,后者往往提供了更多高级特性。

The load balancer利用一种基于哈希的算法来将对于VIP的请求均衡到逻辑地址空间中一个相关的IP地址池中。因为哈希值是根据用户请求的头部计算的,因此均衡的结果会非常随机。而每个用户的请求都会在连接期间和负载池中的某个成员互相绑定。OVN中的Load balancing既可以应用到logical switch中,也可以应用到logical router中。我们需要根据具体的需求来确定在什么地方应用该特性。下面是对各种方法的说明:

当将该特性应用到logical routers时,我们需要考虑以下事项:

  • 负载均衡可能被应用到一个"centralized" router(或者说一个gateway router)
  • 基于上一点,路由器中的负载均衡将不是一个分布式的服务

当将该特性应用到logical switch时,我们需要考虑以下事项:

  • 负载均衡是“分布式”的,它可能会应用到多个OVS hosts中
  • logical switch上的负载均衡只能被应用于来自VIF的流量。这意味着它只能用于"client" logical switch而不是"server" logical switch
  • 基于上一点,你可能需要根据你设计所需的扩展性将负载均衡应用到多个logical switch中

Using Our Fake "VMs" as Web Servers

为了模拟load balancer,我们需要在"dmz"上创建一对web server,每一个server都提供可识别的服务。为了让演示更为简单,我们将在vm1/vm2的namespace中用一行python代码来启动一个web server。下面就来启动我们的web servers。

ubuntu2

mkdir /tmp/www
echo "i am vm1" > /tmp/www/index.html
cd /tmp/www
ip netns exec vm1 python -m SimpleHTTPServer 8000

  

ubuntu3

mkdir /tmp/www
echo "i am vm2" > /tmp/www/index.html
cd /tmp/www
ip netns exec vm2 python -m SimpleHTTPServer 8000

上述命令用于创建web server,并且在TCP端口8000进行监听,它会通过显示不同的文件内容来标识不同的虚拟机。

同时我们还想要测试到达web server的连通性。对此,我们将在Ubuntu host的global namespace利用curl进行检测。确保已经安装了curl命令

apt-get -y install curl

  

Configuring the Load Balancer Rules

首先,我们需要定义load balancing rules,VIP以及后端的IP池。下文命令的内容就是在OVN northbound DB中创建一个记录,并且获取它的UUID。为了测试,我们将使用"data" network中的10.127.0.254作为VIP,并且将vm1/vm2的地址作为IP池。

ubuntu1

uuid=`ovn-nbctl create load_balancer vips:10.127.0.254="172.16.255.130,172.16.255.131"`
echo $uuid

上述命令在northbound DB的load_balancer表中创建了一个记录,并且将结果UUID存放在了变量"uuid"中。我们将在下面的命令中引用该变量。

The Gateway Router As a Load Balancer

首先,让我们将load balancer profile应用到OVN gateway router "edge1"中

ubuntu1

ovn-nbctl set logical_router edge1 load_balancer=$uuid

  

我们可以通过如下命令来确认

ovn-nbctl get logical_router edge1 load_balancer

  

现在,从任意Ubuntu host的global namespace中,我们都能连接VIP了

root@ubuntu1:~# curl 10.127.0.254:8000
i am vm2
root@ubuntu1:~# curl 10.127.0.254:8000
i am vm1
root@ubuntu1:~# curl 10.127.0.254:8000
i am vm2

  

我重复执行了上述命令好几次,最终显示负载均衡的结果是非常随机的

让我们看看,如果我关闭了其中一个web server会发生什么。因此我们停止了vm1 namespace中的python程序,以下是我得到的结果:

root@ubuntu1:~# curl 10.127.0.254:8000
curl: (7) Failed to connect to 10.127.0.254 port 8000: Connection refused
root@ubuntu1:~# curl 10.127.0.254:8000
i am vm2

  

我们可以发现,the load balancer并不会做任何健康检查。因为我们现在假设健康检查将由Kubernetes这样的编排方案来解决,但是我们可以相信,这个特性会在以后添加进来的。

在进行下一个测试前先重启vm1中的python web server。

负载均衡在外部是可以正常工作的,接着我们来看看,从内部的虚拟机访问VIP会有什么样的结果。在ubuntu2的vm3执行curl的结果如下:

root@ubuntu2:~# ip netns exec vm3 curl 10.127.0.254:8000
i am vm1
root@ubuntu2:~# ip netns exec vm3 curl 10.127.0.254:8000
i am vm2

  

看起来从内部访问负载均衡也是可以正常工作的,不过还有另外一个有趣的问题。我们先来看看我们的OVN network的拓扑结构,再仔细想想在vm3上发出curl请求之后的网络流。同时再观察一下python web server的日志。我的日志如下所示:

10.127.0.130 - - [29/Sep/2016 09:53:44] "GET / HTTP/1.1" 200 -
10.127.0.129 - - [29/Sep/2016 09:57:42] "GET / HTTP/1.1" 200 -

  

我们来看一下日志中的client IP address。第一个IP来自ubuntu1,而第二个IP则是edge1。但是为什么请求来自edge1而不是直接来自vm3呢?这是因为实现OVN负载均衡特性的开发者考虑了所谓的"proxy mode",对于这种模式,某些情况下,load balancer会隐藏client side IP。那么为什么要这么做呢?想想如果web server看到了vm3的真实的IP会怎么样。那么server的应答会直接路由到vm3,绕过edge1中的load balancer。从vm3的角度来看,它对VIP发出了一个请求,但是却从其中一个web server收到了应答,用的是web server的真实的IP地址。这显然不是我们想要的,这也就是proxy-mode存在的原因。

现在让我们先删除load balancer profile,进入下一轮的实验。

Configure the Load Balancer On a Logical Switch

接下去让我们来看看,将load balancing rule应用到各个logical switch中会有什么情况。因为之前我们从edge移除了load balancing,因此我们要做的第一步就是用internal VIP创建一个新的load balancer profile。这次我们将使用172.16.255.62。

ubuntu1

uuid=`ovn-nbctl create load_balancer vips:172.16.255.62="172.16.255.130,172.16.255.131"`
echo $uuid

  

首先,我们将它设置到"inside" 这个logical switch

ubuntu1

# apply and verify
ovn-nbctl set logical_switch inside load_balancer=$uuid
ovn-nbctl get logical_switch inside load_balancer

  

从vm3测试连通性(vm3位于"inside"中)

root@ubuntu2:~# ip netns exec vm3 curl 172.16.255.62:8000
i am vm1
root@ubuntu2:~# ip netns exec vm3 curl 172.16.255.62:8000
i am vm1
root@ubuntu2:~# ip netns exec vm3 curl 172.16.255.62:8000
i am vm2

  

看起来好像工作正常。接着将load balancer从"inside"中移除,并将它加到"dmz上"

ubuntu1

ovn-nbctl clear logical_switch inside load_balancer
ovn-nbctl set logical_switch dmz load_balancer=$uuid
ovn-nbctl get logical_switch dmz load_balancer

  

再次从vm3发起测试

root@ubuntu2:~# ip netns exec vm3 curl 172.16.255.62:8000
^C

  

很不幸,卡住了。那我们再从vm1发起测试(vm1位于"dmz"中)

root@ubuntu2:~# ip netns exec vm1 curl 172.16.255.62:8000
^C

  

结果同样不令人满意。这也就说明负载均衡应该设置到用户的logical switch而不是server的logical switch

最后,清理配置

ubuntu1

ovn-nbctl clear logical_switch dmz load_balancer
ovn-nbctl destroy load_balancer $uuid

  

Final Words

基础的负载均衡是一个非常好的特性。将它内置于OVN中意味着在部署你自己的SDN时可以减少一些依赖。尽管这个特性非常小,但是我认为它已经覆盖了绝大多数客户的需求。希望经过一段时间后,它的某些限制,例如缺少健康检查,能够被解决。

在下一篇文章中,我将进一步探索OVN中的网络安全相关的内容

原文链接:http://blog.spinhirne.com/2016/09/the-ovn-load-balancer.html

OVN实战---《The OVN Load Balancer》翻译的更多相关文章

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

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

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

    Overview 在本篇文章中,我们要讨论的是OVN和容器的集成.到本次实验中,我们将会创建一个包含有一对容器的“虚拟机”,这些容器会直接和OVN logical switch相连,并且可以供逻辑网络 ...

  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. 一款基于css3的散子3D翻转特效

    css3使我们能够跳出2d空间,实现3维空间的动画效果,这里给出一个自动翻转的3d色子动画效果制作过程. 第一步,首先进行HTML的布局,对于3D效果,布局有一定的规律,代码如下: <body& ...

  2. Extjs,实现树形结构的总结

    工作总结,用extjs.mybatis.springMVC实现树形显示班级 前台extjs实现树形代码如下: xtype : 'combotree', fieldLabel : '部门名称', nam ...

  3. [转]基于Storm的实时数据处理方案

    1 文档说明 该文档描述的是以storm为主体的实时处理架构,该架构包括了数据收集部分,实时处理部分,及数据落地部分. 关于不同部分的技术选型与业务需求及个人对相关技术的熟悉度有关,会一一进行分析. ...

  4. 得到application

    ServletContext application = request.getSession().getServletContext();        String basePath = (Str ...

  5. ASP.NET MVC4 权限验证

    在ASP.NET MVC4 中继承ActionFilterAttribute 类,重写OnActionExecuting方法 /// <summary> /// 权限拦截 /// < ...

  6. DOM中XMLDOMnodelist的length属性的表示是:(选择1项)

    DOM中XMLDOMnodelist的length属性的表示是:(选择1项) A. 该对象中文本字符的长度 B. 该对象中元素节点的数量 C. 该对象中节点的数量 D. 该对象中文档对象的数量 解答: ...

  7. i2c 异常之i2c1 prob 检测超时

    在没加atl 的fpga 时 i2c1上的tvp5150 vpss驱动加载没问题, 加了之后出现超时 I2C: timed out in wait_for_bb: I2C_IRQSTATUS=1000 ...

  8. ubuntu被delete的文件位置

    在-/.local/share/Trash/files下边 可以通过 cd / find -name <filename> 找到盖文件的位置

  9. NPOI例子

    例子链接:http://www.cnblogs.com/atao/tag/NPOI/default.html?page=1

  10. Myeclipse 10 Maven 构建 Java Web 项目

    主要介绍如何使用 Myeclipse 10 构建 Maven Web 项目,关于 Maven 的介绍就略过了. 工具/原料 myeclipse apache-maven-3.1.0 方法/步骤 1 下 ...