如何理解DevOps
引言
DevOps是一種重要的軟件開發(fā)模式;
我所在的團(tuán)隊(duì)正在進(jìn)行DevOps轉(zhuǎn)型;
DevOps極大地提升了開發(fā)效率;
本文介紹了我對DevOps的理解;
什么是DevOps
DevOps是一種軟件開發(fā)人員(Research and Dev,RD)和IT運(yùn)維運(yùn)營技術(shù)人員(Ops)和質(zhì)量檢測(QA)之間溝通合作的模式;
DevOps的根本目的是快速頻繁的、小步的、自動化便捷的監(jiān)控和審計(jì)的、云端和虛擬化的、可視化的部署,滿足“每天部署10次”或者“快速解決bug并上線”的要求;
DevOps是敏捷開發(fā)、持續(xù)交付的基礎(chǔ);
DevOps模式和傳統(tǒng)的瀑布模型相對應(yīng);
我們需要維護(hù)什么?
以我所在的團(tuán)隊(duì)為例,我們需要維護(hù)的內(nèi)容如下:
需要維護(hù)的環(huán)境分為:開發(fā)環(huán)境,測試環(huán)境,準(zhǔn)生產(chǎn)環(huán)境,生產(chǎn)環(huán)境;
每個環(huán)境包含若干個scope,每個scope都是整個系統(tǒng)的一部分,由不同的團(tuán)隊(duì)進(jìn)行開發(fā);
使用microsoft微服務(wù)架構(gòu),每個scope中都有若干service,每個service之間可能還存在相互依賴關(guān)系;
每個service都需要若干resource,這些resource包括但不限于:
RabbitMQ;
Service Fabric;
IoTHub;
EventHub;
ELK;
Consule;
KeyVault;
MongoDB;
Postgresql;
Cassandra;
Storm;
Redis;
如果沒有DevOps,我們怎樣工作?
沒有流水線Pipeline:
開發(fā)過程變得非常痛苦,會經(jīng)常忘記對代碼進(jìn)行單元測試和集成測試;
開發(fā)完成的服務(wù),打包后不知道放在何處,別人需要引用時很不方便;
代碼質(zhì)量得不到保證,很多代碼沒有經(jīng)過“單元測試覆蓋率檢測”和“代碼重復(fù)率檢測”,代碼可維護(hù)性變差;
隨著開發(fā)的深入進(jìn)行,開發(fā)人員的主要精力不在是編寫新的代碼,而是處理bug和維護(hù)舊的代碼,使開發(fā)效率逐漸降低;
沒有自動化環(huán)境部署:
在開發(fā)者完成一個微服務(wù)的開發(fā)后,不知道將自己開發(fā)的服務(wù)部署到什么環(huán)境上去測試;
開發(fā)者在測試自己的代碼時,會時常發(fā)現(xiàn)所依賴的資源沒有準(zhǔn)備好,比如測試環(huán)境缺少M(fèi)ongoDB等資源;
運(yùn)維人員不能顯式的看到自己維護(hù)了多少資源,每種資源都在被哪些環(huán)境、哪些service引用;
運(yùn)維人員不能顯式的看到資源的使用情況及使用量;
經(jīng)理不能有效的進(jìn)行成本控制;
沒有自動化監(jiān)控系統(tǒng):
運(yùn)維人員不能在機(jī)器、硬件、軟件出現(xiàn)故障時得到及時的警告,導(dǎo)致機(jī)器掛掉了都還不知道;
不能靈活調(diào)配各種資源的使用,導(dǎo)致某些資源極度緊缺、某些資源卻有富余;
手動,而不是自動:
從下面的圖片可以看出,只需手工運(yùn)行5條命令的情況下,成功部署的概率就已跌至86%,如需手工運(yùn)行55條命令,成功部署的概率將跌至22%,如需手工運(yùn)行100條命令,成功部署的概率將趨近于0(僅2%)!

為什么要有DevOps
不知道目前發(fā)布、部署的進(jìn)展情況;
沒有一套明確的發(fā)布、部署流程,急上線時容易出問題,出了問題也沒有預(yù)案來解決;
自動化程度不夠;
DevOps工具鏈
編碼:代碼開發(fā)和審閱,版本控制工具、代碼合并工具;
構(gòu)建:持續(xù)集成工具、構(gòu)建狀態(tài)統(tǒng)計(jì)工具;
測試:通過測試和結(jié)果確定績效的工具;
打包:成品倉庫、應(yīng)用程序部署前暫存;
發(fā)布:變更管理、發(fā)布審批、發(fā)布自動化;
配置:基礎(chǔ)架構(gòu)配置和部署,基礎(chǔ)架構(gòu)即代碼工具;
監(jiān)視:應(yīng)用程序性能監(jiān)視、最終用戶體驗(yàn);
DevOps的多維度目標(biāo)
團(tuán)隊(duì)維度:擬合開發(fā)和運(yùn)維的鴻溝,支持位于全球多個地點(diǎn)的、包含外包人員的、混合開發(fā)/測試/基礎(chǔ)設(shè)施的團(tuán)隊(duì);
技術(shù)維度:擬合多類型的分布式的硬件平臺和上面部署的多種應(yīng)用、多種需求的鴻溝;
需求維度:平衡軟件開發(fā)過程中對軟件用戶需求變化、追求穩(wěn)定性、追求開發(fā)效率、降低check-in風(fēng)險這幾個目標(biāo);
市場維度:解決軟件迭代慢和較高的用戶需求的矛盾;
終極目標(biāo):從時間和空間兩個維度,合理統(tǒng)籌并高效使用現(xiàn)有資源,實(shí)現(xiàn)組織目標(biāo),最大限度滿足用戶需求;
DevOps需要遵循的基本原則
以人為本,一切工具都是為人服務(wù);
需求細(xì)分,及時開發(fā),及時驗(yàn)證;
減少開發(fā)的分支,盡量在主干上開發(fā),避免合并分支造成的開銷和時間浪費(fèi);另外,分支太多的時候不可能做到持續(xù)集成;
減少代碼積壓,代碼積壓越多、越多的需求和開發(fā)成果得不到驗(yàn)證、效率就越低、下次部署的風(fēng)險就越大;
代碼和配置相分離,盡量降低他們在邏輯或者物理上的耦合;
盡早生成二進(jìn)制包,而不是使用源代碼,并確保二進(jìn)制包不被篡改;
二進(jìn)制包應(yīng)當(dāng)和環(huán)境無關(guān);
確保部署流程是冪等的;
對生產(chǎn)和測試環(huán)境的修改只能由程序,而不是人完成;
環(huán)境管理
環(huán)境必須遵循:快速部署和響應(yīng)(使用docker或者其他虛擬化技術(shù)能夠更容易做到這一點(diǎn)),可恢復(fù),可支持,可審計(jì);
環(huán)境配置項(xiàng)目:
操作系統(tǒng)和配置;
中間件和軟件棧及配置:數(shù)據(jù)庫,消息系統(tǒng),隊(duì)列;
基礎(chǔ)設(shè)施軟件:代碼管理,目錄服務(wù),監(jiān)控;
外部集成:外部系統(tǒng)和服務(wù);
網(wǎng)絡(luò):路由,防火墻,交換機(jī),DNS;
團(tuán)隊(duì):開發(fā)團(tuán)隊(duì)和infra團(tuán)隊(duì)之間的協(xié)調(diào)分工;
自動化的環(huán)境部署;
測試環(huán)境應(yīng)當(dāng)和生產(chǎn)環(huán)境盡量一致;
環(huán)境的配置文件也應(yīng)當(dāng)進(jìn)行版本控制;
監(jiān)控
監(jiān)控的內(nèi)容:
硬件,物理設(shè)備,路由器,代理;
操作系統(tǒng);
中間件;
應(yīng)用程序;
日志;
如何監(jiān)控:
清晰的信息展示;
及時地告警;
可視化的狀態(tài)呈現(xiàn);
常用DevOps利器
Jenkins:開源的持續(xù)集成工具;
https://www.jenkins.io/SonarQube:開源的代碼質(zhì)量管理系統(tǒng);
https://www.sonarqube.org/Puppet:開源的軟件自動化配置和部署工具;
https://puppet.com/Docker:讓應(yīng)用程序布署在軟件容器下的工作可以自動化進(jìn)行;
https://www.docker.com/總結(jié):DevOps到底是什么?
高效的流水線開發(fā)/測試/上線;
自動化的環(huán)境部署和管理;
良好和及時的監(jiān)控/告警/可視化/反饋/日志;
開發(fā)團(tuán)隊(duì)、運(yùn)維團(tuán)隊(duì)、用戶之間良好的溝通協(xié)作,快速解決問題的能力;
完整的文檔;
任一模塊的冪等和可恢復(fù);
良好的審計(jì)和評估,良好的成本管理;
整個系統(tǒng)穩(wěn)定且靈活,高度自動化;
總而言之,DevOps的核心只有三個詞:高效、自動、監(jiān)控;
參考
DevOps的真諦到底是什么?https://mp.weixin.qq.com/s?__biz=MzIzNjUxMzk2NQ==&mid=2247485035&idx=1&sn=d8dbc8e682dc9f634263b9ba1178daa9持續(xù)集成是什么?http://www.ruanyifeng.com/blog/2015/09/continuous-integration.html持續(xù)交付概述 http://exceedhl.thoughtworkers.org/cd/cd.html看板管理 https://zh.wikipedia.org/wiki/%E7%9C%8B%E6%9D%BF%E7%AE%A1%E7%90%86
source: //changsiyuan.github.io/2017/06/15/2017-6-15-DevOps
分享&在看
