1. 程式人生 > >Devstack搭建基礎開發環境

Devstack搭建基礎開發環境

經驗借鑑

一、環境準備

1. 準備:

      兩臺虛擬機器,第一臺(hostname:devstack)充當控制、網路、計算節點(allinone),第二臺(hostname:devstack-com)充當計算節點。記憶體為8G、磁碟100G全部掛在/下,便於開發。安裝Centos Linux release 7.2.1511,選擇最簡安裝。OpenStack版本將對齊社群Master分支,目前即為開發中Queen版。

2. 網絡卡配置:

eth0  -  模擬業務網  -  (192.168.0.0/24)  ;   eth1  -  模擬管理網  -  (10.134.1.0/24)  ;  eth2  -  模擬外網  -  (10.254.4.0/24)

devstack         -  eth0:192.168.0.156 、eth1:10.134.1.156 、eth2:10.254.4.156

devstack-com -  eth0:192.168.0.157 、eth1:10.134.1.157 

3. 整體規劃如下:

二、自動化安裝(step by step)

1. 配置國內base源:

[[email protected] ~]# cd /etc/yum.repos.d/ ; wget http://mirrors.163.com/.help/CentOS7-Base-163.repo

2. 安裝git工具:

[[email protected]

k ~]# yum install git -y

3. clone原始碼:

[[email protected] ~]# cd /home ; git clone https://github.com/openstack-dev/devstack.git

4. 建立stack使用者:

[[email protected] /home]# /home/devstack/tools/create-stack-user.sh

5. 修改配置檔案:

控制、網路、計算複用節點配置:

說明:HOST_IP為該節點的管理IP、密碼均使用123456最簡密碼。

注: 此配置規劃了將使用的外網網段,即FLOATING_RANGE、Q_FLOATING_ALLOCATION_POOL、PUBLIC_NETWORK_GATEWAY三個欄位配置。若未規劃,可將NEUTRON_CREATE_INITIAL_NETWORKS置為False,可以搭建完成後手動配置。

計算節點配置:

注:此配置中的PLACEMENT_SERVICE_HOST經測試為生效,由於目前Nova程式碼master版本缺少Placement配置會報異常,導致Nova-compute不能正常啟動,即在安裝出錯後,得手動配置,在後面 (7.啟動安裝) 處會詳細說明。

6. 更改檔案使用者:

[[email protected] ~]# chown -R stack:stack /home/devstack/

7. 啟動安裝:

控制、網路、計算複用節點(devstack節點):

[[email protected] ~]# su stack

[[email protected] devstack]$ cd /home/devstack/ ; ./stack.sh

到這裡,devstack節點安裝就完成了。區別於rdo的rpm包安裝,devstack是原始碼安裝。因為要install大量的python依賴,控制節點安裝在2小時左右。

計算節點(devstack-com節點):

[[email protected] devstack]$ cd /home/devstack/ ; ./stack.sh

報錯,發現n-cpu服務並未啟動,可在/etc/nova/nova-cpu.conf中新增如下配置:

執行: [[email protected] ~]# systemctl restart [email protected] , 即可完成安裝。

8. 其餘問題:

1)調整業務網:安裝完發現,業務網走的還是管理網路,

options: {df_default="true", in_key=flow, local_ip="10.134.1.156", out_key=flow, remote_ip="10.134.1.157"}

但實際規劃的是192.168.0.0/24網路做業務網,這裡需要調整/etc/neutron/plugins/ml2/ml2_conf.ini檔案:

重啟服務:systemctl restart [email protected] ,即可。

現在利用ovs-vsctl show命令可觀察到:

options: {df_default="true", in_key=flow, local_ip="192.168.0.156", out_key=flow, remote_ip="192.168.0.157"}

2)手動建立網路:如果之前devstack節點的配置檔案中, NEUTRON_CREATE_INITIAL_NETWORKS設為False,預設不會建立網路,要手動建立:

使用admin租戶、admin使用者: # source /home/devstack/openrc admin admin

建立外部網路: # neutron net-create ext-net --provider:network_type flat --provider:physical_network public --shared --router:external

建立外部子網:# neutron subnet-create ext-net 10.254.4.0/24 --name ext-subnet --allocation-pool start=10.254.4.205,end=10.254.4.215 --gateway 10.254.4.254

使用demo租戶、demo使用者: # source /home/devstack/openrc demo demo

建立租戶網路:# neutron net-create demo-net

建立租戶子網:# neutron subnet-create demo-net 192.168.1.0/24 --name demo-subnet --gateway 192.168.1.1

建立租戶路由:# neutron router-create demo-router

子網接入路由:# neutron router-interface-add demo-router demo-subnet

子網設定閘道器:# neutron router-gateway-set demo-router ext-net

3) cell對映:

社群在O版後,nova引入了cellv2並強制使用,當新增計算節點後,要對映至所屬cell中,執行

# nova-manage cell_v2 discover_hosts --verbose

9. 升級與重灌:

1. 升級devstack程式碼:

# cd /home/devstack/ ; git pull

2. 升級元件程式碼(以nova為例):

# cd /opt/stack/nova/ ; git pull

注意需要重啟nova相關服務,db或者api_db有修改的話,需要把資料庫拉至最新:

# nova-manage db sync

# nova-manage api_db sync

# systemctl restart [email protected] [email protected] [email protected] [email protected] [email protected] [email protected] [email protected] [email protected]

3. 重灌:

# cd /home/devstack/ ; ./unstack.sh     停止服務

# cd /home/devstack/ ; ./clean.sh         刪除已有資料

# cd /home/devstack/ ; ./stack.sh         重新安裝

4. 所有元件升級:

最好的方式就是重灌,並建議刪除/opt/stack下所有元件原始碼,重新clone安裝依賴

三、環境確認、測試

1. 服務狀態確認

Keystone: 服務內部沒有mq通訊,執行# openstack project list , 有顯示即正常。

Nova: 執行# nova service-list , 檢視各服務state是否為up。

Neutron: 執行# neutron agent-list , 檢視alive是否為:-)

Cinder:執行# openstack volume service list ,檢視各服務state是否為up

Glance:服務內部沒有mq通訊,執行#glance image-list , 有映象顯示即正常。

Horizon:本地登陸http://10.134.1.156/dashboard,若本地不通管理網,使用elinks  http://10.134.1.156/dashboard 檢查

2. 建立虛機測試

1. 使用demo租戶、demo使用者

# source /home/devstack/openrc demo demo

2. 建立本地虛機:

# nova boot test --flavor 1 --image cirros-0.3.4-x86_64-disk --nic net-id=89070a3f-1c28-480a-8db6-c59376b0ed07

3. 建立卷虛機:

# nova boot test-vol --flavor 1 --block-device source=image,id=58aa7836-eabb-431c-9247-5787680e6f46,dest=volume,size=1,bootindex=0,shutdown=remove --nic net-id=89070a3f-1c28-480a-8db6-c59376b0ed07

4. 檢視虛機狀態,直至active:

# nova list

5074d02d-8c4c-4d79-8997-5982f0517192 | test | ACTIVE | - | Running | demo-net=192.168.1.11

573961c6-354a-439a-a665-7058e3bc98bb | test-vol | ACTIVE | - | Running | demo-net=192.168.1.4

5. 登陸vnc進行進一步檢視:

# nova get-vnc-console test novnc

novnc | http://10.134.1.156:6080/vnc_auto.html?token=23df2caf-095a-4c00-9933-5cefd0fb47d8

3. 網路狀態確認

1. 外網連通訊檢測,最簡單的方法就是,從本地去ping,netns中qrouter的qg口:

# ip netns exec qrouter-f8d0e07a-bc9f-4642-9892-9711b94c3410 ip a | grep 10.254

inet 10.254.4.210/24 brd 10.254.4.255 scope global qg-63090b03-08

# ping 10.254.4.210

2. 外網snat確認:

通過ns登陸虛擬機器 # ip netns exec qdhcp-89070a3f-1c28-480a-8db6-c59376b0ed07 ssh [email protected],若無法登陸,請放通安全組。

# ping 10.254.4.156

3. floatingip dnat確認:

建立floatingip:# neutron floatingip-create ext-net

繫結floatingip:# neutron floatingip-associate 3f9ecd27-e8c1-429e-a77a-d00af3c3bcaf 28e76da8-9fd6-4d55-b2c9-4b9c1b419c87

5074d02d-8c4c-4d79-8997-5982f0517192 | test | ACTIVE | - | Running | demo-net=192.168.1.11, 10.254.4.208

# ping 10.254.4.208

4. 遷移/熱遷移確認:

1. hosts解析,stack使用者需要互信,這些是devstack不會做的,自己手動配置下,具體方法就不說了

2. 登陸dashboard進行測試,觀察resize後flavor的變化,live-migrate後host的變化,一般都是OK的

四、開發除錯技巧

1. 檢視安裝服務

新版本的devstack用systemd取代了screen來啟動服務

# systemctl | grep devstack

這裡c-開頭的就是cinder服務,g-開頭的就是glance服務,keystone即keystone服務,n-即nova服務,q-即neutron服務,placement-api即nova-placement服務,dstat是以dstat命令為基礎的監控,etcd是分散式儲存服務、作為cinder的分散式鎖。

所有守護程序服務都可以在/etc/systemd/system/下找到對應檔案,即可找到入口及對應引數。

2. 檢視日誌

新版本devstack不再記錄日誌在/var/log 或 /opt/stack/log下,轉而使用journalctl來代替:

# journalctl -a --unit [email protected] | grep XXX 這個相當於之前的 # cat /var/log/nova/nova-compute.log | grep XXX

# journalctl -f --unit [email protected]   這個相當於之前的 # tail -f /var/log/nova/nova-compute.log

3. 斷點除錯

由於目前devstack中很多服務都是依賴httpd啟動的,傳統的關閉守護服務,利用命令啟動加pdb斷點除錯已不再試用,這裡使用社群官方推薦的remote-pdb,即:

from remote_pdb import RemotePdb;RemotePdb('127.0.0.1', 4444).set_trace()   取代之前的   import pdb ; pdb.set_trace()

之後重啟服務即可,呼叫對應api後進入斷點,利用telnet或nc -t命令即可進行除錯。

4. 綜合分析、善用git

這裡以nova為例,比如在Pike版本排程中,提出了基於Placement的Allocation candidates策略,即CPU、MEM、DISK過濾不再經過nova中的對應filter,而是傳送rest請求給Placement服務,利用sql語句(不加以orm封裝的)來直接過濾,得出候選主機。當然,Placement服務還在開發中,我們選擇配置driver=caching_scheduler來遮蔽它,不過在目前(2017/12/20)的nova程式碼中,貌似行不通.......

1、問題復現:

修改nova.conf中的driver = filter_scheduler,改為driver = caching_scheduler,重啟[email protected]服務,再啟動一個虛機,發現ERROR。

2、問題定位:

檢視日誌:# journalctl -a --unit [email protected] | grep ERROR

發現:ERROR oslo_messaging.rpc.server File "/opt/stack/nova/nova/scheduler/manager.py", line 152, in select_destinations

           ERROR oslo_messaging.rpc.server allocation_request_version, return_alternates)

           ERROR oslo_messaging.rpc.server UnboundLocalError: local variable 'allocation_request_version' referenced before assignment

根據Traceback,定位問題發生在scheduler服務中,出錯程式碼為/opt/stack/nova/nova/scheduler/manager.py第152行

3、閱讀程式碼,進一步定位:

85 def select_destinations(self, ctxt, request_spec=None,

...................................

119        alloc_reqs_by_rp_uuid, provider_summaries = None, None

120        if self.driver.USES_ALLOCATION_CANDIDATES:

121            res = self.placement_client.get_allocation_candidates(resources)

122            if res is None:

123                # We have to handle the case that we failed to connect to the

124                # Placement service and the safe_connect decorator on

125                # get_allocation_candidates returns None.

126                alloc_reqs, provider_summaries, allocation_request_version = (

127                        None, None, None)

128            else:

129                (alloc_reqs, provider_summaries,

130                            allocation_request_version) = res

...................................

150        selections = self.driver.select_destinations(ctxt, spec_obj,

151        instance_uuids, alloc_reqs_by_rp_uuid, provider_summaries,

152        allocation_request_version, return_alternates)

發現只有當self.driver.USES_ALLOCATION_CANDIDATES為true時,才能得到allocation_request_version,否則該變數就不存在!!!

3、斷點除錯,確認問題:

在/opt/stack/nova/nova/scheduler/manager.py中插入斷點:

119        alloc_reqs_by_rp_uuid, provider_summaries = None, None

120        from remote_pdb import RemotePdb;RemotePdb('127.0.0.1', 4444).set_trace()

121        if self.driver.USES_ALLOCATION_CANDIDATES:

安裝remote-pdb : # pip install remote-pdb ; 重啟[email protected]服務:systemctl restart [email protected];再次建立虛機

執行 # nc -t 127.0.0.1 4444 進入斷點,進行簡單除錯:

發現caching_scheduler確實是不使用Allocation candidates策略的,引入allocation_request_version是引發這一問題的元凶。

4、利用git查詢程式碼歷史:

# git annotate /opt/stack/nova/nova/scheduler/manager.py

# git log



作者:Remy_XL
連結:https://www.jianshu.com/p/8d2b2637f3d4
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。