原創(chuàng)|行業(yè)資訊|編輯:鄭恭琳|2020-12-16 14:49:01.787|閱讀 345 次
概述:更快的發(fā)布周期是微服務(wù)架構(gòu)的主要優(yōu)勢之一。但是,如果沒有良好的CI/CD流程,您將無法實現(xiàn)微服務(wù)所承諾的敏捷性。本文介紹了挑戰(zhàn)并提出了解決此問題的一些方法。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關(guān)鏈接:
更快的發(fā)布周期是微服務(wù)架構(gòu)的主要優(yōu)勢之一。但是,如果沒有良好的CI/CD流程,您將無法實現(xiàn)微服務(wù)所承諾的敏捷性。本文介紹了挑戰(zhàn)并提出了解決此問題的一些方法。
當(dāng)我們談?wù)?/span>CI/CD時,實際上是在談?wù)搸讉€相關(guān)過程:持續(xù)集成、持續(xù)交付和持續(xù)部署。
以下是微服務(wù)架構(gòu)的健壯CI/CD流程的一些目標(biāo):
在傳統(tǒng)的整體應(yīng)用程序中,只有一個構(gòu)建管道,其輸出是應(yīng)用程序可執(zhí)行文件。所有開發(fā)工作都將饋入此管道。如果發(fā)現(xiàn)高優(yōu)先級錯誤,則必須集成,測試和發(fā)布修補程序,這可能會延遲新功能的發(fā)布。您可以通過使用結(jié)構(gòu)良好的模塊并使用功能分支來最大程度地減少代碼更改的影響來減輕這些問題。但是,隨著應(yīng)用程序變得越來越復(fù)雜,并添加了更多功能,整裝件的發(fā)布過程往往變得更加脆弱,并可能會破裂。
遵循微服務(wù)理念,永遠(yuǎn)不會有一個漫長的發(fā)布培訓(xùn),每個團隊都必須排隊。構(gòu)建服務(wù)“A”的團隊可以隨時發(fā)布更新,而無需等待服務(wù)“B”中的更改被合并,測試和部署。
CI/CD整體圖
為了達(dá)到較高的釋放速度,您的釋放管道必須自動化且高度可靠,以最大程度地降低風(fēng)險。如果您每天一次或多次發(fā)布產(chǎn)品,則回歸或服務(wù)中斷必定很少發(fā)生。同時,如果確實部署了錯誤的更新,則必須以可靠的方式快速回滾或前滾到服務(wù)的先前版本。
緩解措施:建立統(tǒng)一的自動化管道來構(gòu)建和部署服務(wù),以使這些知識不會在每個團隊中“隱藏”。
緩解措施:容器化每個服務(wù)的構(gòu)建過程。這樣,構(gòu)建系統(tǒng)僅需要能夠運行容器。
緩解措施:CI/CD流程自動化和可靠的程度越高,對中央機構(gòu)的需求就越少。也就是說,您可能有不同的策略來發(fā)布主要功能更新與次要錯誤修復(fù)。權(quán)力下放并不意味著零治理。
緩解措施:使用部署技術(shù)(例如藍(lán)綠色或Canary發(fā)布)進行不間斷的更改。要中斷API更改,請與以前的版本并排部署新版本。這樣,可以對使用先前API的服務(wù)進行更新并針對新API進行測試。請參閱下面的更新服務(wù)。
在創(chuàng)建CI/CD工作流之前,您必須了解代碼庫的結(jié)構(gòu)和管理方式。
monorepo方法一直受到歡迎,但兩者都有優(yōu)點和缺點。
代碼共享
易于標(biāo)準(zhǔn)化代碼和工具
重構(gòu)代碼更容易
可發(fā)現(xiàn)性——代碼的單一視圖
明確每個團隊的所有權(quán)
潛在的合并沖突更少
有助于強制微服務(wù)解耦
共享代碼的更改可能會影響多個微服務(wù)
合并沖突的可能性更大
工具必須擴展到大型代碼庫
訪問控制
更復(fù)雜的部署過程更難共享代碼
難以執(zhí)行編碼標(biāo)準(zhǔn)
依賴管理
擴散的代碼庫,可發(fā)現(xiàn)性差
缺乏共享基礎(chǔ)架構(gòu)
更新服務(wù)
Monorepo
多存儲庫
優(yōu)勢
挑戰(zhàn)
有多種策略可以更新已經(jīng)投入生產(chǎn)的服務(wù)。在這里,我們討論三個常用選項:滾動更新、藍(lán)綠色部署和canary發(fā)布。
滾動更新
在滾動更新中,您將部署服務(wù)的新實例,新實例立即開始接收請求。隨著新實例的出現(xiàn),以前的實例將被刪除。
例如,在Kubernetes中,當(dāng)您更新Deployment的Pod規(guī)范時,滾動更新是默認(rèn)行為。部署控制器為更新的Pod創(chuàng)建一個新的ReplicaSet。然后,它會按比例縮放新的ReplicaSet,同時按比例縮小舊的ReplicaSet,以保持所需的副本數(shù)。在新的Pod就緒之前,它不會刪除舊的Pod。Kubernetes保留更新的歷史記錄,因此您可以根據(jù)需要回滾更新。
例如,默認(rèn)情況下,Azure Service Fabric使用滾動更新策略。此策略最適合在不更改現(xiàn)有API的情況下部署具有新功能的服務(wù)版本。Service Fabric通過將應(yīng)用程序類型更新為節(jié)點的子集或更新域來啟動升級部署。然后,它將前滾到下一個更新域,直到所有域都升級。如果升級域更新失敗,則應(yīng)用程序類型將在所有域中回滾到以前的版本。請注意,具有多個服務(wù)的應(yīng)用程序類型(并且如果所有服務(wù)都作為一個升級部署的一部分進行更新)則很容易發(fā)生故障。如果一項服務(wù)更新失敗,則整個應(yīng)用程序?qū)⒒貪L到以前的版本,而其他服務(wù)則不會更新。
滾動更新的一個挑戰(zhàn)是,在更新過程中,新舊版本的混合正在運行并接收流量。在此期間,任何請求都可以路由到兩個版本中的任何一個。
為了打破API更改,一個好的做法是并排支持兩個版本,直到更新了先前版本的所有客戶端為止。請參閱API版本控制。
藍(lán)綠色部署
在藍(lán)綠色部署中,您將新版本與先前版本一起部署。驗證新版本后,您可以一次將所有流量從以前的版本切換到新版本。切換之后,您可以監(jiān)視應(yīng)用程序是否存在任何問題。如果出現(xiàn)問題,您可以交換回舊版本。假設(shè)沒有問題,則可以刪除舊版本。
對于更傳統(tǒng)的單片或N層應(yīng)用程序,藍(lán)綠色部署通常意味著預(yù)配兩個相同的環(huán)境。您可以將新版本部署到暫存環(huán)境,然后將客戶端流量重定向到暫存環(huán)境,例如,通過交換VIP地址。在微服務(wù)體系結(jié)構(gòu)中,更新發(fā)生在微服務(wù)級別,因此您通常將更新部署到同一環(huán)境中,并使用服務(wù)發(fā)現(xiàn)機制進行交換。
例如,在Kubernetes中,您無需配置單獨的集群即可進行藍(lán)綠色部署。相反,您可以利用選擇器。使用新的pod規(guī)范和一組不同的標(biāo)簽創(chuàng)建新的Deployment資源。創(chuàng)建此部署,而不刪除先前的部署或修改指向它的服務(wù)。新的Pod運行之后,您可以更新服務(wù)的選擇器以匹配新的部署。
藍(lán)綠色部署的一個缺點是,在更新期間,您正在運行該服務(wù)的Pod(當(dāng)前和下一個)兩倍。如果Pod需要大量CPU或內(nèi)存資源,則可能需要臨時擴展群集以處理資源消耗。
Canary發(fā)布
在Canary版本中,您向少數(shù)客戶端推出了更新版本。然后,在將新服務(wù)推廣到所有客戶端之前,您將監(jiān)視新服務(wù)的行為。這樣一來,您就可以以受控方式進行緩慢的部署,觀察實際數(shù)據(jù)并在所有客戶都受到影響之前發(fā)現(xiàn)問題。
Canary版本比藍(lán)綠色更新或滾動更新更復(fù)雜,因為您必須將請求動態(tài)路由到服務(wù)的不同版本。
例如,在Kubernetes中,您可以將服務(wù)配置為跨越兩個副本集(每個版本一個)并手動調(diào)整副本計數(shù)。但是,由于Kubernetes跨Pod負(fù)載均衡的方式,這種方法相當(dāng)粗糙。例如,如果總共有10個副本,則只能以10%的增量轉(zhuǎn)移流量。如果使用服務(wù)網(wǎng)格,則可以使用服務(wù)網(wǎng)格路由規(guī)則來實現(xiàn)更復(fù)雜的Canary發(fā)布策略。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn