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