1. 程式人生 > >Openstack neutron l3 HA的實現

Openstack neutron l3 HA的實現

記錄學習neutron l3 HA實現的過程。

1.  router所在的所有節點的namespace中都會啟動keepalived服務,通過keepalived服務來控制節點的選舉:

keepalived的程序: keepalived -P -f /var/lib/neutron/ha_confs/d188f462-ae87-455d-9445-da00c842e78e/keepalived.conf -p /var/lib/neutron/ha_confs/d188f462-ae87-455d-9445-da00c842e78e.pid -r /var/lib/neutron/ha_confs/d188f462-ae87-455d-9445-da00c842e78e.pid-vrrp keepalived的配置檔案:  vrrp_instance VR_1 {     state BACKUP     interface ha-eca0c14d-f0     virtual_router_id 1     priority 50     nopreempt     advert_int 1     track_interface {         ha-eca0c14d-f0     }     virtual_ipaddress {         169.254.0.1/24 dev ha-eca0c14d-f0     }     virtual_ipaddress_excluded {         10.168.89.167/24 dev qg-eb9e70a6-0a         172.16.5.1/24 dev qr-ca16028e-41         fe80::f816:3eff:febb:31bc/64 dev qr-ca16028e-41 scope link         fe80::f816:3eff:fee8:4fda/64 dev qg-eb9e70a6-0a scope link     }     virtual_routes {         0.0.0.0/0 via 10.168.89.254 dev qg-eb9e70a6-0a     } } kilo neutron l3 ha的實現 主要圍繞以下幾個問題: 1. l3 agent的排程策略 2. keepalived 和 neutron-keepalived-state-change 服務是什麼時候建立的 3. keepalived 和 neutron-keepalived-state-change 如何實現l3 ha 4. l3 ha 通常會遇到的問題以及解決的辦法 neutron l3 相關的程式碼: 1. 配置檔案中配置了service_plugins 指定載入l3_router_plugin: service_plugins = neutron.services.l3_router.l3_router_plugin.L3RouterPlugin 其中plugin_type 設定成了constants.L3_ROUTER_NAT,   所以之後可以通過 manager.NeutronManager.get_service_plugins().get(service_constants.L3_ROUTER_NAT)來獲得這個plugin
2.  l3_router_plugin中定義了supported_extension_aliases = ["dvr", "router", "ext-gw-mode", "extraroute", "l3_agent_scheduler", 
"l3-ha"] 繼承的順序如下: common_db_mixin.CommonDbMixin, extraroute_db.ExtraRoute_db_mixin, l3_hamode_db.L3_HA_NAT_db_mixin, l3_gwmode_db.L3_NAT_db_mixin, l3_dvrscheduler_db.L3_DVRsch_db_mixin, l3_hascheduler_db.L3_HA_scheduler_db_mixin  一 建立router,執行的操作: 1. neutron server呼叫l3_hamode_db.L3_HA_NAT_db_mixin.create_router     1.1. 呼叫l3_db.L3_NAT_dbonly_mixin.create_router方法建立資料庫記錄     1.2. _create_ha_network如果當前沒有ha network會建立ha network和 ha subnet, 同時會建立ha network和tenant的關係: 表ha_router_networks     1.3. _set_vr_id設定vrid(virtual router id)會在keepalived中使用, 用於識別同一個租戶下的不同router,  vrid的返回是1 到 254, 所以一個tenant最多隻能建立254個router     1.4  _create_ha_interfaces 根據配置檔案的min_l3_agent_per_router 和 max_l3_agent_per_router 以及當前l3_agent的個數來在HA Network上建立port            同時給這些port和router做繫結關係, agent和state初始化為null(表: ha_router_agent_port_bindings)     1.5  _notify_ha_interfaces_update,             1.5.1: scheduler router, kilo中支援兩種排程策略(ChanceScheduler 和 LeastRouterScheduler)可以在neutron.conf中router_scheduler_driver指定。                         ChanceScheduler: 表示隨機分配策略
                        LeastRouterScheduler:  表示最少router優先的策略                         其中schedule_router的過程中還會執行bind_router操作,這個操作其實是將ha_router_agent_port_binding表中的ha port分配給agent, 同時建立router和agent的關係(routerl3agentbindings)            1.5.2: rpc_cast, "routers_updated" 給這個router所分配的所有router 2. neutron l3 agent, agent/l3/agent.py       l3_agent的處理過程: L3NATAgent在初始化過程中會建立一個queue(queue裡面存各個router的事件): self._queue = queue.RouterProcessingQueue(),     l3_agent會有一個迴圈不斷處理queue裡面的資料(_process_routers_loop)。如果處理過程中出現異常會觸發一次fullsync,保證這個l3_agent是最新的一個狀態。後面需要學習fullsync的過程。     routers_updated 所做的操作:     2.1  _process_router_if_compatible(檢查相容性)           2.1.1 檢查配置檔案中的external_network_bridge是否存在。          2.1.2 如果沒有指定use_namespaces,則l3_agent只能處理一個router,所以判斷更新事件的router_id和配置中的router_id是否一致。(這種情況可以忽略,現在一般都會用namespace)          2.1.3 如果router沒有指定external gateway,且該agent不支援internal router(配置檔案中:handle_internal_only_routers),丟擲RouterNotCompatibleWithAgent異常
         2.1.4 之前的router_info中沒有存改router資訊執行_process_added_router, 否則_process_updated_router     2.2 _process_added_router(處理新增的router)          2.2.1 建立ha_router.HaRouter物件, 其中建立了namespaceManager 和iptablesManager          2.2.2 呼叫ha_router的initialize               2.2.2.1 router_info的initialize 建立namespace,同時setup lo設定以及設定namespace的網路轉發引數, sysctl -w net.ipv4.ip_forward=1               2.2.2.2 _init_keepalived_manager,  建立keepalivedManager,初始化一些keepalived的引數(比如,vrid、ha_subnet_cidr等),但是還沒有建立程序。               2.2.2.3 ha_network_added, 建立物理裝置(ha_port, tag是由哪個值決定的?),把它繫結到br-int上,並將它放到namespace裡面,同時配置相應的ip地址,169.254.192.x/18              $ ovs-vsctl --timeout=10 --oneline --format=json -- --if-exists del-port ha-255eb1bf-7d -- add-port  br-int ha-255eb1bf-7d -- set Interface ha-255eb1bf-7d type=internal external_ids:iface-id=255eb1bf-7ba7-41d7-bc36-029e541bedfd external_ids:iface-status=active external_ids:attached-mac=fa:16:3e:3d:3e:ce  這個居然會建立tag ?? 應該是ovs-agent會建立相應的tag,得驗證, external_ids只是為了儲存資訊。               2.2.2.4 update_initial_state, 判斷是否keepalived的vip (vip的值怎麼決定的?初始化的時候哪個節點作為vip節點?vip是由第一個可用的cidr為24的範圍決定,初始化時所有的節點都為backup節點)在當前agent的ha設定上來判斷當前節點是master還是slave,同時會回撥ensure_state_change來設定狀態值。               2.2.2.5 spawn_state_change_monitor 建立neutron-keepalived-state-change程序, 引數包括router_id,  namespace ,conf_dir, monitor_interface, monitor_cidr, pid_file, state_path, user 以及group          2.2.3 呼叫ha_router的process               2.2.3.1  _ process_internal_ports,  處理router繫結的內部interface的port,剛建立的router還沒有繫結interface,所以忽略。               2.2.3.2  process_external, 處理floatingip的繫結,同時執行iptables相關的規則。               2.2.3.3  enable_keepalived, 啟動keepalived的程序。 直到這整個建立router的過程結束。 二 neutron-keepalived-state-change服務是怎麼判斷節點狀態的變化 1. 首先neutron-keepalived-state-change會啟動一個非同步程序(ip -o monitor address)去監聽router namespace下ip地址的變化 2. 遍歷所有地址的變化,有地址的增加則認為是master, 其它地址變化都是backup 3. 更改keepalived資料夾下的state檔案, state檔案儲存了router在當前agent的狀態(master/backup) 4. 通過unix domain socket來通知l3_agent 服務節點狀態的變化。 (unix domain socket的server在初始化l3_agent的時候建立.ha.AgentMixin)

參考文件: https://wiki.openstack.org/wiki/Neutron/L3_High_Availability_VRRP

相關推薦

Openstack neutron l3 HA實現

記錄學習neutron l3 HA實現的過程。 1.  router所在的所有節點的namespace中都會啟動keepalived服務,通過keepalived服務來控制節點的選舉: keepalived的程序: keepalived -P -f /var/lib/ne

openstack neutron L3 HA

作者:Liping Mao  發表於:2014-08-20 版權宣告:可以任意轉載,轉載時請務必以超連結形式標明文章原始出處和作者資訊及本版權宣告 最近Assaf Muller寫了一篇關於Neutron L3 HA的文章很不錯。 建議看原文,地址如下: http:/

理解 OpenStack 高可用(HA)(2):Neutron L3 Agent HA 之 虛擬路由冗餘協議(VRRP)

本系列會分析OpenStack 的高可用性(HA)概念和解決方案: 1. 基礎知識 1.1 虛擬路由冗餘協議 - VRRP 1.1.1 概念     路由器是整個網路的核心。一個網路內的所有主機往往都設定一條預設路由,這樣,主機發出的目的地址不在本網段的報文將被通過預設路由

openstack-- neutron 二/三層網路實現探究

引出 Neutron 是openstack 中提供網路虛擬化的元件,根據二層網路的實現方式不同(即agent的不同),可以分為Linux bridge的方式,Openvswitch的方式。而且,lay2 network分為local,flat,vlan,vxlan 等型別(gre與vxlan類似,不再

Neutron 理解 (6): Neutron 是怎麼實現虛擬三層網路的 [How Neutron implements virtual L3 network]

學習 Neutron 系列文章:     Neutron 對虛擬三層網路的實現是通過其 L3 Agent (neutron-l3-agent)。該 Agent 利用 Linux IP 棧、route 和 iptables 來實現內網內不同網路內的虛機之間的網路流量

OpenStack neutron 環境雲主機使用keepalived vip + 給vip綁定浮動IP 步驟及註意事項

cut associate http 其它 配置 ups work all net 在openstack環境創建的多臺雲主機配置keepalived作主備,默認情況下無法生效,直接對雲主機一張網卡配置兩個IP進行測試也是同樣結果,因為: 可以看到,port所在的宿主機上i

帶著問題了解Openstack Neutron安全組

ont 全局 sta 允許 allow top nat ingress env 本文是由最近一個Openstack Neutron安全組的問題所觸發而寫。希望之後借此機會深入探討一下iptables和netfilter相關用法、原理等。 本節先看看網絡問題的解決思路以及Op

openstack neutron 簡單理解

ima tps restfu 防火墻服務 容易 gin ice span nova api 分析1)位於最上層的Neutron Server充當一個門派中的“掌門人”角色(RESTful Server),負責接受來自外部門派(項目)的API請求,比如Nova API創建網絡

ceph(5)--Ceph 與 OpenStack 集成的實現

drs 臨時 all clas lib fighting 支持 檢查 mage 理解 OpenStack + Ceph 系列文章: (1)安裝和部署 (2)Ceph RBD 接口和工具 (3)Ceph 物理和邏輯結構 (4)Ceph 的基礎數據結構 (5)Ceph 與 Op

zookeeper HA 實現負載均衡

在網上看到太多千篇一律的zookeeper相關的文章,都是定義,沒有一個是有完整程式碼的,這對自己學習zk十分困難,其實要用zk實現主備切換、負載均衡其實沒有自己想象的那麼難,只需要瞭解zk的基本特性即可。在這裡貼上自己寫的程式碼與自己的理解,大家多多指教! 一、

CODIS2 x原理 之 CODIS-HA實現原理

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

理解OpenShift(1):網路之 Router 和 Route Neutron 理解 (7): Neutron 是如何實現負載均衡器虛擬化的

 理解OpenShift(1):網路之Router 和 Route   1. OpenShift 為什麼需要 Router 和 Route? 顧名思義,Router 是路由器,Route 是路由器中配置的路由。OpenShift 中的這兩個概念是為了解決從叢集外部(就是從除了叢集節點

openstack使用linux bridge實現local network

版本資訊 openstack版本 pike 控制節點主機 openstack-controller(ubuntu 16.04.5) 172.27.34.37 計算節點主機 openstack-computer

openstack使用linux bridge實現flat network

版本資訊 openstack版本 pike 控制節點主機 openstack-controller(ubuntu 16.04.5) 172.27.34.37 計算節點主機 openstack-comput

CODIS2.x原理 之 CODIS-HA實現原理

作者:鄒祁峰 郵箱:[email protected] 部落格:http://blog.csdn.net/qifengzou 日期:2016.07.25 16:58:22 轉載請註明來自”祁峰”的CSDN部落格 CODIS-HA是用於保

OpenStack neutron刪除網路裝置出錯解決辦法

From: https://www.cnblogs.com/starof/p/4224342.html 目標:要刪除外網Ext-Net2 直接刪網路也會出錯:因為有一個或多個埠在使用該網路 [email protected]:~# neutron net-list +--

openstack neutron學習(一) ---- neutron-server入口

宣告: 本部落格歡迎轉發,但請保留原作者資訊! 內容系本人學習、研究和總結,如有雷同,不勝榮幸! 參考資料 通過devstack啟動neutron服務的配置 通過devstack啟動neutron服務需要在localrc中加入如下配置: disable_

OpenStack Heat 如何來實現和支援編排

OpenStack Heat 介紹 Heat 是一個基於模板來編排複合雲應用的服務。 它目前支援亞馬遜的 CloudFormation 模板格式,也支援 Heat 自有的 Hot 模板格式。模板的使用簡化了複雜基礎設施,服務和應用的定義和部署。模板支援豐富的資源型別,不僅覆蓋了常用的基礎架構,包

解讀Mirantis最新的OpenStack Neutron效能測試

最近,mirantis的工程師釋出了最新的基於Mitaka版本的Neutron效能測試結果。得出的結論是:Neutron現在的效能已經可以用生產環境了。報告的三位作者都是OpenStack社群的活躍開發者,其中一位還是Neutron的core reviewer。並且這份報告出

理解 OpenStack 高可用(HA) (4): Pacemaker 和 OpenStack Resource Agent (RA)

本系列會分析OpenStack 的高可用性(HA)概念和解決方案: 1. Pacemaker 1.1 概述     Pacemaker 承擔叢集資源管理者(CRM - Cluster Resource Manager)的角色,它是一款開源的高可用資源管理軟體,適合各種大小叢集