在以AWS、Google、阿里等為代表的公有云發(fā)展的同時(shí),很多大大小小的公司由于一些客觀、主觀的原因只能采用傳統(tǒng)的硬件環(huán)境架構(gòu),我們北京盛學(xué)成長(zhǎng)科技有限公司就是這樣一家公司。由于業(yè)務(wù)性質(zhì)的限制,不能采用例如阿里云這樣的開(kāi)箱即用的主機(jī)資源。我公司現(xiàn)有硬件資源在很早以前就實(shí)現(xiàn)了esxi+vcenter這樣的虛擬機(jī)私有云平臺(tái)。百分九十的業(yè)務(wù)都是運(yùn)行在虛擬機(jī)之上的,利用虛擬化基礎(chǔ)架構(gòu)技術(shù),可以不斷整合工作負(fù)載,從而充分利用服務(wù)器并降低運(yùn)營(yíng)成本。該基礎(chǔ)架構(gòu)技術(shù)不但使系統(tǒng)管理員能夠管理更多的服務(wù)器,而且在置備新的軟件服務(wù)和維護(hù)現(xiàn)有軟件服務(wù)時(shí),具有更高的靈活性,響應(yīng)也更快速。最重要的是,它實(shí)現(xiàn)了各種基于 x86 的環(huán)境下管理工作的標(biāo)準(zhǔn)化和簡(jiǎn)化,這包括 Microsoft Windows、Linux、及Solaris x86 等操作系統(tǒng)。
虛擬機(jī)主要是解決了系統(tǒng)資源的靈活運(yùn)用,這樣看起來(lái)很美妙。
那么我們?yōu)槭裁葱枰萜骰?
第一是我們之前的業(yè)務(wù)系統(tǒng)隨著時(shí)間的發(fā)展越來(lái)越多,不同的組件需要協(xié)同去做不同的工作,給運(yùn)維帶來(lái)了巨大的挑戰(zhàn),有 JAVA 寫(xiě)的程序,還有些程序制定了必須用 JDK7,有的需要JDK8,還有些業(yè)務(wù)是用 PHP 寫(xiě)的,這對(duì)運(yùn)維來(lái)講是一個(gè)挑戰(zhàn),我們必須要給各種各樣的程序準(zhǔn)備各種各樣的環(huán)境,維護(hù),遷移都非常麻煩。
配置混亂,當(dāng)你應(yīng)用的服務(wù)器數(shù)量越來(lái)越多,每個(gè)應(yīng)用的管理程序都不一樣 , 有些程序可能只是個(gè)定時(shí)任務(wù)。最終的結(jié)果是操作系統(tǒng)中的配置文件和各種黑科技補(bǔ)丁腳本散落在系統(tǒng)的各個(gè)角落,沒(méi)人能找得到,也沒(méi)人搞得懂。
環(huán)境不匹配導(dǎo)致測(cè)試跟生產(chǎn)環(huán)境不一樣,比如生產(chǎn)環(huán)境是 JDK8 跑的,某一個(gè)開(kāi)發(fā)者本地用 JDK7 測(cè)試的程序,上去發(fā)現(xiàn)這個(gè)東西根本不對(duì),雖然 JDK7 和 JDK8 的兼容性已經(jīng)是99%以上,但是一個(gè)嚴(yán)謹(jǐn)?shù)臉I(yè)務(wù)系統(tǒng)必須要做到測(cè)試環(huán)境跟生產(chǎn)環(huán)境是一致的。
所以我們需要容器,但是對(duì)于一個(gè)企業(yè)來(lái)說(shuō),使用容器并不是簡(jiǎn)單的使用docker把環(huán)境裝上,把代碼放進(jìn)去,然后把程序跑起來(lái)。我們更應(yīng)該從分布式、代碼快速構(gòu)建、快速部署、秒級(jí)遷移、代碼灰度發(fā)布這些角度去考慮我們的平臺(tái)。
簡(jiǎn)而言之我們更希望我們的應(yīng)用是:
1.高可用的:應(yīng)用的可用性不依賴(lài)某一個(gè)容器主機(jī)節(jié)點(diǎn)的存活性。
2.持續(xù)集成、快速部署:從源碼到環(huán)境部署的自動(dòng)化。
3.遷移方便:應(yīng)用快速遷移。
理想很美好,但是需要達(dá)成這些目標(biāo),我們需要做的很多。我們前期對(duì)容器化進(jìn)行了調(diào)研,例如容器編排、監(jiān)控方案、日志收集、網(wǎng)絡(luò)方案等等。出于成本的考慮,我們決定前期使用rancher+cattle作為我們的容器平臺(tái)。容器間互聯(lián)采用了rancher自帶的網(wǎng)絡(luò)解決方案,私有倉(cāng)庫(kù)采用wmware的harbor。監(jiān)控采用了業(yè)界比較流行的prometheus。至于持續(xù)集成我們決定使用Jenkins,沒(méi)有使用rancher自帶的流水線,因?yàn)楣镜拇a都是放在svn上。
平臺(tái)的架構(gòu)規(guī)劃圖:
項(xiàng)目示意圖:
prometheus監(jiān)控圖:
這些遠(yuǎn)遠(yuǎn)不夠,例如日志的自動(dòng)收集與呈現(xiàn),容器的服務(wù)注冊(cè)與自動(dòng)發(fā)現(xiàn)、代碼的持續(xù)集成還需要后期完善。當(dāng)然在kubernetes統(tǒng)治一切的時(shí)代,切換到kubernetes只是時(shí)間問(wèn)題。