自動(dòng)化運(yùn)維經(jīng)驗(yàn)談,以及為什么Docker是革命性的
隨著開發(fā)效率的提高,運(yùn)維的自動(dòng)化已經(jīng)成為很多技術(shù)團(tuán)隊(duì)越來越重視的問題,否則部署的速度容易成為業(yè)務(wù)創(chuàng)新的瓶頸。在這個(gè)背景下,定位于給互聯(lián)網(wǎng)公司做運(yùn)維服務(wù)的云絡(luò)科技公司接觸了越來越多的客戶,對國內(nèi)互聯(lián)網(wǎng)公司的運(yùn)維水平有相當(dāng)多的了解。他們看到的現(xiàn)狀是怎樣的?技術(shù)團(tuán)隊(duì)要實(shí)現(xiàn)運(yùn)維自動(dòng)化應(yīng)該從哪里開始?像Docker這樣的技術(shù)如何影響開發(fā)者與運(yùn)維工程師?在本次采訪中,云絡(luò)科技CEO Steve Mushero談?wù)摿诉@些話題。
嘉賓簡介
Steve Mushero從硅谷來到中國,在全球范圍內(nèi)的廣泛行業(yè)及從業(yè)企業(yè)中擁有超過25年的技術(shù)管理經(jīng)驗(yàn),其中包括IT運(yùn)營、軟件開發(fā)、物流、制造以及機(jī)械等領(lǐng)域。他曾在土豆網(wǎng)(中國)、Intermind、New Vine Logistics以及Advanced Management Systems等企業(yè)擔(dān)任過CTO,擁有***架構(gòu)師工作經(jīng)驗(yàn),并以顧問身份為世界衛(wèi)生組織、格萊珉銀行基金會(huì)以及多家全球財(cái)富五***企業(yè)的全球化項(xiàng)目提供指導(dǎo)。
自動(dòng)化從構(gòu)建和測試開始
運(yùn)維自動(dòng)化的關(guān)鍵在于標(biāo)準(zhǔn)化。當(dāng)你有一個(gè)成熟的團(tuán)隊(duì),有標(biāo)準(zhǔn)化的流程,那么運(yùn)維自動(dòng)化就水到渠成了。而如果你什么都沒有,那就需要先設(shè)定優(yōu)先級(jí)。
我們的目標(biāo)當(dāng)然是將所有的流程標(biāo)準(zhǔn)化,而哪些要放在前面做?做起來比較簡單的,和比較重要的。我認(rèn)為構(gòu)建和測試的流程是最基本的***步。這對于交付產(chǎn)品的公司來說容易一些,對互聯(lián)網(wǎng)公司來說更復(fù)雜一些,而測試比構(gòu)建也要復(fù)雜一些,但這是基礎(chǔ)。構(gòu)建和測試的流程標(biāo)準(zhǔn)化做好了,就可以準(zhǔn)備做自動(dòng)化的工作了。
不過我見過的很多公司連Git都還沒有,仍然在用最原始的FTP push來更新代碼。我的觀點(diǎn)是,如果你還沒有用上Git這樣的工具,那根本就不用考慮什么自動(dòng)化的問題,因?yàn)闂l件完全不成熟。
所以,我們假設(shè)你的團(tuán)隊(duì)能夠很好的使用Git,然后你建立了構(gòu)建和測試的標(biāo)準(zhǔn)化流程,然后你就可以用工具來實(shí)現(xiàn)自動(dòng)化。這可能是Jenkins這樣的工具,不過Jenkins比較復(fù)雜,如果你只是一個(gè)很簡單的網(wǎng)站,那么自己寫一些腳本來實(shí)現(xiàn)自動(dòng)化是更合適的。
到此為止,我們說的還不是自動(dòng)化運(yùn)維,而是自動(dòng)化工具鏈。工具鏈就是開發(fā)工具鏈,從IDE,到代碼提交,代碼審查,構(gòu)建,到測試,仍然屬于開發(fā)的范疇。在這之后才是運(yùn)維的范疇,就是往生產(chǎn)環(huán)節(jié)部署。
部署
運(yùn)維自動(dòng)化最關(guān)鍵的部分是運(yùn)行環(huán)境的定義。我們的目標(biāo)是讓各個(gè)階段的代碼完全一樣,即開發(fā)者在自己筆記本上寫的代碼,到集成階段的代碼,到線上環(huán)境的代碼,都是一致的。為什么Docker這么火,就是因?yàn)樗鼛椭_發(fā)者很簡單的就讓自己的開發(fā)環(huán)境跟生產(chǎn)環(huán)境一致。環(huán)境的標(biāo)準(zhǔn)化,意味著目錄、路徑、配置文件、儲(chǔ)存用戶名密碼的方式、訪問權(quán)限、域名等種種細(xì)節(jié)的一致和差異處理的標(biāo)準(zhǔn)化。這涉及到很多方面,也是自動(dòng)化運(yùn)維最困難的一部分。
這里要注意的是,像Puppet這樣的工具并不是魔法。你需要自己為你的環(huán)境定義一套描述的方式,工具是無法為你完成這項(xiàng)工作的。無論是Puppet還是Jenkins,都是根據(jù)你的定義來管理你的環(huán)境。你決定用戶名和密碼如何儲(chǔ)存,你決定配置文件的路徑。開發(fā)者很喜歡把各種配置和url之類的參數(shù)硬編碼到代碼里,這很快;他們還喜歡東搞西搞的用一些亂七八糟的手段讓軟件通過測試,但是如果要構(gòu)建一個(gè)真正的系統(tǒng),這些小把戲根本沒用。你必須強(qiáng)迫他們采用標(biāo)準(zhǔn)的方式寫代碼,比如強(qiáng)制他們把用戶名和密碼寫在固定的地方,然后你才能跟Puppet說,配置文件在這里,測試環(huán)境用這個(gè)配置,生產(chǎn)環(huán)節(jié)用那個(gè)配置。到這里就很簡單了。
線上環(huán)境問題排查
對于線上環(huán)境的問題發(fā)現(xiàn)與解決,大部分基礎(chǔ)的問題都能用工具來自動(dòng)發(fā)現(xiàn)并提醒,比如磁盤空間不夠,比如MySQL崩潰,比如訪問網(wǎng)站的時(shí)候出現(xiàn)錯(cuò)誤頁面等等,有很多現(xiàn)成的工具可以抓到它們錯(cuò)誤的信息。
比較困難的是排查網(wǎng)站為什么變慢這樣的性能問題。我們經(jīng)??吹娇蛻舻拈_發(fā)團(tuán)隊(duì)提交新代碼后引入問題。在測試做得不好的時(shí)候這很常見,事實(shí)上很多東西是很難測試的,尤其是性能;而互聯(lián)網(wǎng)公司又尤其沒有測試的文化,互聯(lián)網(wǎng)開發(fā)人員大多關(guān)注特性的實(shí)現(xiàn),而不像傳統(tǒng)企業(yè)級(jí)開發(fā)那樣有很多測試的工具和流程。
理想的情況下,每個(gè)人提交代碼前都應(yīng)該測試。但既然反正也沒人這樣做,那么用工具來幫忙還是很有用的。比如New Relic這樣的工具就很強(qiáng)大,它可以發(fā)現(xiàn)代碼層面的問題。我們有時(shí)候也用我們的工具幫客戶做測試,包括負(fù)載測試。性能測試是挺困難的一件事,既不容易用起來,也不容易讓別人用起來,一般來說你需要一個(gè)專門的團(tuán)隊(duì)才能做性能測試,但互聯(lián)網(wǎng)公司基本沒有(除了Google、Facebook這樣的),就算想有也找不到人。所以要善用工具。
Docker的意義
Docker很有意思,很火,很新,當(dāng)然也很多問題。它目前沒多少大型部署案例,所以人們不斷的發(fā)現(xiàn)問題也是很正常的事情。
總體來說,Docker是一個(gè)對開發(fā)者非常友好的東西:簡單的實(shí)現(xiàn)不同機(jī)器上的環(huán)境標(biāo)準(zhǔn)化,可以輕松拿來拿去,而且在不同的云平臺(tái)上都支持。而把Docker用起來對運(yùn)維而言則是很大的挑戰(zhàn),我們幫一個(gè)客戶做一個(gè)規(guī)模較大的Docker部署,一個(gè)有經(jīng)驗(yàn)的DevOps團(tuán)隊(duì)也花費(fèi)了幾個(gè)月的時(shí)間。為什么?
Docker容器就跟VM差不多,從運(yùn)維的角度,會(huì)希望像管理VM那樣管理Docker容器,但是Docker容器很難troubleshooting,因?yàn)槟J(rèn)來說它沒有SSH,你要怎么登陸到一個(gè)容器里去查看里面發(fā)生了什么問題?Troubleshooting,這是一個(gè)***的問題。
默認(rèn)來說,Docker容器也無法運(yùn)行cron任務(wù)或者batch任務(wù),意味著你沒法兒讓它自動(dòng)做備份之類的工作,而這是最基本的運(yùn)維任務(wù),這是另一個(gè)必須解決的問題,否則你根本無法構(gòu)建一個(gè)自動(dòng)化管理的云環(huán)境,而要解決這個(gè)問題,你需要搞一些手段,比如改造它的架構(gòu),但是你一折騰,又引入了很多新的問題要解決。
Docker有很好的網(wǎng)絡(luò)機(jī)制,但是也很復(fù)雜,所以我們bypass了所有的Docker網(wǎng)絡(luò),而這也引入了一些問題。Docker容器也沒有好的重啟方法,因?yàn)槟愫茈y看到哪個(gè)是哪個(gè),需要做一些好的命名映射的管理系統(tǒng)。總之,要在大型部署中把Docker玩好,你需要各個(gè)方面的專家,還需要時(shí)間。
我并不懷疑Docker是趨勢,它的概念非常好,會(huì)極大的改善開發(fā)者的世界。如果你的系統(tǒng)比較簡單,不是很大,那么用Docker是完全沒問題的。而且它的文檔很好,這也是很贊的地方。我相信它會(huì)***未來。它只是還需要時(shí)間來完善。而這也不奇怪:想想KVM,其實(shí)KVM做的事情很簡單,就關(guān)注系統(tǒng)層和CPU、內(nèi)存、存儲(chǔ)、網(wǎng)絡(luò)的交互,并不難理解,但即使是目標(biāo)如此簡單的項(xiàng)目也多年處于問題層出不窮的狀態(tài),人們不斷的圍繞它開發(fā)工具,改進(jìn)它,才到了今天的可用狀態(tài)。Docker則復(fù)雜的多,有很多層:它是一個(gè)環(huán)境管理系統(tǒng),它是個(gè)打包系統(tǒng),它是個(gè)文件系統(tǒng),它包含一套網(wǎng)絡(luò)機(jī)制,它是一個(gè)repo系統(tǒng),它是個(gè)代碼系統(tǒng),等等。基本上,Docker想要把所有的東西都扔到一個(gè)小盒子里,五臟俱全。當(dāng)你用Docker提交代碼時(shí),你做的事情跟以前是完全不同的。在以前我們只是把代碼提交上去,而在Docker中我們把整臺(tái)計(jì)算機(jī)(虛擬機(jī))提交上去。想象一下,這就好像是交換電腦一樣,開發(fā)者把整臺(tái)電腦交給運(yùn)維,電腦里面的環(huán)境和代碼都有了,是不變的;而運(yùn)維需要把所有的電源網(wǎng)線什么的都插回去,需要處理很多變化的東西,比如變更的IP、用戶名、文件系統(tǒng)等等。這是全新的方式。