1. 程式人生 > >如何利用Docker構建基於DevOps的全自動CI

如何利用Docker構建基於DevOps的全自動CI

來自使用者的DevOps實踐分享,分享從開發程式碼到生產環境部署的一條龍操作的實踐及經驗, 包含工具技術的選型及考量、私有程式碼庫與私有映象庫的應用等。

(一)容器服務的Rancher選型

1、為什麼說是下一代核心技術

從網際網路的多次變革說起,早期的C/S架構,到後來的B/S架構,一直到現在最普遍的M/S架構,他們的背後都是技術不斷的優化改進,以適應、促進IT技術的發展整。體而言在過去10年間,網際網路技術可以說是以手工製造的方式為主,類似於傳統銷售、設計、製作、然後打包銷售。每個環節都需要大量的人員來操作,也需要不斷有人接班學習來延續對應的環節。而未來10年將會是以流水線的方式為主 ,其主要原因是網際網路雲端計算技術的高速發展及可持續快速交付的業務需求。其對應的DevOps方式將完美契合。開發運維一體化確切的說是一種方式,而這種方式需要全新的技術來支撐才行執行下去,我們將之稱為下一代核心技術。

2、傳統技術與下一代核心技術區別

傳統的技術主要問題是高耦合,其耦合存在於伺服器、硬體儲存、內外網之間(網路通訊),存在於應用程式之間、程式碼之間、業務模組之間。雖然經過近幾年的發展,在不斷的去耦合化大趨勢下,已經儘可能的將這幾大塊之間進行低耦合處理,但是由於傳統技術的限制,無法從根本上解決這些問題。比如最常用的程式連線資料庫。傳統的方式多將資料庫連線字串寫到程式的配置檔案裡,導致其連線資料庫IP不能變,多節點部署程式需要一一手動修改資料庫連線字串,非常麻煩。隨著技術的發展優化,有經驗的研發人員會將資料庫連線放到JNDI裡面(如Tomcat),由中介軟體管理,這樣將程式和資料庫之間進行解耦。這也是傳統技術架構常用的做法。但是對於多節點的部署變更,需要改變多個節點Tomcat的JNDI配置,還是存在易用性、可維護性、可靠性方面的問題。當然也有高級別的中介軟體來集中解決這些問題,如WebSphere的叢集管理。但這都屬於為了解決問題而解決問題,受限於傳統技術,無法從根因上解決各個元件、軟硬體之間的耦合問題。而且需要商業付費,非常的貴。

下一代核心技術,受益於雲端計算、微服務、容器服務的高速發展,採取DevOps的模式進行整合,實現硬體伺服器、儲存、網路、軟體程式、程式碼之間的全低耦合甚至0耦合,這將大大提高交付能力,降低運維成本,實現網際網路產品的快速迭代。

3、容器服務的Rancher選型

我之前的文章已經對微服務做了基本分析,本章節及後續章節會陸續對雲端計算的分析應用和容器服務的分析應用做逐一的講解。微服務主要是對軟體程式碼層面進行解耦,雲端計算主要從硬體支撐層進行解耦,而容器服務主要從應用層面進行解耦。容器服務的飛速發展,主要是Docker的巨大功勞,將傳統的虛擬化技術帶到一個全新的層面。Docker的優勢在此不做多講,主要是其原生的管理基於命令列,對於簡單應用較為方便。但是在DevOps模式下就需要有一整套的規範介面來統一管理整個流水線。對於Docker容器的管理系統目前比較流行的有幾個: K8S、Rancher、Shipyard等,其他還有一些不是很有名的在此不多做列舉了,大家可以自行研究學習。

這裡寫圖片描述

經過對比試用選型,在容器管理考慮到易用性包括跨主機通訊的管理、DevOps的支援力度等方面,Rancher以各方面優先勝出。Rancher目前在開源社群非常火爆,支援眾多的編排引擎,當前最新版本為 1.6.12 ,大家可以下載試用。

(二)Rancher的應用及優點簡介

1、環境選擇

安裝Rancher環境,一定要在乾淨的linux主機上進行,避免出現因配置導致的莫名其妙的問題。伺服器作業系統建議CentOS7.4(核心3.10以上),低於這個版本的系統 如7.3 7.2會報一個小bug,不過倒不影響使用,再低核心的版本就不要用了,很多都不支援。

這裡寫圖片描述

生產環境建議採用阿里雲 Rancher(1C 2G以上的配置,若要保證執行穩定,建議配置至少2C 4G),宿主機(1C 2G以上的配置)、彈性公網EIP+ 專有網路測試,私有環境建議採用Rancher(1C 2G以上的配置),宿主機(1C 2G以上的配置)、 虛擬機器(Hyper-V、VMware)+ 同一內網可通訊Rancher 1.6.12 ,排程引擎選擇Cattle。Rancher2.0排程引擎預設使用K8s,當前還是測試版,官方不建議在生產環境使用。

2、環境配置

這裡寫圖片描述

3、安裝Docker

root執行

curl https://releases.rancher.com/install-docker/17.06.sh | sh

配置加速器

這裡寫圖片描述

重啟Docker服務

sudo systemctl daemon-reload
        sudo systemctl restart docker

4、安裝Rancher管理端

登陸伺服器Mgr01

這裡寫圖片描述

執行完後,就可以通過IP:8888來訪問Rancher的管理臺了,接下來我們就可以點選 “新增主機” 來新增各個宿主機了

這裡寫圖片描述

5、加入宿主機

這裡寫圖片描述

依次登陸各個宿主機,執行5裡面的指令碼即可。

如果需要把mgr01加為宿主機,那麼需要在4裡面填寫mgr01和ws之間互通的內網IP地址,建議不要新增mgr為宿主機,方便後續做mgr叢集高可用。

6、新增好的介面

這裡寫圖片描述

Rancher有很多好玩的、強大的功能,後續我們會逐一去發現講解。對於DevOps來講,原來可以這麼簡單。

(三)私有程式碼庫阿里雲Git使用

1、引言

使用DevOps肯定離不開和程式碼的整合。所以要想跑通整套流程,程式碼庫的選型也是非常重要的。否則無法實現持續整合。目前比較常用的程式碼管理有SVN和Git,如果還使用SVN的,建議儘早遷移到Git上面,不然很費勁的。尤其是webhook,很多svn軟體都不支援。

2、Git選型

可以採用公網的GitHub,這是用的最多的,但是免費賬號還是缺少很多功能,收費版功能更全的,但需要考慮公司的預算。

免費版需要自行架設,Gitlab CE和Bitbucket都可以。當然這又少不了一部分維護人員、裝置,從而導致增加成本。

那麼既然不願意花錢,又想要好用的,我們就只能選型國內一些公司的Git服務了。本著程式碼可靠性,伺服器穩定性,功能擴充套件性綜合對比,我們選擇使用阿里雲的Git庫。

優點:速度快速度快,不限空間,不限專案數。可以和阿里的相關產品無縫整合。

3、註冊使用

開啟 連結 自行註冊即可。使用方法就不說了,和GitHub一模一樣。效能,穩定性,都比較好。最重要的是在國內,速度非常快

這裡寫圖片描述

4、程式碼管理

通過開發IDE工具,把應用程式碼放到Git庫裡面。比如我這裡有個config的專案

這裡寫圖片描述

5、程式碼庫管理

這時候看到Git服務端已經可以做程式碼管理了

這裡寫圖片描述

(四)私有映象庫阿里雲Docker服務使用

1、使用阿里雲映象庫有很多優點

  • 穩定可靠,阿里技術,放心使用。
  • 國內cdn多節點加速,下載速度非常快
  • 可以和阿里雲Git程式碼整合,不需要第三方CI工具
  • 國內專屬加速器,一個人的專屬通道,國外需要FQ下載的映象,在這裡統統可以搞定
  • 阿里雲端構建,不需要佔用本地資源,全球網路直達
  • 免費,不限空間

2、註冊使用

開啟 連結 即可,有阿里雲賬號可以直接登陸使用

這裡寫圖片描述

3、配置加速器

登陸自己的Rancher伺服器mgr和ws節點,依次執行下列配置,把自己的docker加速器配置上。

這裡寫圖片描述

4、這時候你就有了自己的私有映象庫

可以使用docker標準的pull、push等進行映象推拉操作。

(五)微服務CI與Rancher持續整合

1、引言

DevOps的核心魅力是快速的持續整合交付,降低研發和實施運維之間的互動,使得傳統的各種扯皮現象統統消失。最重要的是降低成本保障產品交付可靠性。

使用Rancher作為持續整合的關鍵環節,統一結連微服務和雲端計算,使得產品從研發到上線流水線操作,提高生產效率,此處我寫的是微服務而不是傳統的程式,是因為微服務(架構的產品)和容器服務、雲端計算是完美結合的三大核心模組,也是網際網路下一代核心技術DevOps的3個核心支柱。而傳統程式,由於在微服務架構方面轉型較慢或者生態鏈較弱,無法完美進行DevOps。

2、整合說明

本例整合程式碼採用java微服務專案,可拋棄第三方整合元件如Jenkins,簡單高效。

實現提交程式碼,即生產釋出的全自動流程 (Code->Git repository->Docker repository->Rancher->Server)

3、配置自動CI

選擇映象區域,如華南1.點選“建立映象倉庫”

這裡寫圖片描述

建立:名稱空間,
倉庫名稱:你的專案名稱
原始碼選擇:阿里雲Code或者其他的Git源
勾選:程式碼變更時自動構建映象
路徑:/或者你程式碼裡Dockerfile檔案的全路徑
標籤:latest或者自定義版本號
然後點選:建立映象倉庫

只要提交程式碼上來,伺服器就會自動根據構建image映象

這裡寫圖片描述

4、配置映象自動構建

點選剛建立的:server-config庫,管理,記錄下映象庫的地址,因為需要在接下來的Rancher中進行配置。

這裡寫圖片描述

進入Rancher管理後臺-基礎架構-映象庫 -新增

新增成功後,Rancher就可以下載部署你的私有映象

這裡寫圖片描述

接下來進入Rancher管理後臺 -API-WebHooks 新增一條接收器

名稱:隨意好記
型別:升級服務
引數格式:阿里雲
標籤:latest
選擇器標籤:update=server-config
然後點選:建立
複製儲存:觸發地址

這裡寫圖片描述

再次進入阿里雲Docker管理服務後臺,可以看到構建裡面的映象已經構建完畢。

這裡寫圖片描述

我們點選webhook,新增一條記錄

名稱:隨意
URL:剛才Rancher裡面配置的觸發地址
標籤:latest

這裡寫圖片描述

登陸Rancher管理後臺,開始部署我們的應用

新建服務

映象:剛建立的映象名稱
標籤:update=server-config
完成後,Rancher自動拉取映象庫的映象並部署

這裡寫圖片描述

5、自動整合,升級

提交程式碼。檢視映象自動構建過程。完成後,檢視Rancher的服務server-config自動升級。

至此,基於DevOps的全自動CI/DI釋出已經實現。且不用配置Jenkins等複雜的整合元件。最重要的是:不需要自己的伺服器,全部FREE。

  1. 這種整合適合於團隊內部進行了相關測試,最終交付的程式碼已經是穩定可靠版、直接上生產的情況。其實這也是大多數中小型公司使用的方式,屬於半自動化,方便,靈活可控,可隨時中斷某個環節。
  2. 另外一種方式,是全部使用全自動化整合測試,同時包括自動化團隊溝通、同時多映象庫釋出、自定義動作等。這個對公司IT能力水平要求較高,使用Pipeline Jenkins流水線釋出。這個我會在隨後的博文裡面給大家講。

(六)Rancher集中儲存及相關應用

1、前言

為什麼要使用集中儲存?使用集中儲存有個很大的優勢是資料安全和統一管理,和叢集完美配合。產品整合儲存經歷過幾個階段:

  1. 單機本機儲存。系統使用本地硬碟儲存
  2. 單網路集中儲存。區域網主機使用同一網路內的磁碟陣列儲存單元
  3. 分散式叢集本地儲存。叢集節點使用自己本地硬碟儲存。
  4. 分散式叢集集中儲存。叢集節點使用集中儲存(其背後可以是單一儲存也可以是分散式儲存,集中儲存相當於一個代理入口)

其中雲計算用的最多的是 3、4,主要適應於網路架構的分散式設計和基本雲端計算儲存,如多機房、多地儲存。使用集中儲存給運維帶來的最大優勢就是核心資料儲存,不怕應用崩潰,各種docker容器都可以隨時拋棄、重建而不用擔心資料問題。

2、Rancher中使用集中儲存NFS

Rancher對Docker叢集的管理已經是非常方便,預設是沒有載入共享儲存的,我們這裡使用Rancher NFS外掛來實現一個統一的儲存,當然也可以選擇其他的外掛,目前官方只有這一個,其他非官方的如CephFS、FastDfs等請自行新增外掛或自寫外掛來實現,在此不做過多解讀。

點選Rancher應用商店,搜尋nfs,找到官方外掛並新增

這裡寫圖片描述

填寫主機地址:IP
目錄:建議不要填 / 而是指向NFS伺服器儲存的一個目錄
ON_Remove: Purge: 刪除對映目錄時會刪除NFS遠端對應的資料 Retain:不刪除遠端資料

點“啟動”即可 ,Rancher會在各個宿主機上面新增NFS驅動

這裡寫圖片描述

檢視NFS驅動,每個宿主機都已啟動完畢

這裡寫圖片描述

使用NFS:
我們在新增服務的時候,可以配置下卷name:/容器對應目錄
填logs:/opt/logs會對應遠端NFS裡面新建的logs目錄
如果填/logs:/opt/logs則是常用的卷對映,會寫入宿主機本地的/logs目錄
驅動填寫預設的rancher-nfs
這樣,容器裡面讀寫的檔案就直接操作遠端Nfs伺服器了

這裡寫圖片描述

檢視效果:

啟動應用後,容器的日誌已經輸出到NFS裡面了。

這裡寫圖片描述

用途及注意事項:
主要是針對日誌類的,可以統一做日誌蒐集。

針對於資料持久化的,如MySQL資料可以通過對映mysql/data:/var/lib/mysql把資料集中儲存到NFS上

注意:

  1. 集中儲存要考慮到同時讀寫的問題,即Lock。有的程式無法同用一套資料,這時候要考慮到單獨讀寫或放到多個變數子目錄,如MySQL無法同時起2個例項讀寫一套資料。
  2. NFS外掛還有不完善的地方,如只能對映目錄,無法對映檔案,我們常用的-v /nginx.conf:/nginx.conf就無法使用了。
  3. 多NFS伺服器配置,無法從UI介面新增,只能從YML檔案來處理。
  4. 集中儲存一定要考慮速度問題,畢竟網路傳輸沒有本地傳輸速度快,儘量選擇公有云/私有云網路是走光纖通道的。儘量不要跨地域傳輸,如深圳的使用上海的NFS伺服器
  5. 儘可能使用可靠性有保障的儲存,畢竟伺服器、容器這些可以丟棄,但資料是要絕對安全的。推薦阿里雲的NFS服務,可以保障9個9的安全性。

作者簡介

鄭偉漪,深圳永達電子技術總監,負責公司網際網路產品架構和研發管理。對於微服務架構開發有豐富經驗,對網際網路技術的發展有獨到見解。曾服務神州數碼(中國)、華為、銀聯商務等網際網路產品。
本文版權歸作者所有,轉載請後臺留言。