OpenStack 是直接采用各种开源可用的负载均衡项目来完成负载均衡的任务,默认使用 HAProxy。LBaaSv2 本质来说,其实也是根据用户提出的负载均衡要求,生成符合的HAProxy配置文件并启动 HAProxy,然后由 HAProxy 进行负载均衡。
更新时间 | 更新内容 |
---|---|
2017-03-10 | 初始版本 |
2017-04-24 | 添加HAProxy详细说明链接 |
High Availability Proxy(HAProxy)?
HAProxy 是个著名的开源的软件 TCP(四层)/HTTP(七层) 负载均衡器和代理(proxy)软件,可以运行在 Linux,Solaris 和 FreeBSD 等系统上。目前,它已经被许多大公司采用,包括GitHub, Imgur, Instagram, and Twitter 等。它类似 Nginx 的,采用了单进程和事件驱动模型;它使用的内存量低而且稳定,能够处理大量并发请求。
在这里我简单罗列HAProxy配置。详细内容查看:
Neutron中的LoadBalancerv2的Haproxy
haproxy 配置中分成五部分内容,分别如下:
global:参数是进程级的,通常是和操作系统相关。这些参数一般只设置一次,如果配置无误,就不需要再次进行修改。
defaults:配置默认参数,这些参数可以被用到frontend,backend,Listen组件。
frontend:接收请求的前端虚拟节点,Frontend可以更加规则直接指定具体使用后端的backend。
backend:后端服务集群的配置,是真实服务器,一个Backend对应一个或者多个实体服务器。
Listen Fronted和backend的组合体。
neutron的LoadBalancerv2配置文件在 /etc/haproxy/haproxy.cfg中
|
|
我们事先创建了qlbaas-0f66315f-0ccf-43cb-abca-2bb6f51e8fb2,我们看看它的配置文件
|
|
该负载均衡是1个LoadBalance对应1个listener,1个pool。
在/var/lib/neutron/lbaas/v2/0f66315f-0ccf-43cb-abca-2bb6f51e8fb2/haproxy.conf 中
|
|
LBaasv2 可以看做 OpenStack Neutron 对各种物理负载均衡器的虚拟化。它的概念可以和 HAProxy 中的概念进行类比:
HAProxy 的概念 | LBaasv2 的概念 | 说明 |
---|---|---|
Driver | LBaas v2也是采取 driver 模型来支持多种物理的负载均衡器。LBaasv2 默认实现了 HAProxy driver,同时,它也支持多个其他 Vendor driver。 | |
Frontend | Listener | LBaasv2采用Listener方式将流量转移到不同的pool中的member。 |
Backend | Pool | 代表Listener所监听的负载后端的虚拟机池。 |
Backend server | Member | Member 对应的是 pool 里面处理网络请求的一个 OpenStack Nova 虚机 |
Health check | Health monitor | 它用来监测 pool 里面 member 的状态,支持 HTTP, TCP, 和 ping 等多种检测方法。在 Nuetron 中这是可选的,如果没有 Health monitor,pool 会一直认为所有的 member 都是 ACTIVE 状态,这样所有的 member 会一直出现在 VIP 的分发列表中,哪怕 member 对应的实例不能响应网络请求。这在实际应用中会造成负载均衡的响应异常。 |
LoadBalancerv2的使用场景?
由上图可知道,一个LoadBalancerv2可以对应多个Pool,我们另外又建立一个pool如下所示:
在/var/lib/neutron/lbaas/v2/0f66315f-0ccf-43cb-abca-2bb6f51e8fb2/haproxy.conf 中
|
|
访问wget -O - http://2.2.2.2:80 和wget -O - http://2.2.2.2:100都成功。
以上是vip与pool的members同在一个subnet下,下面我们验证一下vip与pool的members不在同一个subnet。
我们创建一个新的Loadbalance和一个listener,vip地址为7.7.7.7,然后创建一个pool,注意一个虚拟机可以加入多个pool,所以我们还把上面的虚拟机加入这个新建的pool中。然后通过路由器subnet7.7.7.0/24和subnet2.2.2.0/24连通。也就是说vip7.7.7.7能与member2.2.2.4,2.2.2.5,2.2.2.6是联通的。
配置如下/var/lib/neutron/lbaas/v2/5081116f-8928-40d7-8aaa-e30c336ca713/haproxy.conf
|
|
也就是说只要vip与member可通信即可,不一定要在同一个subnet中。
另外,如果要从外网访问的话,则还需要创建一个 floating ip 并且把它关联到 lb 的vip 上。 haproxy 所在的namespace 其实只有一个IP地址,分别接收外部连接以及和成员之间的连接。
LoadBalancerv2的多agent模式?
LoadBalancerv2服务可以独立部署在服务器上,包括2个服务,neutron-openvswitch-agent 和neutron-lbassv2-agent。假设有2个节点都部署了LoadBalancerv2服务,当neutron-server发出创建请求时,会在这两个节点选择一个创建对应得namespace空间。
LoadBalancerv2的流程分析?
我们以qlbaas-0f66315f-0ccf-43cb-abca-2bb6f51e8fb2为例子来分析这个过程。
|
|
该接口tap83f82fcf-d1挂在ovs上,并被打上它所在network的vlan_id的:
|
|
对于LoadBalancerv2创建过程(在v2中指Create a load balancer和Create listener完成,我们发现当只是完成Create a load balancer时候,并没有出现namespace,当Create listener完成时才会有namespace出现)我们对等如下操作:
|
|
LoadBalancerv2的源码解读?
LoadBalancerv2的代码结构如下:
1.Create a load balancer
2.Create a listener
3.Create a pool
4.Add member
5.Create a health monitor