OpenStack 是直接採用各類開源可用的負載均衡項目來完成負載均衡的任務,默認使用 HAProxy。LBaaSv2 本質來講,其實也是根據用戶提出的負載均衡要求,生成符合的HAProxy配置文件並啓動 HAProxy,而後由 HAProxy 進行負載均衡。html
HAProxy 是個著名的開源的軟件 TCP(四層)/HTTP(七層) 負載均衡器和代理(proxy)軟件,能夠運行在 Linux,Solaris 和 FreeBSD 等系統上。目前,它已經被許多大公司採用,包括GitHub, Imgur, Instagram, and Twitter 等。它相似 Nginx 的,採用了單進程和事件驅動模型;它使用的內存量低並且穩定,可以處理大量併發請求。前端
在這裏我簡單羅列HAProxy配置。詳細內容查看:python
http://www.cnblogs.com/wanstack/p/8392332.htmlweb
haproxy 配置中分紅五部份內容,分別以下:
global:參數是進程級的,一般是和操做系統相關。這些參數通常只設置一次,若是配置無誤,就不須要再次進行修改。
defaults:配置默認參數,這些參數能夠被用到frontend,backend,Listen組件。
frontend:接收請求的前端虛擬節點,Frontend能夠更加規則直接指定具體使用後端的backend。
backend:後端服務集羣的配置,是真實服務器,一個Backend對應一個或者多個實體服務器。
Listen Fronted和backend的組合體。redis
neutron的LoadBalancerv2配置文件在 /etc/haproxy/haproxy.cfg中數據庫
###########全局配置######### global log /dev/log local0 #[日誌輸出配置,全部日誌都記錄在本機,經過local0輸出] log /dev/log local1 notice #定義haproxy 日誌級別[error warringinfo debug] chroot /var/lib/haproxy stats socket /run/haproxy/admin.sock mode 660 level admin stats timeout 30s user haproxy group haproxy #能夠由配置項 user_group 指定,默認爲 nogroup daemon #之後臺形式運行harpoxy # Default SSL material locations ca-base /etc/ssl/certs crt-base /etc/ssl/private # Default ciphers to use on SSL-enabled listening sockets. # For more information, see ciphers(1SSL). This list is from: # https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/ ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS ssl-default-bind-options no-sslv3 ########默認配置############ defaults log global mode http option httplog option dontlognull timeout connect 5000 timeout client 50000 timeout server 50000 errorfile 400 /etc/haproxy/errors/400.http errorfile 403 /etc/haproxy/errors/403.http errorfile 408 /etc/haproxy/errors/408.http errorfile 500 /etc/haproxy/errors/500.http errorfile 502 /etc/haproxy/errors/502.http errorfile 503 /etc/haproxy/errors/503.http errorfile 504 /etc/haproxy/errors/504.http
咱們事先建立了qlbaas-0f66315f-0ccf-43cb-abca-2bb6f51e8fb2,咱們看看它的配置文件後端
root@netagent:~# ip netns list qlbaas-0f66315f-0ccf-43cb-abca-2bb6f51e8fb2
該負載均衡是1個LoadBalance對應1個listener,1個pool。服務器
在/var/lib/neutron/lbaas/v2/0f66315f-0ccf-43cb-abca-2bb6f51e8fb2/haproxy.conf 中網絡
# Configuration for loadbalance1 global daemon user nobody group haproxy log /dev/log local0 log /dev/log local1 notice stats socket /var/lib/neutron/lbaas/v2/0f66315f-0ccf-43cb-abca-2bb6f51e8fb2/haproxy_stats.sock mode 0666 level user defaults log global retries 3 option redispatch timeout connect 5000 timeout client 50000 timeout server 50000 frontend 62ac018e-f6fc-4d60-80df-13b1e4cdc6f6 option tcplog maxconn 100 option forwardfor bind 2.2.2.20:80 mode http default_backend 8d28b2c3-9c44-46e5-b2eb-7bd9b8d5faf6 backend 8d28b2c3-9c44-46e5-b2eb-7bd9b8d5faf6 mode http balance roundrobin timeout check 1 option httpchk GET /index.html http-check expect rstatus 201|200|202 server d56fc582-33cd-4fc7-b95f-16534c8a4860 2.2.2.5:80 weight 1 check inter 1s fall 5 server cc2230bf-f3b8-4beb-8584-71b0f3a0ba5c 2.2.2.4:80 weight 1 check inter 1s fall 5 server b490cadb-cff1-4e7a-92c7-a134c0f8b321 2.2.2.6:80 weight 1 check inter 1s fall 5
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能夠對應多個Pool,咱們另外又創建一個pool以下所示:
在/var/lib/neutron/lbaas/v2/0f66315f-0ccf-43cb-abca-2bb6f51e8fb2/haproxy.conf 中
# Configuration for loadbalance1 global daemon user nobody group haproxy #能夠由配置項 user_group 指定,默認爲 nogroup log /dev/log local0 log /dev/log local1 notice stats socket /var/lib/neutron/lbaas/v2/0f66315f-0ccf-43cb-abca-2bb6f51e8fb2/haproxy_stats.sock mode 0666 level user defaults #不用管 log global retries 3 option redispatch timeout connect 5000 timeout client 50000 timeout server 50000 frontend 62ac018e-f6fc-4d60-80df-13b1e4cdc6f6 option tcplog maxconn 100 option forwardfor # 當 mode 爲 」http「時,設置 forwardfor,使得經過 X-Forward-For 頭來保存原始的源 IP 地址 bind 2.2.2.20:80 #監聽Listener的vip:port mode http #監聽Protocol default_backend 8d28b2c3-9c44-46e5-b2eb-7bd9b8d5faf6 #對應的監聽池 frontend bf144f31-cdbb-4426-b90b-4bdbc67501f1 option tcplog maxconn 100 option forwardfor bind 2.2.2.20:100 mode http default_backend 8b50ed30-5290-421c-9d31-fb3751a26be2 backend 8b50ed30-5290-421c-9d31-fb3751a26be2 mode http balance roundrobin server bef852d0-9164-46ee-ace5-92462e8d89ef 2.2.2.14:100 weight 1 server 8aeb5cc2-7301-4931-ac3b-e0d0ca891e88 2.2.2.15:100 weight 1 server 250a919f-dfc1-41b6-8378-2b4015f1acd0 2.2.2.16:100 weight 1 backend 8d28b2c3-9c44-46e5-b2eb-7bd9b8d5faf6 mode http balance roundrobin timeout check 1 option httpchk GET /index.html http-check expect rstatus 201|200|202 server cc2230bf-f3b8-4beb-8584-71b0f3a0ba5c 2.2.2.4:80 weight 1 check inter 1s fall 5 # member1 的配置,包括 ip,port(member 提供服務的端口,此時沒有指定check port,所以也是健康檢查的 TCP端口),weight;check 指定作健康檢查;
# inter 指定兩次連續檢查之間的間隔,默認2s (1s);fall 指定 Max Retries 或者連續幾回檢查失敗即認爲member 是 DOWN 的次數 (5) server d56fc582-33cd-4fc7-b95f-16534c8a4860 2.2.2.5:80 weight 1 check inter 1s fall 5 server b490cadb-cff1-4e7a-92c7-a134c0f8b321 2.2.2.6:80 weight 1 check inter 1s fall 5
訪問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
# Configuration for loadbalance3 global daemon user nobody group haproxy log /dev/log local0 log /dev/log local1 notice stats socket /var/lib/neutron/lbaas/v2/5081116f-8928-40d7-8aaa-e30c336ca713/haproxy_stats.sock mode 0666 level user defaults log global retries 3 option redispatch timeout connect 5000 timeout client 50000 timeout server 50000 frontend 84800dd3-0507-4628-b54b-a23226bec4f8 option tcplog maxconn 100 option forwardfor bind 7.7.7.7:80 mode http default_backend 3583deda-e9ca-40bb-ba23-0fec204c099f backend 3583deda-e9ca-40bb-ba23-0fec204c099f mode http balance roundrobin server 48b36860-8e4d-476e-9196-ad052c317f44 2.2.2.5:80 weight 1 server f8732b2a-bfaa-4e5f-b8bb-f88c9fed899b 2.2.2.4:80 weight 1 server 004f7950-4031-4de3-98b2-ca30e39c4e4e 2.2.2.6:80 weight 1
也就是說只要vip與member可通訊便可,不必定要在同一個subnet中。
另外,若是要從外網訪問的話,則還須要建立一個 floating ip 而且把它關聯到 lb 的vip 上。 haproxy 所在的namespace 其實只有一個IP地址,分別接收外部鏈接以及和成員之間的鏈接。
LoadBalancerv2服務能夠獨立部署在服務器上,包括2個服務,neutron-openvswitch-agent 和neutron-lbassv2-agent。假設有2個節點都部署了LoadBalancerv2服務,當neutron-server發出建立請求時,會在這兩個節點選擇一個建立對應得namespace空間。
咱們以qlbaas-0f66315f-0ccf-43cb-abca-2bb6f51e8fb2爲例子來分析這個過程。
ip netns exec qlbaas-0f66315f-0ccf-43cb-abca-2bb6f51e8fb2 ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 9: tap83f82fcf-d1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1 link/ether fa:16:3e:d1:c8:b1 brd ff:ff:ff:ff:ff:ff inet 2.2.2.20/24 brd 2.2.2.255 scope global tap83f82fcf-d1 #vip的地址 valid_lft forever preferred_lft forever inet6 fe80::f816:3eff:fed1:c8b1/64 scope link valid_lft forever preferred_lft forever
該接口tap83f82fcf-d1掛在ovs上,並被打上它所在network的vlan_id的:
Bridge br-int fail_mode: secure Port patch-tun Interface patch-tun type: patch options: {peer=patch-int} Port br-int Interface br-int type: internal Port "tap83f82fcf-d1" tag: 1 Interface "tap83f82fcf-d1" type: internal
對於LoadBalancerv2建立過程(在v2中指Create a load balancer和Create listener完成,咱們發現當只是完成Create a load balancer時候,並無出現namespace,當Create listener完成時纔會有namespace出現)咱們對等以下操做:
ovs-vsctl --if-exists del-port tap83f82fcf-d1 --add-port br-int tap83f82fcf-d1 --set Interface tap83f82fcf-d1 type=internal --set Interface tap83f82fcf-d1 external-ids:iface-id=83f82fcf-d141-4774-87a0-ace79196bc88 --set Interface tap83f82fcf-d1 external-ids:iface-status=active --set Interface tap83f82fcf-d1 external-ids:attached-mac=fa:16:3e:d1:c8:b1 #iface-id 和 attached-mac能夠在數據庫中查到 ip link set tap83f82fcf-d1 address fa:16:3e:d1:c8:b1 ip netns add qlbaas-0f66315f-0ccf-43cb-abca-2bb6f51e8fb2 ip netns exec qlbaas-0f66315f-0ccf-43cb-abca-2bb6f51e8fb2 sysctl -w net.ipv4.conf.all.promote_secondaries=1 ip link set tap83f82fcf-d1 netns qlbaas-0f66315f-0ccf-43cb-abca-2bb6f51e8fb2 ip netns exec qlbaas-0f66315f-0ccf-43cb-abca-2bb6f51e8fb2 ip link set lo up ip link set tap83f82fcf-d1 netns qlbaas-0f66315f-0ccf-43cb-abca-2bb6f51e8fb2 ip netns exec qlbaas-0f66315f-0ccf-43cb-abca-2bb6f51e8fb2 ip link set tap83f82fcf-d1 up ip netns exec qlbaas-0f66315f-0ccf-43cb-abca-2bb6f51e8fb2 ip addr show tap83f82fcf-d1 permanent scope global ip netns exec qlbaas-0f66315f-0ccf-43cb-abca-2bb6f51e8fb2 ip -4 addr add 2.2.2.20/24 brd 255.255.255.0 scope global dev tap83f82fcf-d1 ip netns exec qlbaas-0f66315f-0ccf-43cb-abca-2bb6f51e8fb2 ip route list dev tap83f82fcf-d1 scope link ip netns exec qlbaas-0f66315f-0ccf-43cb-abca-2bb6f51e8fb2 route add default gw 2.2.2.1 ip netns exec qlbaas-0f66315f-0ccf-43cb-abca-2bb6f51e8fb2 arping -U -I tap83f82fcf-d1 -c 3 2.2.2.20
LoadBalancerv2的代碼結構以下:
1.Create a load balancer
2.Create a listener
3.Create a pool
4.Add member
5.Create a health monitor