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