前言:
在openstack的學習當中有一說法就是網絡占學習時間的百分之七十。這個說法或許有誇大的成分,但不可否認的是openstack中的
網絡是及其重要的部分,並且難度也是相當大。試圖通過nova創建虛擬機過程中nova和neutron服務交互的過程來學習openstack網絡。
寫個學習筆記,整理思路。
版本信息:
openstack版本:Newton
linux系統:ubuntu1604-server
簡要流程:
nova在創建虛擬機時會向neutron請求ip和mac地址等port信息。 大概的代碼流程如下圖所示。
詳細分析:
_build_and_run_instance():
作用:
nova創建虛擬機與底層libvirt交互的函數。在該函數中請求了各種資源,如鏡像,網絡,磁盤等。
通過調用_build_resources()函數整體來獲得資源的請求。
_build_resources()
作用:
調用_build_networks_for_instance()函數獲取port信息。
調用_default_block_device_names()函數獲取塊設備信息。
獲取網絡是重點分析的對象。
_build_networks_for_instance()
作用:
判斷傳入主機信息是否已經分配過ip和mac,如果已經分配過ip和mac就調用get_instance_new_info()函數更新網卡信息。
如果port還沒有被分配ip,mac等,則調用_allocate_network()函數獲取信息。
_allocate_network()
作用:
1 修改vm的狀態為創建中,修改任務狀態為網絡中
2 采用異步的方式起一個線程去執行_allocate_network_async()函數
_allocate_network_async()
作用:
在一個循環中多次嘗試調用_allocate_for_instance()函數去獲取網絡。
allocate_for_instance()
作用:
初始化一個http連接的對象:neutron = get_client(),通過該對象能夠從nova服務端發送restful請求到neutron服務端。
調用_create_ports_for_instance()函數去創建port信息。
補充:
port信息是指一些列網絡元素的集合,實際指的是數據庫中的一張表。
其中可以看到有項目id,uuid,名稱,網絡id等其中我們最關心的是 mac_address 和ip_allocation,不用講太多,這肯定是mac地址和ip地址。
_create_ports_for_instance()
作用:
判斷了安全組是否啟用,並判斷安全組是否配置,如果沒有則配置默認的安全組。
調用_create_port_minimal()函數
_create_port_minimal()
作用:
判斷主機啟動時是否制定了ip地址,如果制定了ip地址則將該ip地址填充進變量port_req_body中,調用port.client的方法
以restful的請求方式去neutron請求port中各變量信息。
到這里為止,nova端的網絡請求就到一段落,請求會發送到neutron-server中,neutron會處理接下來的過程。
關於neutron-server中網絡部分的處理,見下一篇筆記。
參考:http://blog.csdn.net/gj19890923/article/details/51284296