OVN实战---《The OVN Load Balancer》翻译
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》翻译的更多相关文章
- OVN实战---《A Primer on OVN》翻译
overview 在本文中,我们将在三个host之间创建一个简单的二层overlay network.首先,我们来简单看一下,整个系统是怎么工作的.OVN基于分布式的control plane,其中各 ...
- OVN实战---《OVN and Containers》翻译
Overview 在本篇文章中,我们要讨论的是OVN和容器的集成.到本次实验中,我们将会创建一个包含有一对容器的“虚拟机”,这些容器会直接和OVN logical switch相连,并且可以供逻辑网络 ...
- OVN实战---《The OVN Gateway Router》翻译
Overview 在本文中我将在前文的基础上添加一个OVN gateway router.gateway router将使得lab network能访问我们的overlay network The l ...
- OVN实战---《An Introduction to OVN Routing》翻译
Overview 在前面一篇文章的基础上,现在我将通过OVN创建一个基础的三层网络.创建的最终结果将是一对logical switches通过一个logical router相连.另外,该路由器会通过 ...
- 《OVN Logical Flows and ovn-trace》翻译
在本篇文章中,我将解释什么是Logical Flow以及如何使用ovn-trace去更好地理解它们.同时,我也会用一些例子来解释,为什么使用Logical Flow这种抽象模型能让新特性的添加变得出乎 ...
- Spring in action(Spring实战) 第四版中文翻译
第一部分 Spring核心 Spring提供了非常多功能,可是全部这些功能的基础是是依赖注入(DI)和面向方面编程(AOP). 第一章 Springing into action 本章包含: Spri ...
- 如何借助 OVN 来提高 OVS 在云计算环境中的性能
众所周知,OpenvSwitch 以其丰富的功能和不错的性能,已经成为 Openstack 部署中最受欢迎的虚拟交换机.由于 Openstack Neutron 的架构引入了一些性能问题,比如 neu ...
- ovs ovn 学习资料
0.A Primer on OVN http://blog.spinhirne.com/2016/09/a-primer-on-ovn.html 1.Open Virtual Networking W ...
- OVN架构
原文地址 OVN架构 1.简介 OVN,即Open Virtual Network,是一个支持虚拟网络抽象的系统. OVN补充了OVS的现有功能,增加了对虚拟网络抽象的原生(native)支持,比如虚 ...
随机推荐
- Eclipse “cannot be resolved to a type” error
引言: eclipse新导入的项目经常可以看到"XX cannot be resolved to a type"的报错信息.本文将做以简单总结. 正文: (1)jd ...
- love2d--glsl01简单的渲染
love2d一个好玩的地方是支持glsl1.2,并修改简化,glsl1.2的文档 地址为:http://www.opengl.org/registry/doc/GLSLangSpec.Full.1.2 ...
- java ssm框架入门(二)添加语言滤器
使用过滤器是在web.xml中使用filter,以下是码过滤器,过滤所有资源的使用 web.xml <filter> <filter-name>setCharactor< ...
- [fork]Linux中的fork函数详解
---------------------------------------------------------------------------------------------------- ...
- SpringBoot资源国际化
Springboot根据浏览器实现网站资源国际化 根据浏览器地区主动选择资源 1.创建资源化文件 resource目录下创建messages目录 创建messages_en_US.properties ...
- 记一次redis攻击
服务器挖矿病毒的排查过程 事情起因:朋友的一台阿里云主机,登录特别卡,找我看看 这一看就感觉出问题了,机器特别卡,top看了一眼,cpu几乎是100%运行 但是奇怪的是用top命令完全看不出来哪个进程 ...
- Redis list 之增删改查
一.增加 1.lpush [lpush key valus...] 类似于压栈操作,将元素放入头部 127.0.0.1:6379> lpush plist ch0 ch1 ch2 (integ ...
- 对mysql锁机制的学习
1.对于mysql学习,经常翻看一些博客,论坛,好像或多或少有mysq锁机制的学习与总结,所以今天有必要 对mysql锁机制的一些个人的总结,以便以后深入的学习. 2.学习这件事,从来都是“深入浅出” ...
- 集成学习AdaBoost算法——学习笔记
集成学习 个体学习器1 个体学习器2 个体学习器3 ——> 结合模块 ——>输出(更好的) ... 个体学习器n 通常,类似求平均值,比最差的能好一些,但是会比最好的差. 集成可能提 ...
- 中文转换成Unicode编码 和 Unicode编码转换为中文
前几天,遇到一个问题,就是在浏览器地址栏传递中文时,出现乱码,考虑了一下,解决方式有很多,我还是采用了转换编码的方式,将中文转换为Unicode编码,然后再解码成中文,以下是实现的过程,非常简单! p ...