OpenStack提供的负载均衡服务:LBaaS,这个项目目前属于Neutron项目中,作为Neutron的一个Service Plugin。
负载均衡的功能想必不需要多解释了,无非就是把流量尽可能均衡的分配到后端的各台服务器上,现在流行的解决方案有很多,如硬件的 F5、软件的LVS、HAProxy、Nginx等。这些负载均衡手段虽然工作的层次有所不同,但根本目的都是一样的:让各个后端机器获得尽可能 均匀的复杂以提高集群整体的处理能力。
那么在云环境中负载均衡很自然的也是非常重要的技术,租户所创建的虚拟机之间也需要进行负载均衡。为什么不能直接使用更大的虚拟 机呢?好问题。一来虚拟机的纵向扩展将使服务出现Down time;二来纵向拓展是有上限的:不可能超过真实服务器的承受能力;三来如 果一直开着一台很大的低负载虚拟机,就租户而言从计费角度上不太划算,远不如按需的启动和关闭虚拟机来的划算。 根据负载均衡的特点,社区在OpenStack中把负载均衡抽象成下面的概念:
其中最为核心的是Pool,代表负载后端的虚拟机池,Pool中包含想要进行负载均衡的虚拟机作为Member,并且要为Pool整体绑定一个VIP 作为所有Member的虚拟IP,所有访问虚拟IP的请求将根据设定的负载均衡规则分配到Pool中的Member虚拟机上。最后再为这个VIP对应的 Port绑定一个Floating IP,就可以从外网愉快的使用负载均衡下的虚拟机集群了~
实现的网络逻辑如下图所示:
LBaaS利用Neutron的网络服务,将Floating IP绑定到Load Balancer的Port上,然后将这些流量通过内部网络均衡的分配给各个虚拟机。
很容易看出,最核心的部分就是Load Balancer的实现了,那么Load Balancer是怎么实现的呢?
答案是没有实现…OpenStack直接采用各种开源可用的负载均衡项目来完成负载均衡的任务,默认是HAProxy。LBaaS所做的任务就是根据 用户提出的负载均衡要求生成符合要求的HAProxy配置文件并启动HAProxy。
我在我的实验环境中为三台虚拟机(10.0.0.20, 10.0.0.21, 10.0.0.0.22)的80端口(HTTP)配置了负载均衡服务,使用10.0.0.23作为 VIP,果然发现了HAProxy进程:
$ ps aux | grep haproxy kongfy 3008 0.0 0.0 112612 740 pts/0 S+ 11:42 0:00 grep --color=auto haproxy kongfy 12684 2.1 0.9 199700 35596 pts/14 S+ May05 253:32 python /usr/bin/neutron-lbaas-agent --config-file /etc/neutron/neutron.conf --config-file=/etc/neutron/services/loadbalancer/haproxy/lbaas_agent.ini nobody 23906 0.0 0.0 49692 1300 ? Ss May09 0:20 haproxy -f /opt/stack/data/neutron/lbaas/49717bc1- 204c-42a8-9cc2-46db88a70365/conf -p /opt/stack/data/neutron/lbaas/49717bc1-204c-42a8-9cc2-46db88a70365/pid -sf 28415
顺藤摸瓜看看HAProxy使用的配置文件:
global daemon user nobody group nobody log /dev/log local0 log /dev/log local1 notice stats socket /opt/stack/data/neutron/lbaas/49717bc1-204c-42a8-9cc2-46db88a70365/sock mode 0666 level user defaults log global retries 3 option redispatch timeout connect 5000 timeout client 50000 timeout server 50000 frontend 8b1d4cd6-c07f-4b61-996b-8e72fb830eb9 option tcplog bind 10.0.0.23:80 mode http default_backend 49717bc1-204c-42a8-9cc2-46db88a70365 option forwardfor backend 49717bc1-204c-42a8-9cc2-46db88a70365 mode http balance roundrobin option forwardfor server 4668dae7-3259-4e2c-9e9e-870d50e8ded6 10.0.0.20:80 weight 1 server 90f9f52b-ea36-4dfc-b9bc-c1d43a8310e5 10.0.0.21:80 weight 5 server 913ccb64-7034-4295-8c73-44b3d904b775 10.0.0.22:80 weight 1
——未完待续!