搭建實(shí)戰(zhàn):從架構(gòu)規(guī)劃到故障排查全指南)
搭建OpenStack云平臺(tái)這事聽著像是只有大廠運(yùn)維才碰的東西實(shí)際上我身邊不少做虛擬化、做K8s底層支撐的同行都在自己折騰這套。原因也很簡(jiǎn)單公有云雖然省事但數(shù)據(jù)面、網(wǎng)絡(luò)面、計(jì)費(fèi)面都捏在別人手里想要完全可控的私有云OpenStack幾乎是目前唯一一個(gè)既有社區(qū)活躍度、又有生產(chǎn)驗(yàn)證的開源選擇。這篇文章把我從規(guī)劃、部署到排錯(cuò)全流程的經(jīng)驗(yàn)拆開寫出來(lái)。不繞彎子先從最關(guān)鍵的架構(gòu)決策講起再一步步給你能直接抄作業(yè)的命令和配置最后把我踩過(guò)的坑、排查過(guò)的故障一并交代清楚。無(wú)論你是剛接觸OpenStack的新手還是被分配了搭建任務(wù)的運(yùn)維開發(fā)這套流程應(yīng)該都能幫你少走很多彎路。1. 為什么要自己搭一套OpenStack而不是直接用現(xiàn)成云1.1 私有云的真實(shí)需求先說(shuō)一個(gè)很多人沒(méi)想明白的問(wèn)題你到底是需要“一朵云”還是只需要“幾臺(tái)虛擬機(jī)”如果是后者裝個(gè)KVM、裝個(gè)Proxmox VE就夠了完全沒(méi)必要上OpenStack。OpenStack的價(jià)值在于它把計(jì)算、存儲(chǔ)、網(wǎng)絡(luò)這三塊資源做成了統(tǒng)一的、可調(diào)度的、有租戶隔離的云平臺(tái)。我做過(guò)的模擬項(xiàng)目X就是這樣業(yè)務(wù)方要求為內(nèi)部多個(gè)團(tuán)隊(duì)提供按需申請(qǐng)的計(jì)算資源每個(gè)團(tuán)隊(duì)要有獨(dú)立的網(wǎng)絡(luò)隔離、獨(dú)立的賬號(hào)權(quán)限、獨(dú)立的鏡像管理還要能通過(guò)自助界面申請(qǐng)資源。這種需求用單機(jī)虛擬化根本撐不起來(lái)必須有一個(gè)帶認(rèn)證、帶配額、帶網(wǎng)絡(luò)的云管平臺(tái)。OpenStack恰好就是解決這一類問(wèn)題的。當(dāng)然選擇OpenStack也意味著接受它的復(fù)雜度。組件多、服務(wù)多、概念多任何一個(gè)環(huán)節(jié)配錯(cuò)都可能導(dǎo)致整個(gè)系統(tǒng)不可用。這也是為什么我建議第一次搭建時(shí)不要追求生產(chǎn)級(jí)的高可用先把核心組件跑通理解了服務(wù)之間的依賴關(guān)系再考慮擴(kuò)展。1.2 裸機(jī)虛擬化、K8s和OpenStack的區(qū)別很多剛接觸云計(jì)算的人會(huì)把OpenStack和Kubernetes混為一談其實(shí)兩者的定位完全不同。K8s管的是容器OpenStack管的是虛擬機(jī)也可以管裸機(jī)但那是Ironic組件的事。K8s的調(diào)度對(duì)象是PodOpenStack的調(diào)度對(duì)象是實(shí)例。K8s本身不關(guān)心底層的計(jì)算資源是怎么來(lái)的而OpenStack正好負(fù)責(zé)把計(jì)算資源池化、虛擬化、網(wǎng)絡(luò)化。實(shí)際生產(chǎn)環(huán)境里完全可以用OpenStack作為IaaS層在它上面再部署K8s集群這樣K8s的節(jié)點(diǎn)可以按需擴(kuò)容底層資源由OpenStack統(tǒng)一調(diào)度。我見過(guò)一個(gè)挺典型的場(chǎng)景某公司原本直接用物理機(jī)部署K8s擴(kuò)容一次要采購(gòu)硬件、人工裝機(jī)、配置網(wǎng)絡(luò)周期動(dòng)輒兩周。后來(lái)改成OpenStack提供虛擬機(jī)作為K8s節(jié)點(diǎn)擴(kuò)容時(shí)間縮短到分鐘級(jí)而且節(jié)點(diǎn)規(guī)格可以通過(guò)flavor靈活調(diào)整資源利用率明顯提升。1.3 先想清楚這幾件事再動(dòng)手動(dòng)手之前有幾個(gè)問(wèn)題必須先有答案否則搭建過(guò)程中很容易反復(fù)返工。第一網(wǎng)絡(luò)方案。Neutron支持Flat、VLAN、VXLAN等多種模式選擇哪種直接影響物理交換機(jī)的配置、IP地址規(guī)劃、租戶網(wǎng)絡(luò)的隔離方式。我建議第一次搭建用VLAN模式兼容性好排查問(wèn)題也比VXLAN簡(jiǎn)單。第二存儲(chǔ)方案。如果只是測(cè)試環(huán)境用本地磁盤加LVM就夠了不需要單獨(dú)部署Cinder。如果涉及塊存儲(chǔ)服務(wù)就要考慮后端存儲(chǔ)怎么接是Ceph還是NFS還是其他商業(yè)存儲(chǔ)這會(huì)顯著影響架構(gòu)復(fù)雜度。第三版本和部署工具。OpenStack每半年左右發(fā)一個(gè)版本社區(qū)推薦的部署工具也在變化選型時(shí)需要確認(rèn)是手動(dòng)部署還是自動(dòng)化部署這決定了后續(xù)的工程量和維護(hù)成本。2. 環(huán)境規(guī)劃與版本選型決定后續(xù)是否踩坑2.1 節(jié)點(diǎn)規(guī)劃與硬件建議一套最精簡(jiǎn)的OpenStack環(huán)境至少需要兩個(gè)節(jié)點(diǎn)一個(gè)控制節(jié)點(diǎn)一個(gè)計(jì)算節(jié)點(diǎn)??刂乒?jié)點(diǎn)承載認(rèn)證、鏡像、調(diào)度、網(wǎng)絡(luò)管理等服務(wù)計(jì)算節(jié)點(diǎn)負(fù)責(zé)運(yùn)行虛擬機(jī)實(shí)例。實(shí)際搭建時(shí)我給模擬項(xiàng)目X分配的節(jié)點(diǎn)方案如下節(jié)點(diǎn)角色服務(wù)組件最低配置建議備注控制節(jié)點(diǎn)Keystone、Glance、Placement、Nova API、Neutron Server、Horizon4核CPU / 8GB內(nèi)存 / 100GB硬盤建議系統(tǒng)盤與數(shù)據(jù)盤分開計(jì)算節(jié)點(diǎn)Nova Compute、Neutron Agent、KVM/QEMU8核CPU / 16GB內(nèi)存 / 200GB硬盤根據(jù)業(yè)務(wù)量彈性調(diào)整可選存儲(chǔ)節(jié)點(diǎn)Cinder、Ceph按容量規(guī)劃測(cè)試環(huán)境可省略如果你只有一臺(tái)物理服務(wù)器也可以把控制節(jié)點(diǎn)和計(jì)算節(jié)點(diǎn)放在同一臺(tái)機(jī)器上但這種單節(jié)點(diǎn)模式只適合學(xué)習(xí)驗(yàn)證不適合運(yùn)行真實(shí)業(yè)務(wù)。2.2 網(wǎng)絡(luò)方案怎么選網(wǎng)絡(luò)是OpenStack里最復(fù)雜也最容易出問(wèn)題的部分。我把常見三種模式的特點(diǎn)整理成了一張表網(wǎng)絡(luò)模式隔離方式優(yōu)點(diǎn)缺點(diǎn)Flat不隔離配置最簡(jiǎn)單只能用于測(cè)試VLAN802.1Q虛擬局域網(wǎng)兼容性好、性能穩(wěn)定依賴物理交換機(jī)配置VXLANOverlay隧道大規(guī)模擴(kuò)展性好故障排查難度較大我個(gè)人的建議是第一次搭建用VLAN模式將物理網(wǎng)卡劃分出管理網(wǎng)、數(shù)據(jù)網(wǎng)和外部網(wǎng)。管理網(wǎng)用于服務(wù)之間的通信數(shù)據(jù)網(wǎng)承載虛擬機(jī)流量外部網(wǎng)用于訪問(wèn)云主機(jī)。三個(gè)網(wǎng)絡(luò)盡量用不同網(wǎng)段和不同物理網(wǎng)卡避免流量互相干擾。2.3 版本和部署工具的選型邏輯OpenStack的版本代號(hào)從字母A到Z按字母表命名每個(gè)字母對(duì)應(yīng)一個(gè)版本。我搭建時(shí)用的是Yoga版本算是比較穩(wěn)定可靠的一個(gè)版本不同發(fā)行版自帶的OpenStack包版本不同需要先確認(rèn)發(fā)行版軟件源里提供的版本。部署工具方面有幾種選擇一是純手動(dòng)部署按照官方文檔逐個(gè)安裝配置服務(wù)。這種方式最能幫助你理解各個(gè)組件的原理但工作量大容易出錯(cuò)適合學(xué)習(xí)場(chǎng)景。二是使用RDO或PackStack這是基于某個(gè)Linux發(fā)行版的OpenStack部署工具可以用一條命令搭建基礎(chǔ)環(huán)境適合快速驗(yàn)證。三是以Kolla-Ansible為代表的容器化部署方案把OpenStack服務(wù)打包成容器配合Ansible自動(dòng)化編排。這種方式是目前生產(chǎn)環(huán)境的主流選擇升級(jí)回滾方便部署一致性好。我在正式交付給某公司做內(nèi)部培訓(xùn)時(shí)用的就是Kolla-Ansible方案。但如果你希望把OpenStack的內(nèi)部機(jī)制徹底搞懂我建議至少手動(dòng)部署一次核心組件這個(gè)認(rèn)知價(jià)值無(wú)法替代。提示無(wú)論選擇哪種部署方式都建議先在虛擬機(jī)里做一遍完整的演練。不要在物理機(jī)上一上來(lái)就跑全程OpenStack部署過(guò)程中的各種網(wǎng)絡(luò)配置、依賴沖突、服務(wù)啟動(dòng)失敗在小規(guī)模實(shí)驗(yàn)環(huán)境里更容易定位問(wèn)題。3. 基礎(chǔ)環(huán)境配置系統(tǒng)、網(wǎng)絡(luò)與依賴3.1 操作系統(tǒng)與基礎(chǔ)服務(wù)OpenStack對(duì)操作系統(tǒng)要求不低但核心原則就是使用長(zhǎng)期支持版本避免新版本軟件源不穩(wěn)定。我搭建時(shí)用的是基于Linux內(nèi)核的主流服務(wù)器發(fā)行版LTS版本這類系統(tǒng)社區(qū)支持時(shí)間長(zhǎng)、軟件包齊全、遇到問(wèn)題容易搜到答案。系統(tǒng)裝好之后第一件事就是配置主機(jī)名和hosts文件。三個(gè)節(jié)點(diǎn)的主機(jī)名我規(guī)劃為controller、compute1在/etc/hosts中把節(jié)點(diǎn)IP和主機(jī)名的對(duì)應(yīng)關(guān)系寫清楚。這一步看似簡(jiǎn)單但很多服務(wù)之間是通過(guò)主機(jī)名通信的如果hosts配置錯(cuò)誤后面會(huì)出現(xiàn)各種詭異的認(rèn)證失敗和服務(wù)連接超時(shí)。然后創(chuàng)建一個(gè)專用的系統(tǒng)用戶用于執(zhí)行OpenStack相關(guān)操作。生產(chǎn)實(shí)踐中不建議直接用root操作因?yàn)镺penStack的配置文件、日志文件、虛擬化操作都有獨(dú)立的權(quán)限體系單獨(dú)的用戶便于管理和審計(jì)。3.2 網(wǎng)卡和橋接配置實(shí)操以控制節(jié)點(diǎn)為例通常需要至少兩塊網(wǎng)卡一塊用于管理網(wǎng)絡(luò)一塊用于外部網(wǎng)絡(luò)。在配置網(wǎng)絡(luò)之前先確認(rèn)物理網(wǎng)卡的名稱然后編輯網(wǎng)絡(luò)配置文件。管理網(wǎng)卡的配置比較簡(jiǎn)單設(shè)置靜態(tài)IP即可。外部網(wǎng)卡需要配置為橋接模式因?yàn)樵贠penStack里外部網(wǎng)絡(luò)是通過(guò)網(wǎng)橋與物理網(wǎng)絡(luò)連接的。我用一個(gè)例子來(lái)說(shuō)明cat /etc/network/interfaces.d/br-ex.cfgauto br-ex iface br-ex inet static address 192.168.68.20 netmask 255.255.255.0 gateway 192.168.68.1 dns-nameservers 192.168.68.1這段配置的含義是創(chuàng)建一個(gè)名為br-ex的Linux網(wǎng)橋給它配置靜態(tài)IP地址。物理網(wǎng)卡上不配置IP而是把它加入網(wǎng)橋。這樣虛擬機(jī)通過(guò)網(wǎng)橋就能訪問(wèn)外部網(wǎng)絡(luò)配置思路跟家用路由器里的“橋接模式”是一個(gè)道理。配置完成后一定要重啟網(wǎng)絡(luò)服務(wù)并驗(yàn)證連通性我在早期搭建時(shí)經(jīng)常遇到網(wǎng)卡配置沖突導(dǎo)致SSH斷開的問(wèn)題所以強(qiáng)烈建議在本地控制臺(tái)或帶外管理界面操作網(wǎng)絡(luò)配置避免把自己鎖在外面。3.3 時(shí)鐘同步與軟件源OpenStack的認(rèn)證服務(wù)高度依賴精確時(shí)間時(shí)間偏差超過(guò)幾分鐘就可能導(dǎo)致令牌校驗(yàn)失敗。NTP是必須配置的控制節(jié)點(diǎn)同步外部時(shí)間源計(jì)算節(jié)點(diǎn)同步控制節(jié)點(diǎn)。chronyc sources -v配置完成后用這條命令檢查時(shí)間同步狀態(tài)。如果輸出顯示時(shí)間源處于活躍狀態(tài)說(shuō)明同步正常如果顯示^*或*符號(hào)說(shuō)明已鎖定到時(shí)間源。軟件源也建議提前配置因?yàn)镺penStack組件依賴大量其他軟件包默認(rèn)軟件源下載速度慢或者缺少必要包會(huì)導(dǎo)致安裝中斷。我記得有一次安裝網(wǎng)絡(luò)服務(wù)時(shí)因?yàn)橐蕾嚢姹緵_突整整花了一個(gè)下午排查最后發(fā)現(xiàn)是軟件源里的包版本和OpenStack版本不匹配。4. 核心組件部署從認(rèn)證到計(jì)算4.1 先搭認(rèn)證服務(wù)KeystoneKeystone是OpenStack所有服務(wù)的“門衛(wèi)”其他所有組件在調(diào)用API之前都要先經(jīng)過(guò)認(rèn)證和權(quán)限校驗(yàn)。所以搭建順序必須是先創(chuàng)建Keystone再創(chuàng)建后續(xù)服務(wù)否則后續(xù)組件創(chuàng)建用戶和端點(diǎn)時(shí)會(huì)失敗。創(chuàng)建Keystone的數(shù)據(jù)庫(kù)、服務(wù)憑證和API端點(diǎn)都需要設(shè)置統(tǒng)一的認(rèn)證信息。我習(xí)慣用一個(gè)環(huán)境變量文件統(tǒng)一管理這些信息每次操作前先加載export OS_PROJECT_DOMAIN_NAMEDefault export OS_USER_DOMAIN_NAMEDefault export OS_PROJECT_NAMEadmin export OS_USERNAMEadmin export OS_PASSWORD你的強(qiáng)密碼 export OS_AUTH_URLhttp://controller:5000 export OS_IDENTITY_API_VERSION3這個(gè)環(huán)境變量文件在實(shí)際操作中非常重要。日志排查時(shí)如果API請(qǐng)求返回401八成就是環(huán)境變量里的密碼或項(xiàng)目名寫錯(cuò)了。我建議把這套環(huán)境變量放在/root/openrc這樣的獨(dú)立文件里每次需要執(zhí)行OpenStack命令就先source一下。4.2 鏡像服務(wù)Glance與鏡像上傳Glance負(fù)責(zé)管理虛擬機(jī)鏡像可以理解成云主機(jī)模板的倉(cāng)庫(kù)。安裝好Glance之后必須上傳一個(gè)至少可用的系統(tǒng)鏡像后續(xù)創(chuàng)建云主機(jī)才有模板可用。挑選鏡像時(shí)我建議用官方提供的云鏡像這類鏡像預(yù)裝了cloud-init工具能夠自動(dòng)完成主機(jī)名配置、SSH密鑰注入、分區(qū)擴(kuò)容等初始化操作。上傳命令openstack image create --disk-format qcow2 --container-format bare \ --public --file ubuntu-server.qcow2 ubuntu-serverqcow2是鏡像格式bare表示容器格式為裸鏡像這兩個(gè)參數(shù)是鏡像服務(wù)要求的必填項(xiàng)。--public參數(shù)表示所有項(xiàng)目都能使用這個(gè)鏡像如果不想讓租戶看到可以改成--private。上傳完成后用openstack image list確認(rèn)鏡像狀態(tài)是active。我遇到過(guò)一次鏡像狀態(tài)一直卡在queued的情況后來(lái)發(fā)現(xiàn)是控制節(jié)點(diǎn)磁盤空間不足Glance無(wú)法把鏡像文件完整寫入存儲(chǔ)目錄。4.3 計(jì)算服務(wù)Nova的控制與計(jì)算節(jié)點(diǎn)Nova是OpenStack的計(jì)算核心分為控制節(jié)點(diǎn)的Nova API、調(diào)度器和計(jì)算節(jié)點(diǎn)上的Nova Compute??刂乒?jié)點(diǎn)負(fù)責(zé)接收創(chuàng)建虛擬機(jī)的請(qǐng)求計(jì)算節(jié)點(diǎn)負(fù)責(zé)真正通過(guò)KVM或QEMU啟動(dòng)虛擬機(jī)。配置Nova之前必須先注冊(cè)Placement服務(wù)這是負(fù)責(zé)資源跟蹤的組件。Placement的作用相當(dāng)于一個(gè)資源臺(tái)賬記錄每個(gè)計(jì)算節(jié)點(diǎn)剩余多少CPU、多少內(nèi)存Nova調(diào)度器在收到創(chuàng)建請(qǐng)求后會(huì)根據(jù)Placement提供的數(shù)據(jù)決定把VM調(diào)度到哪臺(tái)物理機(jī)上。我第一次部署時(shí)漏掉了Placement導(dǎo)致虛擬機(jī)創(chuàng)建一直報(bào)“No valid host was found”日志里全是調(diào)度失敗的報(bào)錯(cuò)。后來(lái)把Placement的數(shù)據(jù)庫(kù)和服務(wù)注冊(cè)補(bǔ)齊問(wèn)題馬上解決了。4.4 網(wǎng)絡(luò)服務(wù)Neutron的配置要點(diǎn)Neutron配置是整個(gè)部署過(guò)程中最講究的部分因?yàn)樗婕昂芏嗑W(wǎng)絡(luò)概念網(wǎng)絡(luò)、子網(wǎng)、路由、端口、安全組、DHCP代理、Open vSwitch網(wǎng)橋等。配置時(shí)有兩個(gè)點(diǎn)最容易被忽略。第一Neutron的認(rèn)證配置必須和Keystone保持一致。很多人在配置Neutron時(shí)只改了數(shù)據(jù)庫(kù)連接、改了口令卻漏了認(rèn)證類型和API版本結(jié)果Neutron服務(wù)啟動(dòng)后無(wú)法和Keystone正常通信所有網(wǎng)絡(luò)創(chuàng)建請(qǐng)求都返回認(rèn)證失敗。第二DHCP代理和L3代理要確保在正確節(jié)點(diǎn)上啟動(dòng)??刂乒?jié)點(diǎn)上需要啟動(dòng)neutron-dhcp-agent為租戶網(wǎng)絡(luò)分配IP地址啟動(dòng)neutron-l3-agent管理虛擬路由器的NAT和南北向流量。這兩個(gè)代理服務(wù)如果沒(méi)起來(lái)創(chuàng)建網(wǎng)絡(luò)不會(huì)報(bào)錯(cuò)但創(chuàng)建出來(lái)的虛擬機(jī)獲取不到IP地址這是非常常見的問(wèn)題。我習(xí)慣在配置完成后用如下命令檢查代理狀態(tài)openstack network agent list輸出中每個(gè)代理的狀態(tài)都應(yīng)為Alive。如果出現(xiàn)xxx not running的字段就需要回到對(duì)應(yīng)節(jié)點(diǎn)查看服務(wù)日志。5. 驗(yàn)證與第一臺(tái)云主機(jī)的誕生5.1 命令行驗(yàn)證所有服務(wù)核心組件全部裝完之后先不要急著在界面上操作用命令行把所有服務(wù)狀態(tài)過(guò)一遍。我總結(jié)了一套快速驗(yàn)證流程openstack service list openstack endpoint list openstack image list openstack compute service list openstack network agent list這幾條命令分別驗(yàn)證服務(wù)目錄、API端點(diǎn)、鏡像狀態(tài)、計(jì)算節(jié)點(diǎn)的服務(wù)狀態(tài)、網(wǎng)絡(luò)代理狀態(tài)。如果有任何一項(xiàng)輸出異常都應(yīng)該先排查清楚再繼續(xù)否則后續(xù)創(chuàng)建云主機(jī)時(shí)會(huì)把問(wèn)題復(fù)雜化。5.2 創(chuàng)建網(wǎng)絡(luò)、路由與云主機(jī)現(xiàn)在到了最激動(dòng)人心的環(huán)節(jié)——?jiǎng)?chuàng)建第一臺(tái)云主機(jī)。先創(chuàng)建租戶網(wǎng)絡(luò)。假如規(guī)劃用一個(gè)192.168.100.0/24網(wǎng)段給云主機(jī)分配地址openstack network create demo-net openstack subnet create demo-subnet \ --network demo-net \ --subnet-range 192.168.100.0/24 \ --dhcp為了訪問(wèn)外部網(wǎng)絡(luò)還需要?jiǎng)?chuàng)建路由連接外部網(wǎng)絡(luò)。這一步相當(dāng)于給云主機(jī)加了一個(gè)默認(rèn)網(wǎng)關(guān)沒(méi)有路由的話云主機(jī)只能在租戶網(wǎng)絡(luò)內(nèi)部互通無(wú)法訪問(wèn)外部。創(chuàng)建云主機(jī)的命令openstack server create --flavor m1.small --image ubuntu-server \ --network demo-net --key-name mykey my-first-instance其中m1.small是定義好的規(guī)格模板包含虛擬機(jī)的CPU、內(nèi)存、磁盤大小需要提前用openstack flavor create創(chuàng)建。--key-name指定SSH密鑰如果沒(méi)有配置密鑰創(chuàng)建后只能通過(guò)VNC控制臺(tái)或密碼登錄這在自動(dòng)化和后續(xù)運(yùn)維中不太方便。創(chuàng)建完成后用openstack server list查看狀態(tài)當(dāng)狀態(tài)變?yōu)锳CTIVE說(shuō)明云主機(jī)已經(jīng)成功啟動(dòng)。5.3 通過(guò)Horizon可視化操作命令行之外OpenStack還提供了Horizon儀表盤。雖然不是核心組件但裝上它對(duì)日常使用和排錯(cuò)都很有幫助。Horizon裝好之后用瀏覽器訪問(wèn)控制節(jié)點(diǎn)的IP地址輸入之前創(chuàng)建的賬號(hào)密碼就能在圖形界面里創(chuàng)建實(shí)例、管理網(wǎng)絡(luò)、查看控制臺(tái)日志、調(diào)整安全組規(guī)則。我個(gè)人認(rèn)為Horizon更適合給業(yè)務(wù)方當(dāng)自助門戶而運(yùn)維排障時(shí)還是命令行更快更直接。業(yè)務(wù)方不需要懂OpenStack概念只需要在界面上點(diǎn)擊申請(qǐng)資源運(yùn)維人員則應(yīng)當(dāng)熟練命令行因?yàn)楹芏嗟讓渝e(cuò)誤信息只會(huì)在API日志里出現(xiàn)界面上根本看不到。6. 常見問(wèn)題與排查實(shí)錄6.1 實(shí)例無(wú)法獲取IP這是我遇到過(guò)最多的故障幾乎每次都會(huì)有人來(lái)問(wèn)。云主機(jī)創(chuàng)建成功狀態(tài)是ACTIVE但進(jìn)到系統(tǒng)里發(fā)現(xiàn)網(wǎng)卡沒(méi)有IP地址。排查路徑按順序來(lái)先看Neutron代理是否存活再看DHCP命名空間是否創(chuàng)建成功然后查看DHCP租約數(shù)據(jù)庫(kù)中是否有IP分配記錄。這三個(gè)環(huán)節(jié)任何一個(gè)中斷都會(huì)導(dǎo)致IP獲取失敗。我做過(guò)一次印象很深的排障所有代理都正常DHCP租約也有記錄但虛擬機(jī)就是拿不到IP。后來(lái)查了半天發(fā)現(xiàn)是物理節(jié)點(diǎn)iptables規(guī)則把DHCP請(qǐng)求的UDP 67端口攔掉了。解決方式是確認(rèn)OpenStack所需的防火墻端口全部放行同時(shí)檢查宿主機(jī)自身的iptables規(guī)則是否干擾了虛擬機(jī)的DHCP流量。6.2 云主機(jī)創(chuàng)建失敗與日志定位云主機(jī)創(chuàng)建失敗的表現(xiàn)通常有兩種同步等待的時(shí)候狀態(tài)卡住或直接報(bào)錯(cuò)說(shuō)沒(méi)有可用主機(jī)。遇到這類問(wèn)題我的第一反應(yīng)是看Nova調(diào)度器和計(jì)算節(jié)點(diǎn)的日志因?yàn)閯?chuàng)建VM的主要工作都在這兩個(gè)節(jié)點(diǎn)上。日志路徑是/var/log/nova/重點(diǎn)看nova-compute.log和nova-scheduler.log。我整理過(guò)一份常見問(wèn)題速查表故障現(xiàn)象可能原因排查命令/日志實(shí)例狀態(tài)一直BUILD鏡像格式錯(cuò)誤或磁盤空間不足查看nova-compute.log報(bào)No valid hostPlacement資源數(shù)據(jù)不準(zhǔn)確檢查Placement服務(wù)狀態(tài)連不上VNC控制臺(tái)控制臺(tái)代理地址配置錯(cuò)誤查看nova.conf中vnc配置實(shí)例訪問(wèn)外部超時(shí)路由或安全組規(guī)則問(wèn)題openstack路由列表、安全組規(guī)則定位問(wèn)題時(shí)不要只看表面報(bào)錯(cuò)要順著日志里的時(shí)間戳和請(qǐng)求ID一層層往上翻。Nova組件之間的調(diào)用都有請(qǐng)求ID根據(jù)這個(gè)ID可以在各個(gè)服務(wù)日志中串聯(lián)出一條完整的調(diào)用鏈。6.3 服務(wù)狀態(tài)異常的排查路徑當(dāng)某個(gè)服務(wù)啟動(dòng)失敗或狀態(tài)異常時(shí)我有一套固定的排查順序第一步確認(rèn)服務(wù)進(jìn)程是否存在systemctl status查看。第二步查看對(duì)應(yīng)的日志文件通常位于/var/log/對(duì)應(yīng)服務(wù)目錄下。第三步檢查配置文件的語(yǔ)法和權(quán)限很多服務(wù)配置錯(cuò)誤只是啟動(dòng)時(shí)報(bào)錯(cuò)但日志寫的比較模糊需要手動(dòng)核對(duì)配置文件。還有一個(gè)經(jīng)常被忽略的細(xì)節(jié)OpenStack各服務(wù)運(yùn)行的用戶和用戶組不同如果日志目錄權(quán)限不對(duì)服務(wù)啟動(dòng)時(shí)寫日志就會(huì)失敗導(dǎo)致服務(wù)重啟后一直處于異常狀態(tài)。我在某次部署中遇到過(guò)Neutron服務(wù)反復(fù)重啟查了一圈最后發(fā)現(xiàn)是日志目錄屬主不對(duì)調(diào)整權(quán)限后服務(wù)立刻恢復(fù)了。注意生產(chǎn)環(huán)境中重啟某個(gè)服務(wù)前務(wù)必確認(rèn)是否影響正在運(yùn)行的業(yè)務(wù)。例如重啟計(jì)算節(jié)點(diǎn)上的nova-compute服務(wù)會(huì)中斷該節(jié)點(diǎn)上所有運(yùn)行中的虛擬機(jī)。在測(cè)試環(huán)境隨便重啟沒(méi)什么關(guān)系但生產(chǎn)環(huán)境一定要先規(guī)劃好維護(hù)窗口。7. 寫在最后的運(yùn)維心得OpenStack這套東西部署只是萬(wàn)里長(zhǎng)征第一步。真正拉開差距的是后續(xù)的監(jiān)控、告警、備份、升級(jí)、故障恢復(fù)這些運(yùn)維能力。我后來(lái)在給某公司做內(nèi)部支持時(shí)最深的體會(huì)是部署文檔到處都是但“如何優(yōu)雅地運(yùn)維”才是真正有門檻的部分。我現(xiàn)在只要搭完一套環(huán)境會(huì)立刻把所有的配置分區(qū)、服務(wù)節(jié)點(diǎn)、賬號(hào)信息、網(wǎng)絡(luò)規(guī)劃整理成一份清單放在團(tuán)隊(duì)統(tǒng)一的知識(shí)庫(kù)里。這份清單在故障排查和人員交接時(shí)的價(jià)值比任何部署文檔都大。另外強(qiáng)烈建議把OpenStack各服務(wù)的配置目錄納入版本管理哪怕只有兩個(gè)人協(xié)作也能避免“我改了配置文件但忘了改了什么”這種尷尬局面。如果你正準(zhǔn)備開始搭建自己的OpenStack云平臺(tái)就從最精簡(jiǎn)的兩節(jié)點(diǎn)架構(gòu)開始先跑通再談優(yōu)化。等你的環(huán)境里有了監(jiān)控、有了備份、有了灰度升級(jí)的流程再回頭看第一天的搭建過(guò)程會(huì)發(fā)現(xiàn)很多當(dāng)初覺(jué)得莫名的坑其實(shí)都是架構(gòu)規(guī)劃時(shí)埋下的雷。