新聞中心
中小團(tuán)隊(duì)基于docker的DevOps實(shí)踐
作者:SRE724 2018-07-05 13:35:04
云計(jì)算
系統(tǒng)運(yùn)維 筆者所在的技術(shù)團(tuán)隊(duì)負(fù)責(zé)了數(shù)十個(gè)項(xiàng)目的開發(fā)和維護(hù)工作,每個(gè)項(xiàng)目都至少有dev、qa、hidden、product四個(gè)環(huán)境,數(shù)百臺(tái)機(jī)器,在各個(gè)系統(tǒng)之間疲于奔命,解決各種瑣碎的問(wèn)題,如何從這些瑣碎的事情中解放出來(lái)?devops成了我們不二的選擇。

創(chuàng)新互聯(lián)公司堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的三山網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
筆者所在的技術(shù)團(tuán)隊(duì)負(fù)責(zé)了數(shù)十個(gè)項(xiàng)目的開發(fā)和維護(hù)工作,每個(gè)項(xiàng)目都至少有dev、qa、hidden、product四個(gè)環(huán)境,數(shù)百臺(tái)機(jī)器,在各個(gè)系統(tǒng)之間疲于奔命,解決各種瑣碎的問(wèn)題,如何從這些瑣碎的事情中解放出來(lái)?devops成了我們不二的選擇。
文章是基于目前的環(huán)境和團(tuán)隊(duì)規(guī)模做的devops實(shí)踐總結(jié),方案簡(jiǎn)單易懂,容易落地且效果顯著。
實(shí)現(xiàn)方法
先來(lái)看下流程圖:
工程師本地開發(fā),開發(fā)完成后提交代碼到代碼倉(cāng)庫(kù),[自動(dòng)]觸發(fā)jenkins進(jìn)行持續(xù)集成與部署,部署完成會(huì)收到結(jié)果郵件。項(xiàng)目運(yùn)行過(guò)程中可通過(guò)日志系統(tǒng)查看程序日志,有異常會(huì)觸發(fā)監(jiān)控系統(tǒng)發(fā)送報(bào)警。從編碼到上線后結(jié)果反饋都可以工程師自主完成,形成完整閉環(huán),運(yùn)維則負(fù)責(zé)提供完整流程的工具鏈及協(xié)助異常情況的處理,工作量減少了,效率卻高了。
自動(dòng)觸發(fā)jenkins部署通過(guò)svn和git的hooks來(lái)實(shí)現(xiàn),是否自動(dòng)觸發(fā)根據(jù)項(xiàng)目?jī)?nèi)部溝通決定,我們目前沒有自動(dòng)觸發(fā),原因是QA在測(cè)試的過(guò)程中不希望被自動(dòng)觸發(fā)的部署打斷,不過(guò)也可以方便的在jenkins上手動(dòng)觸發(fā)執(zhí)行
jenkins從svn拉代碼 --> 編譯 --> JS/CSS合并壓縮 --> 其他初始化操作 --> 生成最終線上運(yùn)行的代碼包,通過(guò)Dockerfile打包成鏡像上傳到docker hub,然后觸發(fā)kubernetes滾動(dòng)更新
鏡像包含了基礎(chǔ)鏡像+項(xiàng)目代碼,基礎(chǔ)鏡像就是根據(jù)項(xiàng)目運(yùn)營(yíng)環(huán)境打包的一個(gè)最小化的運(yùn)行環(huán)境(不包含項(xiàng)目代碼),根據(jù)項(xiàng)目依賴的技術(shù)棧不同我們打包了很多不通類型的基礎(chǔ)鏡像,例如包含nginx服務(wù)的基礎(chǔ)鏡像,包含jdk+tomcat的基礎(chǔ)鏡像
如果發(fā)現(xiàn)程序上線出錯(cuò)或有bug短時(shí)間內(nèi)無(wú)法解決,可通過(guò)jenkins快速回滾到上一鏡像版本,十分方便
如果發(fā)現(xiàn)流量突然增高,可以通過(guò)kubernetes快速調(diào)整容器副本數(shù)量
軟件和工具
代碼管理:svn,git
持續(xù)集成:jenkins,shell,python
Docker化:docker,harbor,kubernetes
監(jiān)控報(bào)警:zabbix,prometheus
日志系統(tǒng):filebeat,kafka,logstash,elasticsearch,kibana
代碼管理
大部分項(xiàng)目還是通過(guò)svn來(lái)管理的,這里以svn為例說(shuō)明,每個(gè)項(xiàng)目有3條代碼線,dev、trunk、releases
dev: 本地開發(fā),開發(fā)好一個(gè)功能或task就可以提交到dev分支,同時(shí)可部署到dev環(huán)境進(jìn)行自測(cè)
trunk:當(dāng)一個(gè)大的功能開發(fā)完成計(jì)劃上線前合并代碼到trunk分支,QA部署到trunk環(huán)境進(jìn)行詳細(xì)測(cè)試
releases:QA測(cè)試通過(guò),項(xiàng)目即將上線,則將代碼合并到releases分支,部署hidden環(huán)境(仿真環(huán)境,所有配置、代碼等與線上保持一致)再次回歸,回歸通過(guò),則上線product正式環(huán)境
有些項(xiàng)目是基于版本發(fā)布的,那么在代碼合并到releases之后會(huì)通過(guò)branch/tag打個(gè)tag部署到hidden測(cè)試
持續(xù)集成
這一步主要工作是按照需求把源代碼打包為最終線上跑的項(xiàng)目工程,大部分工作都有shell、python編寫的腳本來(lái)完成,例如去svn拉代碼、編譯源代碼、對(duì)靜態(tài)資源文件合并壓縮等等操作。利用jenkins將我們這么多分散的步驟串成一個(gè)完整的流程,運(yùn)維對(duì)這一部分應(yīng)該很熟悉了,不過(guò)多介紹
Docker化
Docker是我們整個(gè)方案中很重要的一塊,可以方便的進(jìn)行部署,所有環(huán)境使用同一Docker鏡像也保證了環(huán)境的統(tǒng)一,大大減少了開發(fā)環(huán)境運(yùn)行正常,線上運(yùn)行報(bào)錯(cuò)的情況出現(xiàn),同時(shí)可根據(jù)項(xiàng)目負(fù)載情況實(shí)時(shí)調(diào)整資源占用,節(jié)約成本。
Dockerfile:通過(guò)編寫dockerfile來(lái)打包鏡像
harbor:充當(dāng)docker hub鏡像倉(cāng)庫(kù)的作用,有web界面和api接口,方便集成
kubernetes:kubernetes(k8s)將一個(gè)一個(gè)的Docker實(shí)例給整合成了集群,方便鏡像下發(fā)、升級(jí)、回滾、增加或刪除副本數(shù)量,同時(shí)也提供了ingress外網(wǎng)訪問(wèn)方式,這一塊比較重,不過(guò)我們也沒有用到太高級(jí)的功能,只是上邊提到的一些基礎(chǔ)功能,無(wú)需對(duì)k8s進(jìn)行二次開發(fā)或定制,只是部署好了使用,對(duì)運(yùn)維來(lái)說(shuō)技術(shù)難度不大。
監(jiān)控報(bào)警
監(jiān)控報(bào)警在整個(gè)運(yùn)維過(guò)程中非常重要,能未雨綢繆,減少故障的發(fā)生,加快故障的解決。這一塊也是運(yùn)維的基礎(chǔ)不過(guò)多介紹了
zabbix:宿主機(jī)統(tǒng)一通過(guò)zabbix進(jìn)行監(jiān)控報(bào)警
prometheus:Docker容器的運(yùn)行情況通過(guò)prometheus進(jìn)行監(jiān)控報(bào)警(目前還未完成)
日志系統(tǒng)
elk日志系統(tǒng)真是運(yùn)維的福音,用了都說(shuō)好,從此再也不用聽開發(fā)給你說(shuō)“xx,幫我拉下線上的日志”。我們使用的架構(gòu)為filebeat/rsyslog --> kafka --> logstash --> elasticsearch --> kibana
filebeat/rsyslog:client端通過(guò)filebeat或者rsyslog來(lái)收集日志,filebeat是一個(gè)go開發(fā)的程序,部署起來(lái)非常方便,跟Docker簡(jiǎn)直絕配,我們Docker基礎(chǔ)鏡像里都默認(rèn)起了一個(gè)filebeat服務(wù)初始化了配置文件,后邊整合項(xiàng)目代碼的時(shí)候不需要額外配置;使用rsyslog的好處是大部分系統(tǒng)自帶了rsyslog服務(wù),不需要額外安裝一個(gè)程序來(lái)收集日志,但是rsyslog要傳數(shù)據(jù)到kafka需要用到omkafka模塊,omkafka對(duì)rsyslog版本有要求,大部分系統(tǒng)需要升級(jí)rsyslog版本很麻煩,就放棄了
kafka:kafka就是為處理日志類數(shù)據(jù)而生,我們采用3臺(tái)機(jī)器做kafka集群,同時(shí)1個(gè)topic對(duì)應(yīng)多個(gè)group,避免單點(diǎn)
logstash:作為為從kafka取數(shù)據(jù),過(guò)濾之后寫入elasticsearch。還在想為啥介紹kafka的時(shí)候說(shuō)明1個(gè)topic對(duì)應(yīng)多個(gè)group?主要是為了一個(gè)group對(duì)應(yīng)一個(gè)logstash index,解決掉logstash這里的單點(diǎn)
elasticsearch:存儲(chǔ)過(guò)濾之后的數(shù)據(jù),同樣采用了3個(gè)節(jié)點(diǎn)的集群,避免單點(diǎn)
kibana:可視化工具,方便的來(lái)搜索想要的數(shù)據(jù),同事也做各種報(bào)表,一目了然
總結(jié)
- 支持:要獲得各方的支持,項(xiàng)目已經(jīng)成功了一半,沒有啥事一頓燒烤解決不了的,如果有就兩頓
- 規(guī)范:眾多的項(xiàng)目,龐大的系統(tǒng),必須要有規(guī)范,規(guī)范是自動(dòng)化的基礎(chǔ)
- 文檔:實(shí)施的詳細(xì)過(guò)程、如何使用、怎么維護(hù)要保留有詳細(xì)文檔
- 培訓(xùn):對(duì)于jenkins、elk非運(yùn)維使用的工具要對(duì)使用者有相應(yīng)的培訓(xùn)分享,當(dāng)然運(yùn)維內(nèi)部也要分享項(xiàng)目的種種細(xì)節(jié)
當(dāng)前題目:中小團(tuán)隊(duì)基于Docker的DevOps實(shí)踐
當(dāng)前地址:http://fisionsoft.com.cn/article/dpjegcg.html


咨詢
建站咨詢
