【瞭解】
其實說白了,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