如何配置OVN负载均衡器?

简介:

译者简介:郑敏先,就职于诺云系统(上海)有限公司。工作地点为南京的诺云研发中心。担任解决方案工程师。

概述

基于我的上一篇文章,接下来我将介绍OVN的负载平衡特性。 但在开始之前,我们来看看上一个实验中的配置。

OVN 负载均衡器

OVN负载均衡器旨在为OVN逻辑网络空间内的工作负载提供非常基本的负载均衡服务。由于其简单的功能集,它不是设计用于替换那些为高级用例提供更多花里胡哨的功能的硬件负载均衡器。

其它负载均衡器大多使用基于哈希的算法来平衡VIP的请求到逻辑空间内的相关IP地址池。由于哈希算法是使用客户端请求的头来计算的,所以平衡应当是随机性的,其中每个单独的客户端请求在连接的持续时间内始终选择同一个负载均衡池的特定成员。

实验物理网络拓扑:

如何配置OVN负载均衡器?

OVN 逻辑网络拓扑:

如何配置OVN负载均衡器?

OVN中的负载平衡可以应用于逻辑交换机或逻辑路由器。选择何种方式取决于您的具体要求。每种方法都有注意事项。

当应用于逻辑路由器时,需要牢记以下注意事项:

  1. 负载平衡只能应用于“集中式”路由器(即网关路由器)。
  2. 第1个注意事项已经决定了路由器上的负载平衡是非分布式服务。

应用于逻辑交换机时,需要牢记以下注意事项:

  1. 负载平衡是“分布式”的,因为它被应用于潜在的多个OVS主机。
  2. 仅在来自VIF(虚拟接口)的流量入口处评估逻辑交换机上的负载平衡。这意味着它必须应用在“客户端”逻辑交换机上,而不是在“服务器”逻辑交换机上。
  3. 由于第2个注意事项,您可能需要根据您的设计规模对多个逻辑交换机应用负载平衡。

使用我们的的“伪虚拟机”作为Web服务器

为了演示负载均衡器,我们希望在我们的“dmz”中创建一对Web服务器,Web服务器提供一个可识别它们身份的文件。 为了简化实验,我们将使用在我们的vm1/vm2命名空间中分别运行的一个python web服务器。

让我们启动web服务器吧。

在ubuntu2上:

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

在ubuntu3上:

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

上面的命令将创建一个web服务器,监听TCP 8000。

我们还希望能够测试与我们的网络服务器的连通性。 为此,我们将从Ubuntu主机的全局命名空间使用curl。如果curl还没有被安装,那么需要先安装它。

 
  1. apt-get -y install curl 

配置负载均衡器规则

首先,需要定义我们的负载均衡规则,即VIP和后端服务器IP池。 这里涉及的是在OVN北向数据库中创建一个条目,并捕获生成的UUID。 在的这次实验中,我们将使用位于实验室“数据”网络中的VIP 10.127.0.254。 我们将使用vm1/vm2的地址作为池IP。

在ubuntu1上:

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

上述命令在北向数据库的load_balancer表中创建一个条目,并将生成的UUID存储到变量“uuid”。 我们将在后面的命令中引用这个变量。

在网关路由器上配置负载均衡

在OVN网关路由器“edge1”上开启负载均衡器功能。

在ubuntu1上:

 
  1. ovn-nbctl set logical_router edge1 load_balancer=$uuid 

您可以通过检查edge1的数据库条目来验证是否成功开启负载均衡器功能。

 
  1.      
  2. ovn-nbctl get logical_router edge1 load_balancer 

现在,我们可以从任何Ubuntu主机的全局命名空间连接到VIP。

 
  1. root@ubuntu1:~# curl 10.127.0.254:8000 
  2. i am vm2 
  3. root@ubuntu1:~# curl 10.127.0.254:8000 
  4. i am vm1 
  5. root@ubuntu1:~# curl 10.127.0.254:8000 
  6. i am vm2 

测试多次之后,可以确认负载平衡是相当随机的。

让我们看看禁用一个Web服务器会发生什么。 尝试停止在vm1命名空间中运行的python进程。 这是我得到的输出结果:

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

如您所见,负载均衡器未执行任何类型的运行状态检查。 目前的计划是,运行状态检查将由协调解决方案(如Kubernetes)执行,该功能将在未来某个时间点被加入。

在进行下一个测试之前,在vm1上重新启动python Web服务器。

负载均衡器在虚拟机外部运行着,让我们来看看从内部虚拟机访问VIP时会发生什么。

在ubuntu2上调用vm3的curl:

 
  1. root@ubuntu2:~# ip netns exec vm3 curl 10.127.0.254:8000 
  2. i am vm1 
  3. root@ubuntu2:~# ip netns exec vm3 curl 10.127.0.254:8000 
  4. i am vm2 

很棒, 这似乎也正常工作了,但有个地方很有意思。 来看我们的OVN网络的逻辑图,并考虑来自vm3的curl请求的流量。 另外,看看python web服务器的部分日志:

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

注意日志中的客户端IP地址。第一个IP是上一轮测试的ubuntu1。第二个IP是edge1(来自vm3的请求)。为什么请求来自edge1而不是直接来自vm3?答案是,实现负载平衡的OVN开发人员使用了一种称为“代理模式”的方法,其中负载均衡器在某些情况下隐藏了客户端IP。为什么这是必要的?想想如果Web服务器看到vm3的真实IP会发生什么。来自服务器的响应将直接路由回到vm3,绕过edge1上的负载均衡器。从vm3的角度来看,它看起来像是向VIP发出请求,但收到了来自其中一个Web服务器的真实IP的回复。(如果不使用代理模式)负载均衡器就不工作了,这就是为什么代理模式功能很重要。

为了进行第二轮测试,先删除负载均衡器配置

 
  1. ovn-nbctl clear logical_router edge1 load_balancer 
  2. ovn-nbctl destroy load_balancer $uuid 

在逻辑交换机上配置负载均衡

接下来的实验将负载均衡规则应用到逻辑交换机,会发生什么呢? 由于我们将负载均衡从边缘移开,第一步需要创建一个带有内部VIP的新的负载均衡器。 我们将使用172.16.255.62作为VIP。

在ubuntu1上:

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

第一个测试:将负载均衡器应用于“内部”逻辑交换机。

在ubuntu1上:

 
  1. # apply and verify 
  2. ovn-nbctl set logical_switch inside load_balancer=$uuid 
  3. ovn-nbctl get logical_switch inside load_balancer 

然后从vm3测试(位于“inside”):

 
  1. root@ubuntu2:~# ip netns exec vm3 curl 172.16.255.62:8000 
  2. i am vm1 
  3. root@ubuntu2:~# ip netns exec vm3 curl 172.16.255.62:8000 
  4. i am vm1 
  5. root@ubuntu2:~# ip netns exec vm3 curl 172.16.255.62:8000 
  6. i am vm2 

实验貌似成功了。

再从“inside”删除负载均衡器,并将其应用于“dmz”。在ubuntu1上:

 
  1. ovn-nbctl clear logical_switch inside load_balancer 
  2. ovn-nbctl set logical_switch dmz load_balancer=$uuid 
  3. ovn-nbctl get logical_switch dmz load_balancer 

然后再次从 vm3测试:

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

不好,它挂起了。 那我们试试从vm1(它也驻留在“dmz”)测试:

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

也不行。 这强烈说明了对客户端的逻辑交换机而不是服务器的逻辑交换机应用负载平衡的要求。一定要清理环境。

在ubuntu1上:

 
  1. ovn-nbctl clear logical_switch dmz load_balancer 
  2. ovn-nbctl destroy load_balancer $uuid 

结语

基本的负载平衡功能是非常有用的。 由于它直接构建到OVN中,意味着在你的SDN解决方案中又少部署一个软件。 虽然OVN负载均衡器的功能不多,但是我认为它满足了大部分用户的需求。我也期望某些不足,如缺乏的健康检查功能未来能够在OVN中实现。。在下一篇文章中,我将介绍OVN的网络安全功能。


本文作者:佚名          

来源:51CTO

相关实践学习
部署高可用架构
本场景主要介绍如何使用云服务器ECS、负载均衡SLB、云数据库RDS和数据传输服务产品来部署多可用区高可用架构。
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
29天前
|
弹性计算 负载均衡 容灾
slb配置后端服务器组
配置阿里云SLB后端服务器组涉及四个主要步骤:创建服务器组、添加ECS实例、关联监听规则和设定负载均衡策略。这使得流量根据业务需求和服务器特性进行转发,便于应用架构的灵活管理和扩展,支持蓝绿部署、灰度发布,并通过多可用区提升系统可用性和容灾能力。
25 3
|
4月前
|
负载均衡 网络协议 网络架构
VRRP负载均衡模式配置实用吗?
VRRP负载均衡模式配置实用吗?
65 0
|
30天前
|
弹性计算 缓存 网络协议
slb配置监听规则
配置Server Load Balancer的监听规则涉及选择协议(如HTTP/HTTPS/TCP/UDP)、设置端口,配置后端服务器组,设定健康检查(TCP或HTTP),定义转发规则(轮询、权重等),配置SSL证书、会话保持及安全优化措施。在阿里云上,这可通过登录控制台,选择SLB实例,添加监听并设置相关参数来完成。不同云服务商的具体步骤可能略有差异,参考官方文档为宜。
31 3
|
1月前
|
弹性计算 负载均衡 算法
SLB配置与使用
SLB配置与使用
22 4
|
1月前
|
SpringCloudAlibaba 负载均衡 Java
【二】SpringCloud Alibaba之Nacos整合篇(配置负载均衡)
【二】SpringCloud Alibaba之Nacos整合篇(配置负载均衡)
227 0
|
2月前
|
数据采集 负载均衡 应用服务中间件
Python爬虫之Splash负载均衡配置#7
Splash负载均衡配置【2月更文挑战第28天】
33 0
|
3月前
|
负载均衡 网络协议 小程序
Nginx配置Tcp负载均衡
Nginx配置Tcp负载均衡
|
4月前
|
负载均衡 算法 应用服务中间件
(原理及配置)nginx配置负载均衡
(原理及配置)nginx配置负载均衡
73 1
|
4月前
|
负载均衡 应用服务中间件 nginx
Docker配置1台Nginx+3台Tomcat做负载均衡
Docker配置1台Nginx+3台Tomcat做负载均衡
211 0
|
4月前
|
负载均衡 应用服务中间件 Apache
nginx(一)nginx配置反向代理与负载均衡
最近在研究秒杀程序的设计及服务器配置。 涉及到秒杀这个问题,那肯定就意味着大流量高并发访问,那么大概率我们需要做反向代理与负载均衡配置。 那么如何配置nginx的反响代理与负载均衡呢?
206 1