Octavia 使用
Step 1. 准备租户网络,用户的业务云主机在该网络内。
Step 2. 选定 Load Balancer 服务的 Subnet。
Step 3. 设定 Load Balancer 下属的 Listener,指定监听 HTTP Port: 80 访问请求。
Step 4. 设定 Listener 下属的 Pool,配置 SOURCE_IP 策略,来自同一客户端的请求会持续被分发到指定的一个 Member。
Step 5. 设定 Pool 下属的 Members,添加 Member 的本质是将业务云主机的 IP/MAC 地址绑定到 Pool,HAProxy 是通过主机 IP/MAC 地址来进行分发的,这些 IP 地址将会被作为 server 配置项写入到 haproxy.cfg 文件。
Step 6. 设定 Pool 下属的 Health Monitor,配置使用 PING 方式来检查下属 Member 的健康状态。
测试分析
创建 Load Balancer 的同时会自动创建 Amphora 实例,因为配置了 loadbalancer\_topology = ACTIVE_STANDBY
所以创建了一个 Master Amphora 和一个 Backup Amphora,避免了单点故障。否则就是 Single Amphora,Pike 版本暂不支持 ActiveActive 主主模式。
lb-mgmt-net 是 LB Network,Octavia Controller 与 Amphora 使用该网络进行通信,所以 lb-mgmt-net 也需要接入 OpenStack API/Management Network。
在 Sunbet 中自动创建了 3 个 Port,两个 lb-vrrp 分别是两个 Amphora 的 Port,一个 loadbalance 是 VIP 的 Port。VIP 由运行在 Amphora 上的 Keepalived 维护,遵守 VRRP 虚拟路由冗余协议,支持着 VIP 的高可用。
可以将 VIP 绑定到浮动 IP 从外网进行访问。
创建 LB 时,还会自动创建 Amphora 实例(VIP)的安全组 lb-<Load Balancer ID>
,该安全会随着 LB 下属的 Listeners 的变化(增加/删除了 L4/L7 的 Listener,octavia-worker 会自动增加/删除相应的 Port 的安全组规则)。因为上面设定的 Listener 监听 HTTP Port: 80,所以会自动添加 80(HTTP) 规则。但如果想 Ping/SSH VIP 的话,还需要手动添加 ICMP/SSH 规则。
$ ip netns exec qdhcp-6fd0afdc-c683-4157-8354-dcdd43011dad ssh -i /etc/octavia/.ssh/octavia_ssh_key ubuntu@192.168.0.11 -p 22
可以通过 LB Network 的 DHCP namespace SSH 进入 Amphora。
如图:
上图可以看见 Amphora 只有一张 LB Network 的网卡(通过 IP 地址判断),那接入 Subnet 的网卡呢?
Amphora 会启动一个 namespace amphora-haproxy,Sunbet 的网卡、HAProxy 和 Keepalived 的服务进程都在该 namespace 中运行。
Amphora 中最重要的几个服务进程:
# HAProxy usr/sbin/haproxy -f /var/lib/octavia/b45ed46d-ec04-421b-a0e0-a3268ccea61e/haproxy.cfg -f /var/lib/octavia/haproxy-default-user-group.conf /usr/sbin/haproxy-systemd-wrapper -f /var/lib/octavia/b45ed46d-ec04-421b-a0e0-a3268ccea61e/haproxy.cfg -f /var/lib/octavia/haproxy-default-user-group.conf # Keepalived /usr/sbin/keepalived -D -d -f /var/lib/octavia/vrrp/octavia-keepalived.conf # Amphora Agent,北接 Controller 南对 Member /usr/bin/python2 /usr/local/bin/amphora-agent --config-file /etc/octavia/amphora-agent.conf # 动态获取/释放 IP 地址 /sbin/dhclient -1 -v -pf /run/dhclient.ens3.pid -lf /var/lib/dhcp/dhclient.ens3.leases -I -df /var/lib/dhcp/dhclient6.ens3.leases ens3
查看 Keepalived 的配置文件:
vrrp_script check_script { script /var/lib/octavia/vrrp/check_script.sh interval 5 fall 2 rise 2 } vrrp_instance 09f967f9355b498cb56f11d5bfe32f19 { state BACKUP # 该 Amphora 充当 Backup 路由器 interface eth1 # VIP 对接 Subnet virtual_router_id 1 # VRID priority 90 nopreempt garp_master_refresh 5 garp_master_refresh_repeat 2 advert_int 1 authentication { auth_type PASS auth_pass 2d2cd51 } unicast_src_ip 192.168.0.10 # 与 Master 路由器的对盯方式 unicast_peer { 192.168.0.16 } virtual_ipaddress { 192.168.0.3 # VIP 地址 } track_script { check_script } }
查看 HAProxy 的配置文件:
# Configuration for test_lb1 global daemon user nobody log /dev/log local0 log /dev/log local1 notice stats socket /var/lib/octavia/b45ed46d-ec04-421b-a0e0-a3268ccea61e.sock mode 0666 level user defaults log global retries 3 option redispatch timeout connect 5000 timeout client 50000 timeout server 50000 peers b45ed46dec04421ba0e0a3268ccea61e_peers peer qenPC2HfzYBAclR9HimRSWmYznU 192.168.0.10:1025 peer yKL51Z6MZq1lHKxajQ4sXXuWZmM 192.168.0.16:1025 frontend b45ed46d-ec04-421b-a0e0-a3268ccea61e # 前端服务器 option httplog bind 192.168.0.3:80 # 前端服务器绑定 VIP mode http default_backend 209f2923-f8b1-476b-80e9-6ac2a5145ca1 # 默认后端服务器 backend 209f2923-f8b1-476b-80e9-6ac2a5145ca1 # 后端服务器 mode http balance source # 负载均衡服务器 timeout check 5s # Health Check 间隔 server 34e36204-48dc-4c2c-95dc-bb9e6a3f9fbd 192.168.0.8:80 weight 1 check inter 5s fall 3 rise 3 # Real Server,用户业务云主机 instance1 server 97cba054-4f8c-4a9f-91e2-56973efcb417 192.168.0.9:80 weight 2 check inter 5s fall 3 rise 3 # Real Server,用户业务云主机 instance2
如图:
修改 Health Monitor 为 HTTP GET URI 方式的话,haproxy.cfg 变更为:
backend 209f2923-f8b1-476b-80e9-6ac2a5145ca1 mode http balance source timeout check 5s option httpchk GET /api http-check expect rstatus 200 server 34e36204-48dc-4c2c-95dc-bb9e6a3f9fbd 192.168.0.8:80 weight 1 check inter 5s fall 3 rise 3 server 97cba054-4f8c-4a9f-91e2-56973efcb417 192.168.0.9:80 weight 2 check inter 5s fall 3 rise 3
可以通过指令 openstack loadbalancer l7policy create
和 openstack loadbalancer l7rule create
来创建七层的 Policy 和 Rule。当创建 L7 Rule 时,会为 frontend 添加 ACL 规则。e.g.
frontend b45ed46d-ec04-421b-a0e0-a3268ccea61e option httplog bind 192.168.0.3:80 mode http acl dc6f6294-b7ca-4684-8f15-8f1dbf86185a path -m reg / # 满足 acl 规则的请求重定向至 http://www.baidu.com redirect location http://www.baidu.com if dc6f6294-b7ca-4684-8f15-8f1dbf86185a default_backend 209f2923-f8b1-476b-80e9-6ac2a5145ca1
最后
除了上述提到功能外,Ocatvia 还支持许多更加细致的七层负载均衡分发配置,比如:最大连接数、会话保持类型、附加 HTTP Header 字段、TLS Termination、L7 策略动作类型、L7 规则类型等等,都是非常精彩的负载均衡分发实现。碍于篇幅的原因,我们下次再聊。
参考:https://blog.csdn.net/jmilk/article/details/81279795