引言
DevOps是一種重要的軟件開發(fā)模式;
我所在的團(tuán)隊(duì)正在進(jìn)行DevOps轉(zhuǎn)型;
DevOps極大地提升了開發(fā)效率;
本文介紹了我對(duì)DevOps的理解;
什么是DevOps
DevOps是一種軟件開發(fā)人員(Research and Dev,RD)和IT運(yùn)維運(yùn)營(yíng)技術(shù)人員(Ops)和質(zhì)量檢測(cè)(QA)之間溝通合作的模式;
DevOps的根本目的是快速頻繁的、小步的、自動(dòng)化便捷的監(jiān)控和審計(jì)的、云端和虛擬化的、可視化的部署,滿足“每天部署10次”或者“快速解決bug并上線”的要求;
DevOps是敏捷開發(fā)、持續(xù)交付的基礎(chǔ);
DevOps模式和傳統(tǒng)的瀑布模型相對(duì)應(yīng);
我們需要維護(hù)什么?
以我所在的團(tuán)隊(duì)為例,我們需要維護(hù)的內(nèi)容如下:
需要維護(hù)的環(huán)境分為:開發(fā)環(huán)境,測(cè)試環(huán)境,準(zhǔn)生產(chǎn)環(huán)境,生產(chǎn)環(huán)境;
每個(gè)環(huán)境包含若干個(gè)scope,每個(gè)scope都是整個(gè)系統(tǒng)的一部分,由不同的團(tuán)隊(duì)進(jìn)行開發(fā);
使用microsoft微服務(wù)架構(gòu),每個(gè)scope中都有若干service,每個(gè)service之間可能還存在相互依賴關(guān)系;
每個(gè)service都需要若干resource,這些resource包括但不限于:
RabbitMQ;
Service Fabric;
IoTHub;
EventHub;
ELK;
Consule;
KeyVault;
MongoDB;
Postgresql;
Cassandra;
Storm;
Redis;
如果沒有DevOps,我們?cè)鯓庸ぷ鳎?/p>
沒有流水線Pipeline:
開發(fā)過程變得非常痛苦,會(huì)經(jīng)常忘記對(duì)代碼進(jìn)行單元測(cè)試和集成測(cè)試;
開發(fā)完成的服務(wù),打包后不知道放在何處,別人需要引用時(shí)很不方便;
代碼質(zhì)量得不到保證,很多代碼沒有經(jīng)過“單元測(cè)試覆蓋率檢測(cè)”和“代碼重復(fù)率檢測(cè)”,代碼可維護(hù)性變差;
隨著開發(fā)的深入進(jìn)行,開發(fā)人員的主要精力不在是編寫新的代碼,而是處理bug和維護(hù)舊的代碼,使開發(fā)效率逐漸降低;
沒有自動(dòng)化環(huán)境部署:
在開發(fā)者完成一個(gè)微服務(wù)的開發(fā)后,不知道將自己開發(fā)的服務(wù)部署到什么環(huán)境上去測(cè)試;
開發(fā)者在測(cè)試自己的代碼時(shí),會(huì)時(shí)常發(fā)現(xiàn)所依賴的資源沒有準(zhǔn)備好,比如測(cè)試環(huán)境缺少M(fèi)ongoDB等資源;
運(yùn)維人員不能顯式的看到自己維護(hù)了多少資源,每種資源都在被哪些環(huán)境、哪些service引用;
運(yùn)維人員不能顯式的看到資源的使用情況及使用量;
經(jīng)理不能有效的進(jìn)行成本控制;
沒有自動(dòng)化監(jiān)控系統(tǒng):
運(yùn)維人員不能在機(jī)器、硬件、軟件出現(xiàn)故障時(shí)得到及時(shí)的警告,導(dǎo)致機(jī)器掛掉了都還不知道;
不能靈活調(diào)配各種資源的使用,導(dǎo)致某些資源極度緊缺、某些資源卻有富余;
手動(dòng),而不是自動(dòng):
從下面的圖片可以看出,只需手工運(yùn)行5條命令的情況下,成功部署的概率就已跌至86%,如需手工運(yùn)行55條命令,成功部署的概率將跌至22%,如需手工運(yùn)行100條命令,成功部署的概率將趨近于0(僅2%)!
為什么要有DevOps
不知道目前發(fā)布、部署的進(jìn)展情況;
沒有一套明確的發(fā)布、部署流程,急上線時(shí)容易出問題,出了問題也沒有預(yù)案來解決;
自動(dòng)化程度不夠;
DevOps工具鏈
編碼:代碼開發(fā)和審閱,版本控制工具、代碼合并工具;
構(gòu)建:持續(xù)集成工具、構(gòu)建狀態(tài)統(tǒng)計(jì)工具;
測(cè)試:通過測(cè)試和結(jié)果確定績(jī)效的工具;
打包:成品倉(cāng)庫(kù)、應(yīng)用程序部署前暫存;
發(fā)布:變更管理、發(fā)布審批、發(fā)布自動(dòng)化;
配置:基礎(chǔ)架構(gòu)配置和部署,基礎(chǔ)架構(gòu)即代碼工具;
監(jiān)視:應(yīng)用程序性能監(jiān)視、最終用戶體驗(yàn);
DevOps的多維度目標(biāo)
團(tuán)隊(duì)維度:擬合開發(fā)和運(yùn)維的鴻溝,支持位于全球多個(gè)地點(diǎn)的、包含外包人員的、混合開發(fā)/測(cè)試/基礎(chǔ)設(shè)施的團(tuán)隊(duì);
技術(shù)維度:擬合多類型的分布式的硬件平臺(tái)和上面部署的多種應(yīng)用、多種需求的鴻溝;
需求維度:平衡軟件開發(fā)過程中對(duì)軟件用戶需求變化、追求穩(wěn)定性、追求開發(fā)效率、降低check-in風(fēng)險(xiǎn)這幾個(gè)目標(biāo);
市場(chǎng)維度:解決軟件迭代慢和較高的用戶需求的矛盾;
終極目標(biāo):從時(shí)間和空間兩個(gè)維度,合理統(tǒng)籌并高效使用現(xiàn)有資源,實(shí)現(xiàn)組織目標(biāo),最大限度滿足用戶需求;
DevOps需要遵循的基本原則
以人為本,一切工具都是為人服務(wù);
需求細(xì)分,及時(shí)開發(fā),及時(shí)驗(yàn)證;
減少開發(fā)的分支,盡量在主干上開發(fā),避免合并分支造成的開銷和時(shí)間浪費(fèi);另外,分支太多的時(shí)候不可能做到持續(xù)集成;
減少代碼積壓,代碼積壓越多、越多的需求和開發(fā)成果得不到驗(yàn)證、效率就越低、下次部署的風(fēng)險(xiǎn)就越大;
代碼和配置相分離,盡量降低他們?cè)谶壿嫽蛘呶锢砩系鸟詈希?/p>
盡早生成二進(jìn)制包,而不是使用源代碼,并確保二進(jìn)制包不被篡改;
二進(jìn)制包應(yīng)當(dāng)和環(huán)境無(wú)關(guān);
確保部署流程是冪等的;
對(duì)生產(chǎn)和測(cè)試環(huán)境的修改只能由程序,而不是人完成;
環(huán)境管理
環(huán)境必須遵循:快速部署和響應(yīng)(使用docker或者其他虛擬化技術(shù)能夠更容易做到這一點(diǎn)),可恢復(fù),可支持,可審計(jì);
環(huán)境配置項(xiàng)目:
操作系統(tǒng)和配置;
中間件和軟件棧及配置:數(shù)據(jù)庫(kù),消息系統(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)分工;
自動(dòng)化的環(huán)境部署;
測(cè)試環(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)控:
清晰的信息展示;
及時(shí)地告警;
可視化的狀態(tài)呈現(xiàn);
常用DevOps利器
Jenkins:開源的持續(xù)集成工具;
SonarQube:開源的代碼質(zhì)量管理系統(tǒng);
Puppet:開源的軟件自動(dòng)化配置和部署工具;
Docker:讓應(yīng)用程序布署在軟件容器下的工作可以自動(dòng)化進(jìn)行;
總結(jié):DevOps到底是什么?
高效的流水線開發(fā)/測(cè)試/上線;
自動(dòng)化的環(huán)境部署和管理;
良好和及時(shí)的監(jiān)控/告警/可視化/反饋/日志;
開發(fā)團(tuán)隊(duì)、運(yùn)維團(tuán)隊(duì)、用戶之間良好的溝通協(xié)作,快速解決問題的能力;
完整的文檔;
任一模塊的冪等和可恢復(fù);
良好的審計(jì)和評(píng)估,良好的成本管理;
整個(gè)系統(tǒng)穩(wěn)定且靈活,高度自動(dòng)化;
總而言之,DevOps的核心只有三個(gè)詞:高效、自動(dòng)、監(jiān)控;
參考
分享&在看
關(guān)鍵詞: 如何理解DevOps devops 軟件開發(fā)