扇貝丁彥:大家好,我是扇貝的技術(shù)總監(jiān)丁彥,之前在暴走漫畫,先后在暴走漫畫和扇貝設(shè)計和主導(dǎo)了基于 Docker 的微服務(wù)架構(gòu)系統(tǒng),以及數(shù)據(jù)收集和分析系統(tǒng)。去年來到扇貝,這里是 Python 的開發(fā)環(huán)境。后來發(fā)現(xiàn)業(yè)務(wù)增長快,水平擴(kuò)展一些機(jī)器,出現(xiàn)問題需要換個機(jī)器等等,都需要非常熟悉業(yè)務(wù)的少數(shù)開發(fā)去做。另外公司對預(yù)算控制嚴(yán)格,機(jī)器基本都是滿負(fù)荷運作,平時也不可能多開空置的機(jī)器,已有的機(jī)器還要根據(jù)負(fù)載情況調(diào)整服務(wù)分布情況,所以這種切換服務(wù),增刪服務(wù)的操作還是比較頻繁的。因此,我們用了2-3個月的時間將所有的運行環(huán)境都切換到 Docker上,這大大提高了我們的運維能力。
Docker 包裝有幾個好處。
第一個好處是,環(huán)境升級非常方便。因為只要pull 一下最新的鏡像,啟動一個 Container,環(huán)境就升級了。而如果直接基于公有云的鏡像升級的話就很難,因為一臺機(jī)器上跑哪些服務(wù)其實不一定是固定的,并且之前做的鏡像只要有一臺機(jī)器是還基于它的話,就刪除不掉的,鏡像數(shù)量又有上限。所以docker 非常好地解決了我們的問題。
其次是環(huán)境的顆粒度會更小,一臺機(jī)器上配好幾個應(yīng)用的話,往往配著配著,到最后你就不太能精確地記得上面裝的程序或者庫是給哪個應(yīng)用服務(wù)的,應(yīng)用之間如果依賴有版本的沖突也很難調(diào)和。你想做些服務(wù)的遷移,把負(fù)載比較小的放一起,把負(fù)載比較大的抽出來,這個時候就非常痛苦,但你如果用 Docker 包裝后就非常簡單,只要在不同的機(jī)器上起不同的 Container,就可以實現(xiàn)這一點。
第三,我們不光用了 Docker,還加入了服務(wù)發(fā)現(xiàn),剛剛討論配置管理這些,我們一并做了。Docker 啟動時候,我們自己寫了一些工具,可以自定義Docker啟動參數(shù),包括配置參數(shù),比如說,一些程序要運行的參數(shù),我們主要用兩種方式,一種方式是通過環(huán)境變量灌進(jìn)去,還有一種方式讓程序的啟動腳本支持參數(shù),然后拼接不同的參數(shù)灌進(jìn)去,最終都是落實到Docker的啟動命令上。服務(wù)發(fā)現(xiàn)是基于 Consul,Docker 的啟動命令是從 Consul 里取的。首先 Consul有 HTTP 的 API,我們是自己寫的 pip 包,只要 Include 一下這個包就可以了,Docker 的服務(wù)啟動后會自動注冊到 Consul。比如要在負(fù)載后加一個服務(wù),只需要找到一臺機(jī)器,啟動對應(yīng)的container,剩下的事情它自己會到 Consul,注冊它的參數(shù)地址一系列東西,自動把它加進(jìn)去。所以這些都是自動化的,如果檢測那臺機(jī)器/服務(wù)掛了,Health Check 也會到 Consul 里面更新。該增加機(jī)器就增加機(jī)器,該下線就下線??傮w來說,我們的生產(chǎn)環(huán)境全部跑在 Docker 上面的,然后區(qū)分有狀態(tài)和無狀態(tài)兩種,有狀態(tài)的定死在機(jī)器上,無狀態(tài)的靈活的自由切換。還有一點,如果是有狀態(tài)的容器要定死在機(jī)器上的時候,我們一般來說都會采取冗余的結(jié)構(gòu),至少保證有兩個在運行,一個掛了,保證整體的服務(wù)在運行。其次基于 Docker,我們還做了一套數(shù)據(jù)搜集以及分析的機(jī)制。數(shù)據(jù)搜集是基于日志來搜集的,利用 Docker 的 Log driver,把日志打到 Filter,把結(jié)果存在存儲服務(wù)上。同時監(jiān)控也是基于日志做的。第三部分非生產(chǎn)環(huán)境,比如開發(fā)環(huán)境跟測試環(huán)境都是 Docker 做的,因為我們每一個服務(wù)都做了 Image、鏡像,用容器方式跑的。通過參數(shù)來決定啟動方式的,我們可以在開發(fā)環(huán)境以及測試環(huán)境采用不同的參數(shù)來啟動容器。 通過 Consul 來隔離的,因為 Consul 的服務(wù)發(fā)現(xiàn),開發(fā)、生產(chǎn)、測試環(huán)境在不同的自動發(fā)現(xiàn)框架里不會相互影響到。目前機(jī)器在 120 臺左右,基于云服務(wù)。有些基礎(chǔ)的東西不需要依賴于 Docker,比如說申請云主機(jī),申請的時候就可以指定它的 CPU 和內(nèi)存這些服務(wù)器資源的配置。所以這部分東西還是屬于 Human schedule,不是完全讓編排的系統(tǒng)自己決定該怎么樣。
編排工具我們現(xiàn)在在研究進(jìn)一步,我剛來這工作的時候,所有的服務(wù)沒有一個跑在 Docker 上面的,我現(xiàn)在把它遷進(jìn)來?,F(xiàn)在數(shù)據(jù)增長,已經(jīng)有一些編排的瓶頸,現(xiàn)在在做調(diào)研,可能基于 Swarm,做自動編排的設(shè)計。
第二輪話題交流
主持人:容器多的情況下 Kubernetes 存在性能問題,各位在這方面有沒有好的經(jīng)驗?
扇貝丁彥:我們其實也遇到了這個問題,找不到辦法所以放棄了 Kubernetes。我們也是用公有云,網(wǎng)絡(luò)直接依賴公有云的網(wǎng)絡(luò),有可能是因為公有云造成的,我沒有試過在祼機(jī)上試過。