作者 劉濤 發布於 2023年5月13日 | 注意:gtlc全球技術領導力峰會,500+cto技聚重新定義技術領導力!討論
2023年底,aws在「re:invent」大會上發布了三個新的部署、管理服務codedeploy ,codecommit和codepipeline。此前aws已經提供beanstalk,opsworks,cloudformation等部署與管理服務,那為什麼aws仍然會繼續在部署、管理服務上發力呢?使用者有哪些問題還沒有得到很好解決呢?本文將深度剖析這三個服務之一:codededploy,剖析codedeploy解決的問題,以及闡述我們對其背後的原理和思想的理解。希望籍此能夠吸收amazon的經驗並應用於改進和加速我們的開發交付過程。
codedeploy是aws提供給其使用者的自動化部署服務,能夠讓aws使用者方便快速地將應用自動部署到ec2例項上。通過部署流程的標準化和自動化,加快部署的速度,控制部署節奏,降低應用公升級更新的複雜度,減少手工部署操作的錯誤和風險。最終使得使用者能夠在快速地發布新特性的同時保證部署的質量,避免部署過程中的服務中斷。在支撐規模上,該服務能夠處理成千上萬節點規模的應用部署,能夠滿足絕大部分使用者的部署規模要求。目前該服務僅在aws美東virginia和美西oregon開放。
2023年11月,amazon cto werner vogels在其部落格中透露了codedeploy的**及其背後的故事(the story of apollo - amazon』s deployment engine)。
相關廠商內容
相關贊助商
多年前,amazon為了加快研發交付的速度,從公司層面對系統架構和開發組織結構進行了調整。整個系統架構轉向soa,將大型系統都拆分成規模較小、獨立執行的soa服務。開發組織也調整為乙個個小型自治團隊,由每個團隊全權負責管理其soa服務的開發和運維,而不是將開發和運維分開由不同的團隊負責。這個變化之後,他們很快發現部署過程又成為了新的瓶頸,於是很多團隊通過將其部署過程自動化來解決這個瓶頸。最初在系統部署節點規模小和部署要求比較簡單時都可以應付,但是隨著系統部署節點規模的增大,跨資料中心部署以及對服務sla更高的要求,部署問題及解決變得複雜起來。為了避免各個團隊重複解決相同問題,amazon構建了乙個內部部署系統apollo,讓團隊不再因為部署而降低發布新特性的速度。據悉,現在amazon內部每天有數千工程師通過apollo部署服務,2023年部署次數超過5000萬次。
與此同時,amazon外部的很多其客戶也遇到同樣的問題,他們希望amazon能夠分享相關實踐經驗。於是amazon基於apollo發布了其公開版本,即codedeploy。
說到這裡,我們不禁要問,amazon的apolllo及其公開服務codedeploy究竟是怎麼解決開發運維中的部署問題? aws自身也是天天需要部署。這麼複雜的乙個系統,有著嚴格的sla,都能做到無downtime公升級,背後的原理是什麼?是怎麼設計的?下面我們先來看一下codedeploy解決的具體問題,然後再看codedeploy背後的設計和蘊含的思想。
codedeploy解決的主要問題在於配合amazon組織結構及系統架構設計調整,加速業務的交付,處理應用的部署交付,使該環節不再是影響交付速度的瓶頸。
對於部署,很多人覺的很簡單,沒有太大用處,不值得在上面花費時間。但是實際上,可以說部署過程對整個開發交付運維過程,交付速度質量影響是非常大的,特別是對於分布式系統,系統比較複雜,元件比較多,部署節點規模很大,對系統有sla要求時,其需求場景內涵和外延是很廣的,處理場景包括不同應用型別和架構,不同的應用元件**打包方式,不同的目標部署環境,不同部署過程要求,等等。 下面舉一些部署要處理的場景。
1) 應用型別和架構不同
2) 應用元件**打包不同
3) 目標部署環境不同
4) 部署過程要求不同
對於codedeploy,除去其將環境繫結到aws外,其設計思想還是很通用的,能夠處理以上絕大多數的場景。那麼為什麼codedeploy能夠解決這些問題,消除部署瓶頸,保持靈活通用? 我們來看看它的設計原理和思想。
傳統方式採用的是整體部署的方式。在我們實際的開發和運維過程中,簡單應用的元件通常比較少,部署場景也比較簡單,適合整體部署。但是,對於元件比較多的大型應用,我們發現往往每次部署公升級僅涉及其中幾個元件,部署過程中往往最複雜的地方是各個元件之間的連線配置,公升級順序的控制和資料庫表結構的公升級。如果採用soa的方式,把乙個大型複雜的系統分解為乙個個規模較小、獨立自治的soa服務,相當於簡化問題。一方面分解出的每個系統複雜度會降低,另一方面元件之間的連線配置會大大簡化,這樣部署也就相應地簡化,更易於處理和保證部署質量。
codedeploy著眼的就是將大系統分解為多個soa服務,通過部署分解後的soa服務來處理整個系統的部署。相當於把整個系統部署分成多個區域性部署,分而治之,這就是微服務、soa的理念在部署環節的體現。
傳統應用**和部署指令碼是分離的,基於很多不同的部署工具開發,如chef,puppet,ansible,或者開發人員自己寫的shell,python部署指令碼。由於系統的開發和運維由乙個自治團隊全權負責,所以將**與部署放在一起就非常自然。從這一點也可以看出devops的理念,即消除dev和ops之間的鴻溝,統一dev和ops的目標和部署。另外,將應用**與部署指令碼一體化,也簡化了**和部署指令碼的管理,避免**版本與部署指令碼版本需要對應的問題。其實,這種設計也簡化了使用者的使用過程,不需要額外再做部署指令碼版本的管理了。
可以說,這個介面的設計非常靈活通用,適用於非常廣泛的應用和部署場景,比如不管應用元件**打包是在一起還是分開,不管應用架構是否是soa,把適配各種場景的實現留給應用的開發人員,由開發人員針對不同的場景按需實現。而codedeploy處理應用版本資訊的管理,部署組管理,部署過程各個步驟自動化協調控制, 執行指定的各個步驟的指令碼和部署過程的視覺化。
圖1: 基於事件的部署介面定義
由於codedeploy只處理對基礎環境ec2例項的部署,且只針對乙個應用(元件),而實際過程中,乙個系統包含了多個元件,那麼整個系統的生命週期管理的整個過程需要自動化,所以codedeploy也開放了相應api介面以及cli,以便應用開發人員能夠將codedeploy服務整合到自己的開發流程,實現持續交付。
應用生命週期管理包括配置管理,資源管理,環境管理,部署交付管理,自動化測試,監控告警,備份恢復及容量伸縮等各個環節,我們看到codedeploy僅處理**部署問題,並不處理應用配置管理,資源管理,環境管理以及之後的監控和恢復,伸縮等環節。 其中:
「you build it,you run it.」 是amazon cto信奉的理念,這個工具再次體現了這點。當然,它也體現了devops的思想,體現了amazon的soa架構。雖然codedeploy只能用於管理aws上的應用的部署,不能用於管理我們國內雲上的應用,但是我們還是能夠從中借鑑很多理念和設計,調整我們的系統架構和組織架構,統一dev和ops的目標及工具,以加快我們的交付速度,提公升運維的效率質量。
資料恢復該怎麼做
資料恢復對於大部分人都是乙個陌生的詞,一但接觸資料恢復就意味著有重要的資料丟失,不得不做資料恢復.但是資料丟失後要該怎麼做,相信很多人沒有清晰的認識.下面我來為大家分析幾種常見的資料丟失後應該如何做.1 檔案誤刪除 誤刪檔案後,檔案所在的盤不能存入任何新的檔案。不管是先刪除到 站還是直接安裝 f鍵永...
ERP軟體到底該怎麼做?
在國內一家知名的erp軟體公司做了三載有餘,思考了本公司的erp軟體開發管理流程,再對比整個行業的現狀,本人對國內erp軟體開發管理流程卻越來越迷惑了。不知道erp軟體到底該怎麼做,希望能和大家一起討論下。以下是我想到的一些問題 最首要的問題是產品的標準化與專案的交付如何區分與保證。銷售人員為了銷售...
404頁面該怎麼做?
404 很多開源系統包括cms系統 blog系統等不提供404頁面或提供的404頁面並未達到seo的要求,這讓 的權威性大打折扣。404頁面該達到怎麼樣的效果才符合seo要求?搜尋引擎通過http狀態碼 來識別網頁的狀態。當搜尋引擎獲得了乙個錯誤鏈結時,應該返回404狀態碼,告訴搜尋引擎放棄對該鏈結...