[了解]
其实说白了, Octavia 就是将用户的 API 请求经过逻辑处理, 转换成 Haproxy 或者 Nginx 的配置参数, 下发到 amphora 虚机中.
Octavia 的内部实现中, 逻辑流程的处理主要使用 TaskFlow 库.
[基本概念]
.LBaas
Load Balancing as a Service, 在 openstack 平台上, LB 被作为一种服务提供给用户, 用户可以按需获取可配置的业务负载分担方案.
.loadbalancer
负载均衡服务的跟对象, 一般为虚机, 用户基于此对负载均衡进行配置和操作.
.VIP
与 LB 关联的 IP 地址, 作为外部访问后端服务的入口.
.Listener
监听器, 用户可通过其配置外部对 VIP 访问的端口, 算法, 类型等等.
.Pool
负责后端的虚拟机池. 在 Haproxy 为 driver 的情况下, 一个 Pool 对应着一个独立的 network namespace 中运行的 HaProxy 进程中管理的 backend.
一个 VIP 只会有一个 Pool.
.Member
Member 对应的是 pool 里面处理网络请求的一个 OpenStack Nova 虚机.
.Health monitor
它用来检测 pool 里面的 member 的状态, 支持很多种检测方法, 在 neutron 里面是可选的.
.L7 Policy
七层转发策略, 描述数据包转发动作.
.L7 Rule
七层转发规则, 描述数据包转发的匹配域.(匹配部分云主机)
基本概念之间的交互流程如下图:
[基本架构]
我们依旧从部分开始介绍:
.Amphora
负载均衡的载体, 一般为云主机.(当然也可以使用物理机, 将多个负载均衡配置到同一 / 两台 Amphora 节点上, 提高数据包转发效率, 但是有单点故障隐患)
.manage-network
管理网络, 通常管理数据走这条线路, 东侧连接 Amphora, 西侧连接 Octavia 服务进程.
.tenant-network
租户网络, 内部通信使用, SLB 转发报文通过租户网络到各个后端服务器上.
.vip-network
服务地址, 主要用于对外提供服务.
PS:vip.NET 和 tenant.NET 可以是同一个网络, 但是在生产环境中建议分开, 以便于更好得划分网络安全隔离.
.VM
后端服务器, 用户的真实服务器.
.health-manager
octavia 里面进行健康检查的进程, 主要有以下两个作用:
1. 监听来自 amphora 虚拟机发来的运行状态数据, 以此更新 lb,listener,pool,member 的状态, 同时更新 listener_statistics 表(可作为计费依据), 最重要的是更新 amphora_health 表.
2. 根据 amphora_health 数据表中的数据, 找到异常状态的 amphora 虚拟机, 对该虚拟机进行更换操作.(即删除旧的虚拟机, 创建新的虚拟机并下发配置)
.house-keeping
名副其实的 Housekeeping(家政)服务, 保障 Octavia 的健康运行.
主要实现三个功能:
SpareAmphora: 清理虚拟机的池子, 确保空闲的 amphorae 池大小.
DatabaseCleanup: 定期清理数据库中已删除的 amphorae 记录.
CertRotation: 定期更新 amphorae 中的证书.
.Octavia Worker
负责完成 API 请求, 是 Octavia 主干功能的执行者.
主要作用是和 nova,neutron 等组件通信, 用于虚拟机调度以及把对于虚拟机操作的指令下发给 octavia agent.
基本流程如下:
[API ]
Balancers | GET | /v2/lbaas/loadbalancers | List Load Balancers |
| POST | /v2/lbaas/loadbalancers/{loadbalancer_id} | Create a Load Balancer |
| GET | /v2/lbaas/loadbalancers/{loadbalancer_id} | Show Load Balancer details |
| PUT | /v2/lbaas/loadbalancers/{loadbalancer_id} | Update a Load Balancer |
| DELETE | /v2/lbaas/loadbalancers/{loadbalancer_id} | Remove a Load Balancer |
| GET | /v2/lbaas/loadbalancers/{loadbalancer_id}/stats | Get Load Balancer statistics |
| GET | /v2/lbaas/loadbalancers/{loadbalancer_id}/status | Get the Load Balancer status tree |
| PUT | /v2/lbaas/loadbalancers/{loadbalancer_id}/failover | Failover a load balancer |
Listeners | GET | /v2/lbaas/listeners | List Listeners |
| POST | /v2/lbaas/listeners | Create Listener |
| GET | /v2/lbaas/listeners/{listener_id} | Show Listener details |
| PUT | /v2/lbaas/listeners/{listener_id} | Update a Listener |
| DELETE | /v2/lbaas/listeners/{listener_id} | Remove a Listener |
| GET | /v2/lbaas/listeners/{listener_id}/stats | Get Listener statistics |
Pools |
|
|
|
| GET | /v2/lbaas/pools | List Pools |
| POST | /v2/lbaas/pools | Create Pool |
| GET | /v2/lbaas/pools/{pool_id} | Show Pool details |
| PUT | /v2/lbaas/pools/{pool_id} | Update a Pool |
| DELETE | /v2/lbaas/pools/{pool_id} | Remove a Pool |
Members |
|
|
|
| GET | /v2/lbaas/pools/{pool_id}/members | List Members |
| POST | /v2/lbaas/pools/{pool_id}/members | Create Member |
| GET | /v2/lbaas/pools/{pool_id}/members/{member-id} | Show Member details |
| PUT | /v2/lbaas/pools/{pool_id}/members/{member_id} | Update a Member |
| PUT | /v2/lbaas/pools/{pool_id}/members | Batch Update Members |
| DELETE | /v2/lbaas/pools/{pool_id}/members/{member_id} | Remove a Member |
Health Monitor |
|
|
|
| GET | /v2/lbaas/healthmonitors | List Health Monitors |
| POST | /v2/lbaas/healthmonitors | Create Health Monitor |
| GET | /v2/lbaas/healthmonitors/{healthmonitor_id} | Show Health Monitor details |
| PUT | /v2/lbaas/healthmonitors/{healthmonitor_id} | Update a Health Monitor |
| DELETE | /v2/lbaas/healthmonitors/{healthmonitor_id} | Remove a Health Monitor |
L7 Policies |
|
|
|
| GET | /v2/lbaas/l7policies | List L7 Policies |
| POST | /v2/lbaas/l7policies | Create an L7 Policy |
| GET | /v2/lbaas/l7policies/{l7policy_id} | Show L7 Policy details |
| PUT | /v2/lbaas/l7policies/{l7policy_id} | Update a L7 Policy |
| DELETE | /v2/lbaas/l7policies/{l7policy_id} | Remove a L7 Policy |
L7 Rules |
|
|
|
| GET | /v2/lbaas/l7policies/{l7policy_id}/rules | List L7 Rules |
| POST | /v2/lbaas/l7policies/{l7policy_id}/rules | Create an L7 Rule |
| GET | /v2/lbaas/l7policies/{l7policy_id}/rules/{l7rule_id} | Show L7 Rule details |
| PUT | /v2/lbaas/l7policies/{l7policy_id}/rules/{l7rule_id} | Update a L7 Rule |
| DELETE | /v2/lbaas/l7policies/{l7policy_id}/rules/{l7rule_id} | Remove a L7 Rule |
Quotas |
|
|
|
| GET | /v2/lbaas/quotas | List Quota |
| GET | /v2/lbaas/quotas/defaults | Show Quota Defaults |
| GET | /v2/lbaas/quotas/{project_id} | Show Project Quota |
| PUT | /v2/lbaas/quotas/{project_id} | Update a Quota |
| DELETE | /v2/lbaas/quotas/{project_id} | Reset a Quota |
Providers |
|
|
|
| GET | /v2/lbaas/providers | List Providers |
| GET | /v2/lbaas/providers/{provider}/flavor_capabilities | Show Provider Flavor Capabilities |
Flavors |
|
|
|
| GET | /v2.0/lbaas/flavors | List Flavors |
| POST | /v2.0/lbaas/flavors | Create Flavor |
| GET | /v2.0/lbaas/flavors/{flavor_id} | Show Flavor Details |
| PUT | /v2.0/lbaas/flavors/{flavor_id} | Update a Flavor |
| DELETE | /v2.0/lbaas/flavors/{flavor_id} | Remove a Flavor |
Flavor Profiles |
|
|
|
| GET | /v2.0/lbaas/flavorprofiles | List Flavor Profiles |
| POST | /v2.0/lbaas/flavorprofiles | Create Flavor Profile |
| GET | /v2.0/lbaas/flavorprofiles/{flavorprofile_id} | Show Flavor Profile Details |
| PUT | /v2.0/lbaas/flavorprofiles/{flavorprofile_id} | Update a Flavor Profile |
| DELETE | /v2.0/lbaas/flavorprofiles/{flavorprofile_id} | Remove a Flavor Profile |
Amphorae |
|
|
|
| GET | /v2/octavia/amphorae | List Amphora |
| GET | /v2/octavia/amphorae/{amphora_id} | Show Amphora details |
| GET | /v2/octavia/amphorae/{amphora_id}/stats | Show Amphora Statistics |
| PUT | /v2/octavia/amphorae/{amphora_id}/config | Configure Amphora |
| PUT | /v2/octavia/amphorae/{amphora_id}/failover | Failover Amphora |
[数据结构]
以上是 octavia 主要数据表的拓扑图.
我们可以发现, load_balancer 表几乎被关联到了所有的关键表, health_monitor 是通过 pool 表去关联到 listener 和 member 的.
opertatingstatus 和 provisioning_status 关联到了所有的关键表, 主要作用是体现当前组件状态.
amphora_health 主要体现 amphora-agent 的状态.
listener_statistics 表, 根据来自 amphorae 虚拟机发送的运行状态数据, 实时维护对应 amphora_id 与 listener_id(主键) 的 bytes_in,bytes_out,active_connections,total_connections 字段, 可以作为计费依据.
[主要流程]
. 创建 loadbalancer
现支持 single 和 active standby(主备双活)两种模式的 loadbalancer.
P 版本只支持 single.
创建 loadbalancer 的参数中可以指定 vip 绑定的 port, 如果没有指定, octavia 会自动 (在 API 层) 创建:
普通创建 lb 时, 在 API 层会创建 lb 和 vip 的数据库记录, 然后把请求交由 worker 处理.
创建 loadbalancer,Octavia 会创建两个虚拟机(active standby).
如果配置 enable_anti_affinity, 则会针对这个 lb 先在 Nova 创建 ServerGroup(这个 ServerGroup 的 ID 会记录在 DB 中), 两个虚拟机就会创建在不同的 host 上.
虚拟机的 flavor,image,network,security group,keypair 信息都是从配置文件中获取.
有了虚拟机后, 同时在入参的 subnet 下给两个虚拟机分别挂载网卡, 并将 VIP 作为 address pair 配置到网卡.
然后, 向虚拟机发送 REST API, 参数中有 VIP 所在 subnet 的 CIDR, 网关 IP,vrrp port 的 Mac 地址, vrrp port 的 IP 地址等信息.
向 amphora 发送消息配置 keepalived 服务( active standby 模式).
至此, 一个 loadbalancer 就创建结束了. 基本上, 后面创建 listener,pool,member,health monitor, 都是围绕这两个虚拟机, 对 haproxy(nginx)和 keepalived 进程进行配置.
在 octavia 中, 资源之间的映射关系如下:
lb: 就是两个管理员 / 租户的虚拟机
listener: 虚拟机里面的一个 haproxy (nginx)进程, frontend 配置
pool: haproxy (nginx)配置中的一个 backend
member: backend 配置中的一个 member
上文中, frontend 指的是前端, 定义一系列监听套字节, 接收客户端请求; backend 指的是后端, 定义一系列后端服务器, 请求转发.
创建完 lb, 登录 amphora 验证创建 lb 后的网络配置, 可以看到默认只能看到管理 IP, 只有在 namespace 中才能看到 vrrp 网卡信息.
amphora-agent 启动脚本是 octavia repo 中 cmd 目录下的 agent.py.
amphora-agent 还做一件事, 定时向 health-monitor 发送 haproxy 的运行时信息, 该信息是通过向 haproxy 进程发送 socket 查询命令获取到.
. 创建 listener 流程
在 Octavia 中, 一个 listener 就对应 amphorae 中一个 haproxy 进程.
首先生成 haproxy 配置文件, 向 amp 发送消息, 生成对应该 listener 的 haproxy 服务脚本.
再次向 amphorae 发送消息启动 haproxy 服务:
先确定 listener 的配置目录 (/var/lib/octavia/{listener-id}/) 在不在
如果是 active standby, 更新 keepalived 对各个 haproxy 的 check 脚本,
/var/lib/octavia/vrrp/check_scripts/haproxy_check_script.sh
启动 haproxy 服务, service haproxy-{listener_id} start
. 创建 pool
创建 pool 的实现基本跟创建 listener 一致, 在 amphorae 中仅仅是在 haproxy 的配置文件增加 backend 配置.
. 添加 member
在添加 member 之前, amphorae 虚拟机上已经有管理 port 和 vrrp port, 其中 vrrp port 在命名空间中.
[参考]
- https://docs.openstack.org/octavia/latest/
- https://blog.csdn.net/Jmilk/article/details/84338419#Health_Manager_1343
来源: https://www.cnblogs.com/liuxia912/p/11209968.html