摘要:本文是數(shù)人云工程師方志浩在微信群分享的實(shí)錄,與大家聊一聊應(yīng)用容器在配置管理中遇到的問題以及解決方法。數(shù)人云分測(cè)試演示生產(chǎn)三種環(huán)境進(jìn)行持續(xù)集成發(fā)布,同時(shí)數(shù)人云組件通過進(jìn)行應(yīng)用容器的封裝下發(fā)和管理。
本文是數(shù)人云工程師方志浩在DockOne微信群分享的實(shí)錄,與大家聊一聊應(yīng)用容器在配置管理中遇到的問題以及解決方法。
隨著Docker技術(shù)的火熱發(fā)展, Docker在代碼構(gòu)建發(fā)布中扮演著越來越重要的角色。Docker讓開發(fā)者可以打包他們的應(yīng)用以及依賴包到一個(gè)可移植的容器中,然后發(fā)布到流行的Linux機(jī)器上。Docker非常適用于如下場(chǎng)景:
應(yīng)用容器的自動(dòng)化打包和發(fā)布;
自動(dòng)化測(cè)試和持續(xù)集成、發(fā)布。
這次主要和大家聊聊應(yīng)用容器在配置管理中遇到的問題。首先是介紹現(xiàn)有容器常用的配置文件加載方式,接下來重點(diǎn)介紹數(shù)人云組件在自動(dòng)化打包和發(fā)布遇到的問題和解決方法。
現(xiàn)有的主要Docker加載配置的方式首先簡(jiǎn)單介紹下現(xiàn)有容器的加載配置文件的方式。
掛載宿主機(jī)配置文件的方式
通過docker run -v 參數(shù)將宿主機(jī)上的配置文件掛載到容器指定目錄中如:
docker run -v /myredis/conf/redis.conf:/usr/local/etc/redis/redis.conf --name myredis redis redis-server /usr/local/etc/redis/redis.conf
這種方式對(duì)于單實(shí)例應(yīng)用比較方便。
下載配置中心文件的方式
這種方法首先需要建立配置中心,例如用Nginx等Web服務(wù)組件,提前將配置文件放在指定目錄,在Dokcerfile entrypoint中拉取配置中心文件的腳本,之后容器啟動(dòng)就自動(dòng)拉取配置中心的配置。
通過環(huán)境變量傳入到容器中
通過docker run -e 參數(shù)將將環(huán)境變量傳入到容器如:
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:5.6應(yīng)用容器的自動(dòng)化打包和發(fā)布中遇到的問題
數(shù)人云組件采用微服務(wù)架構(gòu),將服務(wù)拆分,分別采用相對(duì)獨(dú)立的服務(wù)對(duì)各方面進(jìn)行管理,彼此之間使用統(tǒng)一的接口來進(jìn)行交流,架構(gòu)變得復(fù)雜,但優(yōu)勢(shì)非常明顯。為了保證高可用,這些容器一般都運(yùn)行在多個(gè)VM上,服務(wù)實(shí)例前是一層諸如HAPROXY的負(fù)載均衡器,它們負(fù)責(zé)在各個(gè)實(shí)例間分發(fā)請(qǐng)求。數(shù)人云分測(cè)試、演示、生產(chǎn)三種環(huán)境進(jìn)行持續(xù)集成、發(fā)布,同時(shí)數(shù)人云組件通過Docker+Mesos+Marathon進(jìn)行應(yīng)用容器的封裝下發(fā)和管理。首先說下我們?nèi)萜靼l(fā)布遇到的問題——配置文件多,如何進(jìn)行統(tǒng)一的管理?
我們由于采用微服務(wù)架構(gòu),就產(chǎn)生了各個(gè)模塊的配置,導(dǎo)致配置文件過多;其次數(shù)人云的三套環(huán)境,如MySQL等基礎(chǔ)組件IP、Port等配置不同,導(dǎo)致配置成倍增加;最后采用高可用架構(gòu),也造成了配置文件的增多。 下面是數(shù)人云Mesos系統(tǒng)架構(gòu)流程圖:
Marathon、Jenkins作為Framework注冊(cè)在mesos-master上,動(dòng)態(tài)調(diào)度mesos-slave資源。
Marathon負(fù)責(zé)應(yīng)用的發(fā)布
Jenkins負(fù)責(zé)代碼打包、鏡像構(gòu)建
Mesos Framework截圖如下:
若單純-v的掛載方式需提前將配置文件放在mesos-slave所在的宿主機(jī)上,新加slave時(shí)也需進(jìn)行相同的操作,且當(dāng)配置文件需要更新時(shí),需更新每臺(tái)mesos-slave宿主機(jī)上的配置文件,這顯然不夠靈活,所以我們剛開始采用應(yīng)用容器啟動(dòng)下載配置中心文件的方式。
早期的配置中心,如下圖所示:
此時(shí)存在的問題有:
因?yàn)槭嵌喾N環(huán)境,雖然把這些配置都在Configserver上集中配置,但是需要手動(dòng)修改這些配置。手動(dòng)修改容易出錯(cuò),例如Dev更新了一個(gè)服務(wù),可能過了一周才會(huì)更新到生產(chǎn)環(huán)境。那個(gè)時(shí)候再去修改生產(chǎn)就很容易出錯(cuò),導(dǎo)致無法運(yùn)行。
如果配置發(fā)生了Bug需要回滾,手動(dòng)修改也是不合適的。
我們進(jìn)行了改進(jìn),引進(jìn)Jenkins后工作流程如下圖:
我們用Jenkins把它們整體串起來,我們的第一個(gè)工作是把所有的配置文件抽象化,各種環(huán)境的文件抽象出來一個(gè)模板,放在GitLab上。它的數(shù)據(jù)是放在數(shù)據(jù)庫(kù)里面,這樣組合起來是一個(gè)完整的配置文件。各個(gè)環(huán)境的值是不一樣的。 我們的運(yùn)維平臺(tái)觸發(fā)Jenkins,Jenkins去調(diào)度我們的ConfigCenter API,它傳入兩個(gè)參數(shù),一個(gè)是需要更新的環(huán)境,另一個(gè)是更新哪個(gè)服務(wù)。之后API去做對(duì)比,從數(shù)據(jù)庫(kù)去讀現(xiàn)有的配置文件的模板Tag,再去讀新模板的Tag進(jìn)行對(duì)比。
如果這個(gè)文件需要更新,把它從數(shù)據(jù)庫(kù)拉過來,數(shù)據(jù)做匹配,渲染成我們最終的配置文件,再傳到Gitlab上。剩下的通過Jenkins 觸發(fā) Configserver去調(diào)Gitlab下載最新的配置文件到Configserver服務(wù)器,Jenkins再去調(diào)用Marathon去重啟服務(wù),服務(wù)就會(huì)成功更新配置文件。 這很好解決了配置文件對(duì)應(yīng)文件,但還是存在以下一些問題:
配置格式不統(tǒng)一,配置有env 、congfig.js 、.yaml 、.xml 等配置文件,各種配置文件需要在應(yīng)用容器發(fā)布前進(jìn)行替換,當(dāng)新增配置文件項(xiàng)時(shí),需重新編寫模版,替換匹配內(nèi)容較為繁瑣。
Marathon發(fā)布應(yīng)用采用了配置文件的方式,在Marathon界面看不到配置文件的內(nèi)容,需后臺(tái)查看,增加了運(yùn)維復(fù)雜度。
后來我們對(duì)應(yīng)用進(jìn)行env化改造,統(tǒng)一配置文件格式,且配置通過變量傳遞給Marathon,使得所有配置在Marathon界面上可見 。
以下是具體的工作,我們對(duì)開發(fā)進(jìn)行了規(guī)約。
產(chǎn)品模塊GitHub目錄規(guī)約結(jié)構(gòu)除了代碼和產(chǎn)品開發(fā)的一些文件外,還需要規(guī)約一下目錄結(jié)構(gòu):
module_name - | -deploy - | -env | -deploy-marathon.sh | -compile.sh | -dockerfiles - | -Dockerfile_compile_env | -Dockerfile_runtime
在GitHub中更新env文件,這個(gè)由開發(fā)提供維護(hù),里面有對(duì)應(yīng)env文件如下圖:
改進(jìn)后具體的流程圖如下:
以上主要對(duì)配置文件進(jìn)行env化,減少配置替換復(fù)雜度,將配置存在于Marathon發(fā)布腳本中。
更新后產(chǎn)生的marathon applist:
單個(gè)應(yīng)用容器配置:
采用env化有助于配置文件的統(tǒng)一維護(hù)和管理,新版Marathon很好的支持了應(yīng)用的更新和回滾,除去了容器啟動(dòng)對(duì)靜態(tài)配置文件的依賴,使應(yīng)用容器更新發(fā)布、回滾更加方便。從界面上可以看到所有容器配置信息,使排錯(cuò)管理也變得方便。
線下數(shù)人云企業(yè)版組件采用和線上相同的鏡像和env變量,通過API獲取對(duì)應(yīng)版本的envfile和Docker鏡像,之后將所有配置文件抽離到一個(gè)配置文件中,實(shí)施的同事只需修改這張配置文件,從而省去修改其他配置文件的步驟,使得實(shí)施過程更加簡(jiǎn)單。
以上就是數(shù)人云組件配置管理碰到的問題,以及env化解決方式,歡迎大家提出寶貴意見。
Q&AQ:請(qǐng)問MySQL數(shù)據(jù)庫(kù)怎么隨Docker遷移?備份和恢復(fù)有什么好的建議嗎?
A:MySQL現(xiàn)在是固定主機(jī)主從同步,沒有對(duì)MySQL做遷移,我們的數(shù)據(jù)現(xiàn)在備份是定時(shí)全備份,正在嘗試使用MariaDB集群Galera Cluster ,但還沒有上生產(chǎn),當(dāng)然有共享存儲(chǔ)的話就最好不過啦。
Q:請(qǐng)問配置文件的話生產(chǎn)環(huán)境和開發(fā)環(huán)境怎么區(qū)分?
A:生產(chǎn)環(huán)境和測(cè)試環(huán)境都是隔離的,配置文件配置不同的參數(shù)即可。
Q:請(qǐng)問對(duì)類似Java應(yīng)用jdbc、spring.xml等配置文件如何管理?
A:XML配置通過sed替換傳入的環(huán)境變量。
Q:生產(chǎn)上配置項(xiàng)變更怎么操作?
A:生產(chǎn)配置的值需要修改時(shí) ,在configcenter頁(yè)面中修改,再觸發(fā)Jenkins更新配置文件的job, 生產(chǎn)新的配置文件 ,再調(diào)用marathon API 更新task進(jìn)行更新。
Q:業(yè)務(wù)的配置是和環(huán)境配置放在一起的么?
A:是的,都是通過envfile進(jìn)行統(tǒng)一的。
Q:請(qǐng)問你們對(duì)環(huán)境變量是采用什么樣的管理方法?有相應(yīng)的命名規(guī)范嗎?環(huán)境變量多了,會(huì)出現(xiàn)管理方面的問題吧。
A:環(huán)境變量鍵值由開發(fā)維護(hù),運(yùn)維需要提前了解新增環(huán)境變量,目前在配置中心里維護(hù),容器環(huán)境變量變量命名規(guī)范很重要,我們目前采用服務(wù)名+需連接的組件名+屬性 進(jìn)行命名的,且環(huán)境變量全部大寫。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/26661.html
摘要:導(dǎo)讀本文系統(tǒng)性介紹安裝組件命令語法和應(yīng)用,通過上述介紹使我們已經(jīng)對(duì)基本操作有一定了解。二安裝本文以及以上版本為例來說明安裝底層對(duì)應(yīng)的是鏡像,不可寫的文件系統(tǒng),它的存儲(chǔ)方式比較多。根據(jù)規(guī)范產(chǎn)生和運(yùn)行容器的工具。 導(dǎo)讀:本文系統(tǒng)性介紹Docker安裝、Docker組件、Docker命令、Dockerfile語法和Docker應(yīng)用,通過上述介紹使我們已經(jīng)對(duì)docker基本操作有一定了解。一、...
摘要:概述之前講過容器的可視化監(jiān)控,即監(jiān)控容器的運(yùn)行情況,包括使用率內(nèi)存占用網(wǎng)絡(luò)狀況以及磁盤空間等等一系列信息。實(shí)戰(zhàn)一下中添加依賴啟動(dòng)應(yīng)用程序之后,只要在瀏覽器中輸入端點(diǎn)信息就能獲得應(yīng)用的一些狀態(tài)信息。 showImg(https://segmentfault.com/img/remote/1460000014684947); 概述 之前講過Docker容器的可視化監(jiān)控,即監(jiān)控容器的運(yùn)行情...
摘要:創(chuàng)建用戶組并添加用戶。默認(rèn)情況下是過濾掉所有的入站規(guī)則。初始命令表示一旦容器啟動(dòng),需要運(yùn)行的命令,此時(shí)使用,表示什么也不做,只需進(jìn)入命令行即可。1.什么是docker docker翻譯為搬運(yùn)工,在這里應(yīng)該可以理解為搬運(yùn)應(yīng)用的工具,也就是云.先了解其運(yùn)用場(chǎng)景之后更容易對(duì)他形成深刻理解. Docker提供了一種可移植的配置標(biāo)準(zhǔn)化機(jī)制,允許你一致性地在不同的機(jī)器上運(yùn)行同一個(gè)Container;...
摘要:最近在學(xué)習(xí),并用重新部署了項(xiàng)目,使用后確實(shí)大幅度地降低了部署難度。如果,內(nèi)存,硬盤不夠,只能加物理設(shè)備,但這個(gè)是有上限的。虛擬化時(shí)代為了解決物理設(shè)備的諸多問題,出現(xiàn)了虛擬機(jī)。全手動(dòng)部署編寫文件。一鍵啟動(dòng),確保已安裝。 最近在學(xué)習(xí) Docker,并用 Docker 重新部署了cdfang-spider項(xiàng)目,使用 docker 后確實(shí)大幅度地降低了部署難度。如果你也想用 Docker 來部...
摘要:最近在學(xué)習(xí),并用重新部署了項(xiàng)目,使用后確實(shí)大幅度地降低了部署難度。如果,內(nèi)存,硬盤不夠,只能加物理設(shè)備,但這個(gè)是有上限的。虛擬化時(shí)代為了解決物理設(shè)備的諸多問題,出現(xiàn)了虛擬機(jī)。全手動(dòng)部署編寫文件。一鍵啟動(dòng),確保已安裝。 最近在學(xué)習(xí) Docker,并用 Docker 重新部署了cdfang-spider項(xiàng)目,使用 docker 后確實(shí)大幅度地降低了部署難度。如果你也想用 Docker 來部...
閱讀 3331·2021-11-18 10:02
閱讀 2085·2021-09-22 10:54
閱讀 3035·2019-08-30 15:43
閱讀 2643·2019-08-30 13:22
閱讀 1628·2019-08-29 13:57
閱讀 1111·2019-08-29 13:27
閱讀 802·2019-08-26 14:05
閱讀 2591·2019-08-26 13:30