持續(xù)集成概覽

一鸽粉、持續(xù)集成

1.1 軟件開(kāi)發(fā)生命周期

軟件開(kāi)發(fā)生命周期又叫做SDLC(Software Development Life Cycle)斜脂,它是集合了計(jì)劃、開(kāi)發(fā)触机、測(cè)試和部署過(guò)程的集合帚戳,如下圖所示:

SDLC
1.1.1 需求分析

這是生命周期的第一階段,根據(jù)項(xiàng)目需求儡首,團(tuán)隊(duì)執(zhí)行一個(gè)可行性計(jì)劃的分析片任。項(xiàng)目需求可能是公司內(nèi)部或者客戶提出的。這階段主要是對(duì)信息的收集蔬胯,也有可能是對(duì)現(xiàn)有項(xiàng)目的改善和重新做一個(gè)新項(xiàng)目对供。還要分析項(xiàng)目的預(yù)算多長(zhǎng),可以從哪方面受益及布局氛濒,這也是項(xiàng)目創(chuàng)建的目標(biāo)产场。

1.1.2 設(shè)計(jì)

第二階段就是設(shè)計(jì)階段,系統(tǒng)架構(gòu)和滿意狀態(tài)(就是要做成什么樣子舞竿,有什么功能)京景。創(chuàng)建一個(gè)項(xiàng)目計(jì)劃,計(jì)劃可以使用圖表骗奖,布局設(shè)計(jì)或者文字的方式呈現(xiàn)确徙。

1.1.3 實(shí)現(xiàn)

第三階段就是實(shí)現(xiàn)階段,項(xiàng)目經(jīng)理創(chuàng)建和分配工作給開(kāi)發(fā)者执桌,開(kāi)發(fā)者根據(jù)任務(wù)和在設(shè)計(jì)階段定義的目標(biāo)進(jìn)行開(kāi)發(fā)代碼鄙皇。依據(jù)項(xiàng)目的大小和復(fù)雜度,可以需要數(shù)月或更長(zhǎng)的時(shí)間才能完成鼻吮。

1.1.4 測(cè)試

測(cè)試人員進(jìn)行代碼測(cè)試,包括功能測(cè)試较鼓、代碼測(cè)試椎木、壓力測(cè)試等。

1.1.5 進(jìn)化

最后階段就是對(duì)產(chǎn)品不斷的進(jìn)行改進(jìn)和維護(hù)階段博烂,根據(jù)用戶的使用情況香椎,可能需要對(duì)某功能進(jìn)行修改,bug修復(fù)禽篱,功能增加等畜伐。

1.2 軟件開(kāi)發(fā)瀑布模型

瀑布模型是最著名和最常使用的軟件開(kāi)發(fā)模型。瀑布模型就是一系列的軟件開(kāi)發(fā)過(guò)程躺率。它是由制造業(yè)繁衍出來(lái)的玛界。一個(gè)高度化的結(jié)構(gòu)流程在一個(gè)方向上流動(dòng)(不可逆)万矾,有點(diǎn)像生產(chǎn)線一樣。在瀑布模型創(chuàng)建之初慎框,沒(méi)有其他開(kāi)發(fā)的模型良狈,有很多東西全靠開(kāi)發(fā)人員去猜測(cè),去開(kāi)發(fā)笨枯。這樣的模型僅適用于那些簡(jiǎn)單的軟件開(kāi)發(fā)薪丁,但是已經(jīng)不適合現(xiàn)在的開(kāi)發(fā)了。下圖對(duì)軟件開(kāi)發(fā)瀑布模型的一個(gè)闡述:

軟件開(kāi)發(fā)瀑布模型
瀑布模型優(yōu)缺點(diǎn)
1.3 軟件的敏捷開(kāi)發(fā)
1.3.1 什么是敏捷開(kāi)發(fā)

敏捷開(kāi)發(fā)(Agile Development)的核心是迭代開(kāi)發(fā)(Iterative Development)與增量開(kāi)發(fā)(Incremental Development)馅精。

1.3.2 何為迭代開(kāi)發(fā)

對(duì)于大型軟件項(xiàng)目严嗜,傳統(tǒng)的開(kāi)發(fā)方式是采用一個(gè)大周期(比如一年)進(jìn)行開(kāi)發(fā),整個(gè)過(guò)程就是一次大開(kāi)發(fā)洲敢。迭代開(kāi)發(fā)的方式則不一樣漫玄,它將開(kāi)發(fā)過(guò)程拆分成多個(gè)小周期,即一次大開(kāi)發(fā)變成很多次小開(kāi)發(fā)沦疾,每次小開(kāi)發(fā)都是同樣的流程称近,所以看上去就好像重復(fù)在做同樣的步驟。

1.3.3 何為增量開(kāi)發(fā)

軟件的每個(gè)版本哮塞,都會(huì)新增一個(gè)用戶可以感知的完整功能刨秆。也就是說(shuō),按照新增功能來(lái)劃分迭代忆畅。

舉例來(lái)說(shuō)衡未,房產(chǎn)公司開(kāi)發(fā)一個(gè)10棟樓的小區(qū)。如果采用增量式開(kāi)發(fā)的模式家凯,該公司第一個(gè)迭代就是交付一號(hào)樓缓醋,第二個(gè)迭代交付二號(hào)樓……每個(gè)迭代都是完成一棟完整的樓。而不是一個(gè)迭代挖好10棟樓的地基绊诲,第二個(gè)迭代建好每棟樓的骨架送粱,第三個(gè)迭代架設(shè)屋頂……

1.3.4 敏捷開(kāi)發(fā)如何迭代

雖然敏捷開(kāi)發(fā)將軟件開(kāi)發(fā)分成多個(gè)迭代,但是也要求掂之,每次迭代都是一個(gè)完整的軟件開(kāi)發(fā)周期抗俄,必須按照軟件工程的方法論,進(jìn)行正規(guī)的流程管理世舰。

流程管理
1.3.5 敏捷開(kāi)發(fā)有什么好處
  • 早期交付:敏捷開(kāi)發(fā)的第一個(gè)好處动雹,就是早期交付,從而大大降低成本跟压。

還是以上面房產(chǎn)公司為例胰蝠,如果按照傳統(tǒng)的瀑布開(kāi)發(fā)模式奖唯,先挖10棟樓的地基仔沿,再蓋骨架,然后架設(shè)屋頂,每個(gè)階段都等到前一個(gè)階段完成后開(kāi)始耍攘,可能需要兩年才能一次性交付10棟樓洁桌。也就是說(shuō)癞谒,如果不考慮預(yù)售啊掏,該項(xiàng)目必須等到兩年后才能回款。敏捷開(kāi)發(fā)是六個(gè)月后交付一號(hào)樓禾唁,后面每?jī)蓚€(gè)月交付一棟樓效览。因此,半年就能回款10%荡短,后面每個(gè)月都會(huì)有現(xiàn)金流丐枉,資金壓力就大大減輕了。

  • 降低風(fēng)險(xiǎn):敏捷開(kāi)發(fā)的第二個(gè)好處是掘托,及時(shí)了解市場(chǎng)需求瘦锹,降低產(chǎn)品不適用的風(fēng)險(xiǎn)。請(qǐng)想一想闪盔,哪一種情況損失比較型湓骸:10棟樓都造好以后,才發(fā)現(xiàn)賣不出去泪掀,還是造好第一棟樓听绳,就發(fā)現(xiàn)賣不出去,從而改進(jìn)或停建后面9棟樓异赫。
1.4 持續(xù)集成
1.4.1 什么是持續(xù)集成

持續(xù)集成(Continuous integration椅挣,簡(jiǎn)稱CI)指的是,頻繁地(一天多次)將代碼集成到主干塔拳。繼續(xù)集成的目的鼠证,就是讓產(chǎn)品可以快速迭代,同時(shí)還能保持高質(zhì)量靠抑。它的核心措施是量九,代碼集成到主干之前,必須通過(guò)自動(dòng)化測(cè)試颂碧。只要有一個(gè)測(cè)試用例失敗荠列,就不能集成。

通過(guò)持續(xù)集成稚伍,團(tuán)隊(duì)可以快速的從一個(gè)功能到另一個(gè)功能弯予,簡(jiǎn)而言之戚宦,敏捷軟件開(kāi)發(fā)很大一部分都要?dú)w功于持續(xù)集成个曙。

1.4.2 持續(xù)集成的流程
持續(xù)集成的流程

根據(jù)持續(xù)集成的設(shè)計(jì),代碼從提交到生產(chǎn),整個(gè)過(guò)程有以下幾步垦搬。

  • 提交:流程的第一步呼寸,是開(kāi)發(fā)者向代碼倉(cāng)庫(kù)提交代碼,所有后面的步驟都始于本地代碼的一次提交(commit)猴贰。

  • 測(cè)試(第一輪):代碼倉(cāng)庫(kù)對(duì)commit操作配置了鉤子(hook)对雪,只要提交代碼或者合并進(jìn)主干,就會(huì)跑自動(dòng)化測(cè)試米绕。

  • 構(gòu)建:通過(guò)第一輪測(cè)試瑟捣,代碼就可以合并進(jìn)主干,就算可以交付了栅干。交付后迈套,就先進(jìn)行構(gòu)建(build),再進(jìn)入第二輪測(cè)試碱鳞。所謂構(gòu)建桑李,指的是將源碼轉(zhuǎn)換為可以運(yùn)行的實(shí)際代碼,比如安裝依賴窿给,配置各種資源(樣式表贵白、JS腳本、圖片)等等崩泡。

  • 測(cè)試(第二輪):構(gòu)建完成禁荒,就要進(jìn)行第二輪測(cè)試。如果第一輪已經(jīng)涵蓋了所有測(cè)試內(nèi)容允华,第二輪可以省略圈浇,當(dāng)然,這時(shí)構(gòu)建步驟也要移動(dòng)到第一輪測(cè)試前面靴寂。

  • 部署:過(guò)了第二輪測(cè)試磷蜀,當(dāng)前代碼就是一個(gè)可以直接部署的版本(artifact)。將這個(gè)版本的所有文件打包存檔百炬,發(fā)到生產(chǎn)服務(wù)器褐隆。

  • 回滾:一旦當(dāng)前版本發(fā)生問(wèn)題,就要回滾到上一個(gè)版本的構(gòu)建結(jié)果剖踊。最簡(jiǎn)單的做法就是修改一下符號(hào)鏈接庶弃,指向上一個(gè)版本的目錄。

1.4.3 持續(xù)集成的組成要素

1德澈、一個(gè)自動(dòng)構(gòu)建過(guò)程歇攻,從檢出代碼、編譯構(gòu)建梆造、運(yùn)行測(cè)試缴守、結(jié)果記錄、測(cè)試統(tǒng)計(jì)等都是自動(dòng)完成的,無(wú)需人工干預(yù)屡穗。

2贴捡、一個(gè)代碼存儲(chǔ)庫(kù),即需要版本控制軟件來(lái)保障代碼的可維護(hù)性村砂,同時(shí)作為構(gòu)建過(guò)程的素材庫(kù)烂斋,一般使用SVN或Git。

3础废、一個(gè)持續(xù)集成服務(wù)器汛骂,Jenkins就是一個(gè)配置簡(jiǎn)單和使用方便的持續(xù)集成服務(wù)器。

持續(xù)集成的組成要素
1.4.4 持續(xù)集成的好處
  • 降低風(fēng)險(xiǎn)评腺,由于持續(xù)集成不斷去構(gòu)建香缺,編譯和測(cè)試,可以很早期發(fā)現(xiàn)問(wèn)題歇僧,所以修復(fù)的代價(jià)就少图张。

  • 對(duì)系統(tǒng)健康持續(xù)檢查,減少發(fā)布風(fēng)險(xiǎn)帶來(lái)的問(wèn)題诈悍。

  • 減少重復(fù)性工作祸轮。

  • 持續(xù)部署,提供可部署單元包侥钳。

  • 持續(xù)交付可供使用的版本适袜。

  • 增強(qiáng)團(tuán)隊(duì)信心。

二舷夺、GitLab

2.1 GitLab安裝

Ubuntu部署GitLab

2.2 GitLab項(xiàng)目組&權(quán)限
2.2.1 項(xiàng)目組

使用管理員root創(chuàng)建組苦酱,一個(gè)組里可以有多個(gè)項(xiàng)目分支,可以將開(kāi)發(fā)添加到組里進(jìn)行設(shè)置權(quán)限给猾,不同的組就是公司不同的開(kāi)發(fā)項(xiàng)目或者服務(wù)模塊疫萤,不同的組添加不同的開(kāi)發(fā)即可實(shí)現(xiàn)對(duì)開(kāi)發(fā)設(shè)置權(quán)限的管理。

2.2.2 權(quán)限

GitLab用戶在組里面有5種不同權(quán)限

  • Guest:可以創(chuàng)建issue敢伸、發(fā)表評(píng)論扯饶、不能讀寫(xiě)版本庫(kù)

  • Report:可以克隆代碼、不能提交池颈,QA尾序、PM可以賦予這個(gè)權(quán)限

  • Developer:可以克隆代碼、開(kāi)發(fā)躯砰、提交每币、push,普通開(kāi)發(fā)可以賦予這個(gè)權(quán)限

  • Maintainer:可以創(chuàng)建項(xiàng)目琢歇、添加tag兰怠、保護(hù)分支则北、添加項(xiàng)目成員、編輯項(xiàng)目痕慢,核心開(kāi)發(fā)可以賦予這個(gè)權(quán)限

  • Owner:可以設(shè)置項(xiàng)目訪問(wèn)權(quán)限、Visibility Level涌矢、刪除項(xiàng)目掖举、遷移項(xiàng)目、管理組成員娜庇、開(kāi)發(fā)組組長(zhǎng)可以賦予這個(gè)權(quán)限

三塔次、Jenkins

3.1 Jenkins介紹

Jenkins是一款流行的開(kāi)源持續(xù)集成(Continuous Integration)工具,廣泛用于項(xiàng)目開(kāi)發(fā)名秀,具有自動(dòng)化構(gòu)建励负、測(cè)試和部署等功能。

Jenkins的特征:

  • 開(kāi)源的Java語(yǔ)言開(kāi)發(fā)持續(xù)集成工具匕得,支持持續(xù)集成继榆,持續(xù)部署。

  • 易于安裝部署配置:可通過(guò)yum安裝或下載war包以及通過(guò)docker容器等快速實(shí)現(xiàn)安裝部署汁掠,可方便web界面配置管理略吨。

  • 消息通知及測(cè)試報(bào)告:集成RSS/E-mail通過(guò)RSS發(fā)布構(gòu)建結(jié)果或當(dāng)構(gòu)建完成時(shí)通過(guò)e-mail通知,生成JUnit/TestNG測(cè)試報(bào)告考阱。

  • 分布式構(gòu)建:支持Jenkins能夠讓多臺(tái)計(jì)算機(jī)一起構(gòu)建/測(cè)試翠忠。

  • 文件識(shí)別:Jenkins能夠跟蹤哪次構(gòu)建生成哪些jar,哪次構(gòu)建使用哪個(gè)版本的jar等乞榨。

  • 豐富的插件支持:支持?jǐn)U展插件秽之,你可以開(kāi)發(fā)適合自己團(tuán)隊(duì)的工具,如git吃既、svn考榨、maven、docker等鹦倚。

3.2 Jenkins安裝

Ubuntu安裝Jenkins

3.3 Jenkins插件管理

Jenkins本身不提供很多功能董虱,我們可以通過(guò)使用插件來(lái)滿足我們的使用,例如從GitLab拉取代碼申鱼,使用Maven構(gòu)建項(xiàng)目等功能需要依靠插件完成愤诱。

Jenkins國(guó)外官方插件地址下載速度非常慢,所以我們一般將地址修改為國(guó)內(nèi)插件地址捐友。

3.4 重啟Jenkins

一般我們安裝完插件后需要重啟Jenkins淫半,我們可以在Jenkis訪問(wèn)地址后加restart進(jìn)行重啟,http://192.168.1.1:8666/restart

3.5 Jenkins用戶權(quán)限管理

我們可以利用Role-base Authorization Strategy插件來(lái)管理Jenkins用戶權(quán)限匣砖。

3.5.1 安裝插件
Role-base Authorization Strategy
3.5.2 開(kāi)啟Role-base Strategy
1
2
3.5.3 角色管理
1
2
3.5.4 用戶管理
1
3.5.5 分配角色
1
3.6 Jenkins憑證管理

憑證可以用來(lái)存儲(chǔ)需要密文保護(hù)的數(shù)據(jù)庫(kù)密碼科吭、GitLab密碼信息昏滴、Docker私有倉(cāng)庫(kù)密碼等,以便Jenkins可以和這些第三方的應(yīng)用進(jìn)行交互对人。

3.6.1 安裝Credentials Binding插件

要在Jenkins使用憑證管理功能谣殊,需要安裝Credentials Binding插件。

1
2
3.6.2 Jenkins管理GitLab憑證

前提:已安裝Git插件和功能

3.6.2.1 用戶密碼類型

創(chuàng)建憑證:Jenkins->憑證->系統(tǒng)->全局憑證->添加憑證

1
3.6.2.2 SSH密碼類型

SSH免密登錄示意圖


1

1牺弄、使用root用戶生成公鑰和私鑰

ssh-keygen -t rsa
  • id_rsa:私鑰文件
  • id_rsa.pub:公鑰文件

2姻几、把生成的公鑰在GitLab中進(jìn)行設(shè)置

3、把生成的私鑰在Jenkins中進(jìn)行設(shè)置


私鑰
3.7势告、Maven

在Jenkins集成服務(wù)器上蛇捌,我們需要安裝Maven來(lái)編譯和打包項(xiàng)目

3.7.1 Jenkins構(gòu)建Maven項(xiàng)目類型

Jenkins中自動(dòng)構(gòu)建項(xiàng)目的類型有很多,常用的有以下三種:

  • 自由風(fēng)格軟件項(xiàng)目(FreeStyle Project)
  • Maven項(xiàng)目(Maven Project)
  • 流水線項(xiàng)目(Pipeline Project)

每種類型的構(gòu)建其實(shí)都可以完成一樣的構(gòu)建過(guò)程與結(jié)果咱台,只是在操作方式络拌、靈活度等方面有所區(qū)別,在實(shí)際開(kāi)發(fā)中可以根據(jù)自己的需求和習(xí)慣來(lái)選擇回溺。

3.8 流水線項(xiàng)目(Pipeline Project)
3.8.1 Pipeline簡(jiǎn)介
3.8.1.1 概念

Pipeline春贸,簡(jiǎn)單來(lái)說(shuō),就是一套運(yùn)行在Jenkins上的工作流框架遗遵,將原來(lái)獨(dú)立運(yùn)行于單個(gè)或者多個(gè)節(jié)點(diǎn)的任務(wù)連接起來(lái)祥诽,實(shí)現(xiàn)單個(gè)任務(wù)難以完成的復(fù)雜流程編排和可視化的工作。

3.8.1.2 使用Pipeline的好處(翻譯官方)
  • 代碼:Pipeline以代碼的形式實(shí)現(xiàn)瓮恭,通常被檢如源代碼控制雄坪,使團(tuán)隊(duì)能夠編輯,審查和迭代其傳送流程屯蹦。

  • 持久:無(wú)論是計(jì)劃內(nèi)的還是計(jì)劃外的服務(wù)器重啟维哈,Pipeline都是可恢復(fù)的。

  • 可停止:Pipeline可接收交互式輸入登澜,以確定是否繼續(xù)執(zhí)行Pipeline阔挠。

  • 多功能:Pipeline支持現(xiàn)實(shí)世界中復(fù)雜的持續(xù)交付要求。它支持fork/join脑蠕、循環(huán)執(zhí)行购撼,并行執(zhí)行任務(wù)的功能。

  • 可擴(kuò)展:Pipeline插件支持其DSL的自定義擴(kuò)展谴仙,以及與其他插件集成的多個(gè)選項(xiàng)迂求。

3.8.1.3 如何創(chuàng)建Jenkins Pipeline?
  • Pipeline腳本是由Groovy語(yǔ)言實(shí)現(xiàn)的晃跺,但是我們沒(méi)必要單獨(dú)去學(xué)習(xí)Groovy

  • Pipeline支持兩種語(yǔ)法:Declarative(聲明式)和Scripted Pipeline(腳本式)語(yǔ)法

  • Pipeline也有兩種創(chuàng)建方式:可以直接在Jenkins的Web UI界面中輸入腳本揩局;也可以通過(guò)創(chuàng)建一個(gè)Jenkinsfile腳本文件放入項(xiàng)目源碼庫(kù)中(推薦)。

3.8.2 安裝Pipeline插件
1
3.8.3 Pipeline-聲明式
1
2
3
4
5
3.8.4 Pipeline-腳本式
1
3.9 Jenkins常用的構(gòu)建觸發(fā)器

Jenkins內(nèi)置4種構(gòu)建觸發(fā)器

  • 觸發(fā)遠(yuǎn)程構(gòu)建
  • 其他工程構(gòu)建后觸發(fā)(Build after other projects are build)
  • 定時(shí)構(gòu)建(Build periodically)
  • 輪詢SCM(Poll SCM)
3.9.1 觸發(fā)遠(yuǎn)程構(gòu)建
1

訪問(wèn)地址:http://192.168.66.101:8888/job/web_demo_pipeline/build?token=6666 遠(yuǎn)程觸發(fā)自動(dòng)構(gòu)建

3.9.2 其他工程構(gòu)建后觸發(fā)
1
3.9.3 定時(shí)構(gòu)建
1

定時(shí)字符串從坐往右分別為:分 時(shí) 日 月 周掀虎。一些定時(shí)表達(dá)式的例子:

1凌盯、每30分鐘構(gòu)建一次:H代表形參

H/30 * * * *   

10:02 10:32

2付枫、每2個(gè)小時(shí)構(gòu)建一次

H H/2 * * *

3、每天的8點(diǎn)驰怎、12點(diǎn)阐滩、22點(diǎn)構(gòu)建一次,天構(gòu)建3次(多個(gè)時(shí)間點(diǎn)中間用逗號(hào)隔開(kāi))

0 8,12,22 * * *

4县忌、每天中午12點(diǎn)定時(shí)構(gòu)建一次

H 12 * * * 
3.9.4 輪詢SCM

輪詢SCM是指定時(shí)掃描本地代碼倉(cāng)庫(kù)的代碼是否有變更掂榔,如果代碼有變更就觸發(fā)項(xiàng)目構(gòu)建。注意:這種構(gòu)建觸發(fā)器芹枷,Jenkins會(huì)定時(shí)掃描本地整個(gè)項(xiàng)目的代碼,增大系統(tǒng)的開(kāi)銷莲趣,不建議使用鸳慈。

1
3.10 Jenkins Git hook自動(dòng)觸發(fā)構(gòu)建

Jenkins的內(nèi)置構(gòu)建觸發(fā)器中,輪詢SCM可以實(shí)現(xiàn)GitLab代碼更新喧伞,項(xiàng)目自動(dòng)構(gòu)建走芋,但是該方案的性能不佳,那是否有更好的方案呢潘鲫?有的翁逞,就是利用GitLab的webhook實(shí)現(xiàn)代碼push到倉(cāng)庫(kù),立即觸發(fā)項(xiàng)目自動(dòng)構(gòu)建溉仑。

1
3.10.1 安裝GitLab Hook插件

需要安裝兩個(gè)插件:GitLab Hook和GitLab


1
3.10.2 設(shè)置自動(dòng)構(gòu)建
1
2
3
4
5
3.11 Jenkins的參數(shù)化構(gòu)建

有時(shí)在項(xiàng)目構(gòu)建的過(guò)程中挖函,我們需要根據(jù)用戶的輸入動(dòng)態(tài)傳入的一些參數(shù),從而影響整個(gè)構(gòu)建結(jié)果浊竟,這時(shí)我們可以使用參數(shù)化構(gòu)建怨喘。

1
2
3
4
3.12 Jenkins配置郵箱服務(wù)器發(fā)送構(gòu)建結(jié)果
3.12.1 安裝Email Extension插件
1
3.12.2 配置
2
3
4
3.13 Jenkins+SonarQube代碼審查

SonarQube是一個(gè)用于管理代碼質(zhì)量的開(kāi)放平臺(tái),可以快速的定位代碼中潛在的或者明顯的錯(cuò)誤振定。目前支持Java等二十幾種編程語(yǔ)言的代碼質(zhì)量管理與檢測(cè)必怜。官網(wǎng):https://www.sonarqube.org

四、Jenkins+Docker+SpringCloud微服務(wù)持續(xù)集成

4.1 持續(xù)集成流程說(shuō)明
image.png
4.2 Docker
1
2
4.3 Harbor鏡像倉(cāng)庫(kù)

Harbor(港口后频,港灣)是一個(gè)用于存儲(chǔ)和分發(fā)Docker鏡像的企業(yè)級(jí)Registry服務(wù)器梳庆。除了Harbor這個(gè)私有鏡像倉(cāng)庫(kù)之外,還有Docker官方提供Registry卑惜。相對(duì)Registry膏执,Harbor具有很多優(yōu)勢(shì):

  • 提供分層傳輸機(jī)制,優(yōu)化網(wǎng)絡(luò)傳輸:Docker鏡像是分層的露久,而如果每次傳輸都使用全量文件(所以用FTP的方式并不合適)胧后,顯然不經(jīng)濟(jì)。必須提供識(shí)別分層傳輸?shù)臋C(jī)制抱环,以層的UUID為標(biāo)識(shí)壳快,確定傳輸?shù)膶?duì)象纸巷。

  • 提供WEB界面,優(yōu)化用戶體驗(yàn):只用鏡像的名字來(lái)進(jìn)行上傳下載顯然很不方便眶痰,需要有一個(gè)用戶界面可以支持登錄瘤旨、搜索功能,包括區(qū)分公有竖伯、私有鏡像存哲。

  • 支持水平擴(kuò)展集群:當(dāng)有用戶對(duì)鏡像的上傳下載操作集中在某服務(wù)器,需要對(duì)相應(yīng)的訪問(wèn)壓力做分解七婴。

  • 良好的安全機(jī)制:企業(yè)中的開(kāi)發(fā)團(tuán)隊(duì)有很多不同的職位祟偷,對(duì)于不同的職位人員,分配不同的權(quán)限打厘,具有更好的安全性修肠。

4.3.1 Harbor項(xiàng)目

Harbor的項(xiàng)目分為公開(kāi)和私有的

  • 公開(kāi)項(xiàng)目:所有用戶都可以訪問(wèn),通常存放公共的鏡像户盯,默認(rèn)有一個(gè)library公開(kāi)項(xiàng)目嵌施。

  • 私有項(xiàng)目:只有授權(quán)用戶才可以訪問(wèn),通常存放項(xiàng)目本身的鏡像莽鸭。

五吗伤、Kubernetes實(shí)現(xiàn)Master-Slave分布式構(gòu)建方案

5.1 傳統(tǒng)Jenkins的Master-Slave方案的缺陷
  • Master節(jié)點(diǎn)發(fā)生單點(diǎn)故障時(shí),整個(gè)流程都不可用了硫眨。

  • 每個(gè)Slave節(jié)點(diǎn)的配置環(huán)境不一樣足淆,來(lái)完成不同語(yǔ)言的編譯打包等操作,但是這些差異化的配置導(dǎo)致管理起來(lái)非常不方便礁阁,維護(hù)起來(lái)也是比較費(fèi)勁缸浦。

  • 資源分配不均衡,有的Slave節(jié)點(diǎn)要運(yùn)行的job出現(xiàn)排隊(duì)等待氮兵,而有的Slave節(jié)點(diǎn)處于空閑狀態(tài)裂逐。

  • 資源浪費(fèi),每臺(tái)Slave節(jié)點(diǎn)可能是實(shí)體機(jī)或者VM泣栈,當(dāng)Slave節(jié)點(diǎn)處于空閑狀態(tài)時(shí)卜高,也不會(huì)完全釋放掉資源。

以上種種問(wèn)題南片,我們可以引入Kubernetes來(lái)解決掺涛。

5.2 Kubernetes簡(jiǎn)介

Kubernetes(簡(jiǎn)稱K8S)是Google開(kāi)源的容器集群管理系統(tǒng),在Docker技術(shù)的基礎(chǔ)上疼进,為容器化的應(yīng)用提供部署運(yùn)行薪缆、資源調(diào)度、服務(wù)發(fā)現(xiàn)和動(dòng)態(tài)伸縮等一系列完整功能伞广,提高了大規(guī)模容器集群管理的便捷性拣帽。其主要功能如下:

  • 使用Docker對(duì)應(yīng)用程序包(package)疼电、實(shí)例化(instantiate)、運(yùn)行(run)减拭。

  • 以集群的方式運(yùn)行蔽豺、管理跨機(jī)器的容器。

  • 解決Docker跨機(jī)器容器之間的通訊問(wèn)題拧粪。

  • Kubernetes的自我修復(fù)機(jī)制使得容器集群總數(shù)運(yùn)行在用戶期望的狀態(tài)修陡。

5.3 Kubernetes+Docker+Jenkins架構(gòu)圖
Kubernetes+Docker+Jenkins架構(gòu)圖
5.4 Kubernetes+Docker+Jenkins持續(xù)集成方案好處
  • 服務(wù)高可用:當(dāng)Jenkins Master出現(xiàn)故障時(shí),Kubernetes會(huì)自動(dòng)創(chuàng)建一個(gè)新的Jenkins Master容器可霎,并且將Volume分配給新創(chuàng)建的容器魄鸦,保證數(shù)據(jù)不丟失,從而達(dá)到集群服務(wù)高可用癣朗。

  • 動(dòng)態(tài)伸縮拾因,合理使用資源:每次運(yùn)行Job時(shí),會(huì)自動(dòng)創(chuàng)建一個(gè)Jenkins Slave斯棒,Job完成后盾致,Slave自動(dòng)注銷并刪除容器主经,資源自動(dòng)釋放荣暮,而且Kubernetes會(huì)根據(jù)每個(gè)資源的使用情況,動(dòng)態(tài)分配Slave到空閑的節(jié)點(diǎn)上創(chuàng)建罩驻,降低出現(xiàn)因某節(jié)點(diǎn)資源利用率高穗酥,還排隊(duì)等待在該節(jié)點(diǎn)的情況。

  • 擴(kuò)展性好:當(dāng)Kubernetes集群的資源嚴(yán)重不足而導(dǎo)致Job排隊(duì)等待時(shí)惠遏,可以很容易地添加一個(gè)Kubernetes Node到集群中砾跃,從而實(shí)現(xiàn)擴(kuò)展。

5.5 Kubernetes架構(gòu)
Kubernetes架構(gòu)
  • API Server:用于暴露Kubernetes API节吮,任何資源的請(qǐng)求的調(diào)用操作都是通過(guò)kube-aipserver提供的接口進(jìn)行的抽高。

  • Etcd:是Kubernetes提供默認(rèn)的存儲(chǔ)系統(tǒng),保存所有集群數(shù)據(jù)透绩,使用時(shí)需要為etcd數(shù)據(jù)提供備份計(jì)劃翘骂。

  • Controller-Manager:作為集群內(nèi)部的管理控制中心,負(fù)責(zé)集群內(nèi)的Node帚豪、Pod副本碳竟、服務(wù)端點(diǎn)(Endpoint)、命名空間(Namespace)狸臣、服務(wù)賬號(hào)(ServiceAccount)莹桅、資源定額(ResourceQuota)的管理,當(dāng)某個(gè)Node意外宕機(jī)時(shí)烛亦,Controller Manager會(huì)及時(shí)發(fā)現(xiàn)并執(zhí)行自動(dòng)化修復(fù)流程诈泼,確保集群始終處于預(yù)期的工作狀態(tài)懂拾。

  • Scheduler:監(jiān)視新創(chuàng)建沒(méi)有分配到Node的Pod,為Pod選擇一個(gè)Node。

  • Kubelet:負(fù)責(zé)維護(hù)容器的生命周期厂汗,同時(shí)負(fù)責(zé)Volume和網(wǎng)絡(luò)的管理

  • Kube proxy:是Kubernetes的核心組件委粉,部署在每個(gè)Node節(jié)點(diǎn)上,它是實(shí)現(xiàn)Kubernetes-Service的通信與負(fù)載均衡機(jī)制的重要組件娶桦。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末贾节,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子衷畦,更是在濱河造成了極大的恐慌栗涂,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件祈争,死亡現(xiàn)場(chǎng)離奇詭異斤程,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)菩混,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門(mén)忿墅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人沮峡,你說(shuō)我怎么就攤上這事疚脐。” “怎么了邢疙?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵棍弄,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我疟游,道長(zhǎng)呼畸,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任颁虐,我火速辦了婚禮蛮原,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘另绩。我一直安慰自己儒陨,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布板熊。 她就那樣靜靜地躺著框全,像睡著了一般。 火紅的嫁衣襯著肌膚如雪干签。 梳的紋絲不亂的頭發(fā)上津辩,一...
    開(kāi)封第一講書(shū)人閱讀 51,763評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼喘沿。 笑死闸度,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蚜印。 我是一名探鬼主播莺禁,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼窄赋!你這毒婦竟也來(lái)了哟冬?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤忆绰,失蹤者是張志新(化名)和其女友劉穎浩峡,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體错敢,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡翰灾,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了稚茅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纸淮。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖亚享,靈堂內(nèi)的尸體忽然破棺而出咽块,到底是詐尸還是另有隱情,我是刑警寧澤虹蒋,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布糜芳,位于F島的核電站飒货,受9級(jí)特大地震影響魄衅,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜塘辅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一晃虫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧扣墩,春花似錦哲银、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至亚脆,卻和暖如春做院,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工键耕, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留寺滚,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓屈雄,卻偏偏與公主長(zhǎng)得像村视,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子酒奶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355