octavia的实现与分析(二)·原理,基本架构与基本流程
【了解】
其实说白了,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://lingxiankong.github.io/2017-09-13-octavia.html
https://blog.csdn.net/Jmilk/article/details/84338419#Health_Manager_1343
octavia的实现与分析(二)·原理,基本架构与基本流程的更多相关文章
- openstack octavia的实现与分析(二)原理,架构与基本流程
[了解] 其实说白了,Octavia就是将用户的API请求经过逻辑处理,转换成Haproxy或者Nginx的配置参数,下发到amphora虚机中. Octavia的内部实现中,逻辑流程的处理主要使用T ...
- Java线程池使用和分析(二) - execute()原理
相关文章目录: Java线程池使用和分析(一) Java线程池使用和分析(二) - execute()原理 execute()是 java.util.concurrent.Executor接口中唯一的 ...
- Java线程池ThreadPoolExecutor使用和分析(二) - execute()原理
相关文章目录: Java线程池ThreadPoolExecutor使用和分析(一) Java线程池ThreadPoolExecutor使用和分析(二) - execute()原理 Java线程池Thr ...
- AX中四种库存ABC分析法原理研究
库存ABC分类,简单的说就是抓大放小,是为了让我们抓住重点,用最大精力来管理最重要的物料,而对于不太重要的物料则可以用较少的精力进行管理.它和我们平常说的八二法则有异曲同工之妙. 既然要应用库存ABC ...
- SQLite入门与分析(二)---设计与概念(续)
SQLite入门与分析(二)---设计与概念(续) 写在前面:本节讨论事务,事务是DBMS最核心的技术之一.在计算机科学史上,有三位科学家因在数据库领域的成就而获ACM图灵奖,而其中之一Jim G ...
- 一些有用的javascript实例分析(二)
原文:一些有用的javascript实例分析(二) 5 求出数组中所有数字的和 window.onload = function () { var oBtn = document.getElement ...
- Android ROM开发(二)——ROM架构以及Updater-Script脚本分析,常见的Status错误解决办法
Android ROM开发(二)--ROM架构以及Updater-Script脚本分析,常见的Status错误解决办法 怪自己二了,写好的不小心弄没了,现在只好重新写一些了,上篇简单的配置了一下环境, ...
- Tomcat源码分析——请求原理分析(上)
前言 谈起Tomcat的诞生,最早可以追溯到1995年.近20年来,Tomcat始终是使用最广泛的Web服务器,由于其使用Java语言开发,所以广为Java程序员所熟悉.很多人早期的J2EE项目,由程 ...
- hadoop自带例子SecondarySort源码分析MapReduce原理
这里分析MapReduce原理并没用WordCount,目前没用过hadoop也没接触过大数据,感觉,只是感觉,在项目中,如果真的用到了MapReduce那待排序的肯定会更加实用. 先贴上源码 pac ...
- Spring5源码深度分析(二)之理解@Conditional,@Import注解
代码地址: 1.源码分析二主要分析的内容 1.使用@Condition多条件注册bean对象2.@Import注解快速注入第三方bean对象3.@EnableXXXX 开启原理4.基于ImportBe ...
随机推荐
- So Good They Can't Ignore You
总体而言,这本书的作者的观点就是,你只有做好了,才会有兴趣,而不是一开始就找可能并不存在的所谓兴趣——好多人就败在不停地找这么一个根本就不存在的兴趣.这个观点简直就是拯救那些乔布斯的粉丝:Follow ...
- SQL Server Update 所有表的某一列(列名相同,类型相同)数值
); WITH T AS (SELECT SchemaName = c.TABLE_SCHEMA, TableName = c.TABLE_NAME, ColumnName = c.COLUMN_NA ...
- 毕设(四)ListBox
列表框(ListBox)用于提供一组条目(数据项),用户可以用鼠标选择其中一个或者多个条目,但是不能直接编辑列表框的数据.当列表框不能同时显示所有项目时候,他将自动添加滚动条,使用户可以滚动查阅所有选 ...
- Faster RCNN 爬坑记录
训练 在博客http://blog.csdn.net/Suii_v5/article/details/73776299中介绍了基本的错误类型.我只是做一些自己问题的补充 在error6中,调整nump ...
- FMX中实现PostMessage的方法
首先,做为一个从Windows下转过来的开发人员,许多时候,我们喜欢用PostMessage来触发一些异步执行的代码,但遗憾的是,FMX做为EMB的跨平台库的基础,只提供了SendMessage方法, ...
- 10秒完成Linux系统pip在线安装
对于Python开发攻城狮及系统运维攻城狮来说,pip的安装那是必不可少的一个过程.鉴于网上很多安装过程写得过于复杂,本人根据pip官方手册总结了以下最为快捷的安装方式,只需要2步操作. curl h ...
- FireMonkey下的异形窗体拖动(需要使用FmxHandleToHwnd函数转化一下句柄)
DelphiXE2 Firemoney FMX 的窗体不只是为windows的, 所以很多功能都没有了. 最常见的就是拖拽了 先看 VCL时代 一个经典拖动代码 ReleaseCapture(); S ...
- java集合框架collection(2)ArrayList和LinkedList
ArrayList是基于动态数组实现的list,而LinkedList是基于链表实现的list.所以,ArrayList拥有着数组的特性,LinkedList拥有着链表的特性. 优缺点 ArrayLi ...
- 解决kali linux 2016.2实体机安装后root用户没有声音
Kali Linux系统默认状态下,root用户是无法使用声卡的,也就没有声音.启用的方法如下:(1)在终端执行命令:systemctl --user enable pulseaudio (2)在/e ...
- 基于maven的项目脚手架,一键创建项目的项目模板
制作基于maven的项目脚手架 Springboot的出现极大的简化了项目开发的配置,然而,到真实使用的时候还是会有一堆配置需要设定.比如依赖管理,各种插件,质量扫描配置,docker配置,持续集成配 ...