基于Docker的分布式服務研發實踐

JacRobin 8年前發布 | 40K 次閱讀 Docker 分布式系統

概述

Docker自從發布以來,短短不到2年的時間迅速成長為各家爭先追捧的寵兒,各家企業都希望能夠借助Docker來提升自己的產品、優化現有的研發流程。本文分享Docker在天云軟件分布式服務研發過程中的應用與實踐,主要介紹使用Docker、Compose構建分布式服務的CI/CD體系;容器技術的引入為天云軟件的SkyForm CMP帶來了哪些變化;圍繞著CI/CD,如何使天云軟件在日常研發活動中變得更加敏捷、高效。

Skyform CMP簡介

SkyForm CMP是一款中立、包容的能夠對多種異構資源實現統一管理的云系統軟件。SkyForm CMP能夠為用戶提供簡單、統一的管理平臺,內置豐富的資源管理與交付功能,可以對原本靜態的IT基礎設施進行管理、調度和按需分配。

SkyForm CMP的核心子服務是由SkyForm Cloud Service Gateway、SkyForm Cloud API和各種功能組件、云平臺驅動構成的SkyForm Multi-Cloud Engine。其中SkyForm Cloud Service Gateway對各種私有云、公有云進行統一的抽象并管理各種系統的不同能力, SkyForm Cloud API則對外提供抽象OpenStack兼容的API并提供特定功能的擴展。虛擬化平臺(如VMware)、開源云OS平臺(如CloudStack和OpenStack)、容器技術(如Docker)以及公有云(如AWS)通過Driver接入SkyForm CMP以滿足多種應用場景的需求。SkyForm CMP的架構圖如下所示。

SkyForm CMP包含的服務大體上可以分為9大塊,各服務之間的交互關系,如下圖所示。從圖中可以看出,各服務之間的耦合度都比較高,有的服務之間還形成了回環,在這種情況下,不論是部署還是調試都很不便,雖然我們也通過一些方式,比如自動化安裝腳本、自動構建工具來簡化操作,提升效率,但是效果仍然不太明顯。

研發與QA的心聲

由于SkyForm CMP組件繁多、配置復雜、打包部署繁瑣等因素,使得研發與QA在日常的工作中都會覺得效率不高,QA每天要花費相當長的時間來搭建打包、搭建測試環境,研發在進行調試時,由于環境搭建比較耗費時間,配置復雜,往往不得已會想QA借用測試環境來進行調試,這樣會使測試結果的有效性大打折扣。即便研發自行搭建一套環境,但還是會出現研發共用一套環境進行調試的情況。我們的研發和QA都希望:

  • 簡化配置,一次配置,多處復用
  • 統一研發與測試的環境
  • 環境一鍵搭建
  • 環境一鍵搭建
  • 隨時發布、隨時部署

Docker一經發布,就以它的輕量、敏捷、靈活等特點,迅速被大家接受和認可。成為大家關注的熱點,也正是因為這些特點,使我意識到,Docker也許能夠解決我們研發過程中遇到的問題,下面,就讓我們來看看,當SkyForm CMP遇上Docker之后,SkyForm CMP會發生怎樣的變化。

Docker為SkyForm CMP來帶的變化

為了使SkyForm CMP容器化,我們做的第一件事就是服務拆分、微服務化,通過改造,我們將下圖中標記黃色框的組件進行了容器化。

改造之后,SkyForm CMP里各服務組件的交互關系也變得清晰了很多,耦合度也降低了很多。拆分完成后,我們將各服務組件進行打包,送上了持續集成的流水線。

基于Docker的CI/CD

持續集成采取的方式與大家所熟知的方式沒有太大的區別,采用Jenkins來實現。Jenkins每天定時從代碼倉庫中檢出代碼進行編譯,編譯成功后,將會自動進行鏡像構建,并將構建好的鏡像推送到Docker Registry中。同時會自動觸發測試環境自動拉取鏡像,運行容器。(感謝原圖作者)

進一步挖掘CI/CD的價值

當實施這套CI/CD環境之后,大大節省了QA每日打包、安裝部署的時間,從原來的每次構建、打包、安裝需要40分鐘,到現在的10幾分鐘。構建完成后,自動部署到測試環境,自動運行。QA可以更專注的進行功能驗證與bug回歸。

經過一段時間的試運行后,我發現效果不是很理想,經過了解得知,現有的這套使用方式仍然沒有滿足和解決研發和QA的實際需求和遇到的問題。主要體現在以下幾個方面:

1、QA還是共用一套測試環境,存在資源沖突;

2、容器多,使用docker命令不方便;

3、容器中的文件如何替換;

4、新開發的功能如何使用這套環境來驗證;

5、怎樣debug。

為了滿足研發和QA的需求和解決遇到的問題,我們采取了以下方式:

1、標準化,使用docker-compose來對容器進行編排,簡化配置與使用。

2、模板化,將配置好的環境鏡像部署云端.

3、測試敏捷化,隨時發起構建、隨時申請測試資源、一鍵搭建測試環境。

對于研發而言,他們最關注的是如何使用這套環境進行研發、調試,同時盡可能少或不改變日常的開發、

調試習慣。為此,我們采用了如下的方式:

1、研發環境搭建:提供常用研發環境的鏡像,例如:mysql、rabbitmq、tomcat、nginx、keystone等。

2、環境統一:通過辦公云環境申請資源,從Docker Registry拉取鏡像。

3、文件替換:

單個文件:執行命令,將文件拷貝進容器目錄

docker exec -i <container_id> bash -c 'cat > /path/to/container/file' < /path/to/host/file/

目錄:使用卷,掛載到容器。

4、調試:IDE 遠程debug。

基于Kubernetes的容器集群化方案

雖然現行的這套方式可以滿足和解決研發和QA的日常需求和使用中的問題,但還是存在一些不足之處,比如:仍然是單機運行模式,無法利用云環境中的計算資源。無法進行性能測試與壓力測試。為了解決這些問題,我們引入了容器的集群化方案。

現階段,可供選擇的容器集群化方案有Mesos+Marathon、Kubernetes還有Docker自家的swarm。在經過詳細比較后,結合產品的發展路線,我們決定采用Kubernetes作為集群方案。

在Kubernetes集群中,每一個服務作為一個Pod,各服務之間通過ServiceName+containerPort來進行訪問,將Nginx所在的pod對外暴露NodePort,這樣就可以通過NodeIp+NodePort來對skyForm CMP進行訪問。Kubernetes集群方案的結構示意圖如下:

采用Kubernetes集群方案后,除了可以分布式部署之外,還為SkyForm CMP提供了健康檢查及HA的能力,此外,利用Kubernetes的特性,可以實現滾動升級、多版本部署,為研發和QA帶來了極大的方便,同時也使得SkyForm CMP的性能及可靠性得到了進一步的提升。

Q&A

Q:你好,我想請問下,用Jenkins持續集成過程中,如何對項目進行測試

A:在jenkins中進行測試,一般主要是已unit test 為主,除此之外,可以自己寫測試腳本進行測試

Q:研發采用IDE遠程調試這個地方我不是很清楚細節可否詳細講講

A:我們使用的web 容器為tomcat,你只需在tomcat中開啟遠程調試端口,在IDE中進行配置即可。

Q:我們不采用marathon和swarm的原因是什么?謝謝!

A:swarm目前還不成熟,還在發展中,功能相對弱一些。Marathon的話還是看使用場景,如果還要跑例如hadoop的話可以選擇。如果是純容器,建議kubernetes。

Q:問下開發使用的目錄掛載到容器是在宿主機還是共享存儲上開辟存儲空間,能否做到針對每個用戶存儲空間容量限制?

A:開發使用的宿主機在辦公云中,使用的存儲是宿主機的本地存儲。

Q:測試和研發數據庫用的是同樣的一套嗎?如果數據不一致,怎么處理呢

A:測試和研發使用的環境是一致的,包括使用的數據庫腳本也一致,如果出現對同一個計算資源操作產生不同的數據,那就需要研發和測試一起來定位。采用同一套環境的一個好處是讓研發不再有借口:“我的環境是好的,我本地無法復現”!

來自: http://dockone.io/article/1289

 本文由用戶 JacRobin 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!