如何使用短生命周期容器(Ephemeral Containers)構(gòu)建微服務(wù)化的工作流
本文作者Ross Jimenez來(lái)自CenturyLink Labs,他受到了Iron.io一篇介紹容器微服務(wù)的相關(guān)文章的啟發(fā),于是介紹了自己團(tuán)隊(duì)在構(gòu)建Panamax的時(shí)候所用到的微服務(wù)的理念,此外作者還大致介紹了微服務(wù)和容器技術(shù)相結(jié)合之后的優(yōu)勢(shì),以及他們?cè)鯓油ㄟ^(guò)微服務(wù)化的容器來(lái)構(gòu)建工作流模型。
通過(guò)Docker容器可以構(gòu)建具有特定功能的工作流,也可以讓容器在后臺(tái)執(zhí)行一系列的異步任務(wù),我們所開(kāi)發(fā)的Panamax項(xiàng)目,其工作模式正是依據(jù)Docker容器的這一特性進(jìn)行設(shè)計(jì)的。我偶然在Iron.io看到這篇有趣的文章,“Docker化的微服務(wù)的短暫生命周期”,盡管我已經(jīng)對(duì)Iron.io所提供的服務(wù)很熟悉,但是通過(guò)這篇文章,我更深入地了解他們?nèi)绾问褂萌萜?,特別是使用短生命周期的容器來(lái)完成他們的服務(wù),這的確給了我很多啟發(fā),于是我寫(xiě)下了這篇博客。
我們?cè)陧?xiàng)目中也一直使用短生命周期的容器,并把它們作為工作流中的一系列的功能性的容器,但是具體的使用方式和Iron.io有所不同。在Iron.io中,這些具有特定功能的工作流可以被一個(gè)事件觸發(fā),或者可以被提前指定好,并且可以按照即時(shí)的需求在后臺(tái)完成對(duì)應(yīng)的工作。在我們的使用環(huán)境中,工作流中的最初的幾步要求先被完成,整個(gè)工作流能否順利執(zhí)行要依賴與工作流開(kāi)始幾步所產(chǎn)生的輸出結(jié)果。
Panamax中工作流的用例:
在Panamax項(xiàng)目中,我們希望其中的一個(gè)功能是幫助我們的用戶在云服務(wù)平臺(tái)上遠(yuǎn)程啟動(dòng)一個(gè)集群,這樣用戶就可以輕易地在上面部署Panamax模板。我們目前已經(jīng)可以實(shí)現(xiàn)在遠(yuǎn)程基礎(chǔ)設(shè)施上部署模板,但是這需要對(duì)基礎(chǔ)設(shè)施進(jìn)行相關(guān)的設(shè)置,并且安裝遠(yuǎn)程代理/適配器,這些都是相互獨(dú)立的過(guò)程。
讓我們通過(guò)一個(gè)例子,來(lái)看如何進(jìn)行端對(duì)端的自動(dòng)化操作。這個(gè)例子可能是一個(gè)比較簡(jiǎn)化的例子,假設(shè)這里的功能需要三個(gè)基本的步驟來(lái)完成:
- 虛擬機(jī)創(chuàng)建—在提供集群服務(wù)的云服務(wù)平臺(tái)上開(kāi)啟虛擬機(jī)
- 對(duì)虛擬機(jī)進(jìn)行管理/編排工作—(Kubernetes、 CoreOs 等等)
- Panamax遠(yuǎn)程客戶端/適配器的安裝以及代理注冊(cè)服務(wù)
讓我們來(lái)繼續(xù)討論,對(duì)于上面這幾個(gè)步驟,由于每一步的相關(guān)執(zhí)行邏輯都被封裝在對(duì)應(yīng)的Docker容器中,所以每一個(gè)容器僅僅負(fù)責(zé)執(zhí)行一些指定的步驟。理論上我們可以通過(guò)并行的方式來(lái)同時(shí)啟動(dòng)這些容器,但是實(shí)際上我們會(huì)受到一定的限制,當(dāng)前這一步如果想要正常運(yùn)行,就必須要從前一步的運(yùn)行結(jié)果中取得某些數(shù)據(jù)(舉例來(lái)說(shuō),如果我們不知道在step1中所創(chuàng)建的服務(wù)器的地址,那么在step2中我們就無(wú)法安裝對(duì)應(yīng)的編排工具)
工作流的執(zhí)行
在嘗試處理不同例子的過(guò)程中,我們逐漸構(gòu)建起了一個(gè)一般性的通用框架,我們可以用這個(gè)來(lái)進(jìn)行基于容器的工作流的編排,就像我們?cè)谏厦嫠枋龅哪菢?。此外,我們的框架還需要完成以下的工作:
- 接收將要被執(zhí)行的工作流的描述信息(也就是一個(gè)容器的列表)
- 按照正確的順序啟動(dòng)容器并且對(duì)執(zhí)行過(guò)程進(jìn)行監(jiān)控
- 在工作流的不同執(zhí)行階段對(duì)數(shù)據(jù)進(jìn)行打包和調(diào)度
- 報(bào)告當(dāng)前工作流的執(zhí)行情況
還有一個(gè)需要解決的有趣問(wèn)題是,如何在容器之間進(jìn)行數(shù)據(jù)的遷移。我們通過(guò)使用Unix的管道模型(piping model),來(lái)解決這個(gè)問(wèn)題。我們會(huì)attach到一個(gè)運(yùn)行容器的標(biāo)準(zhǔn)輸出,并將輸出的內(nèi)容捕獲,之后再將數(shù)據(jù)寫(xiě)入工作流鏈中下一個(gè)容器的標(biāo)準(zhǔn)輸入流中。隨著工作流中的后續(xù)步驟被不斷執(zhí)行,前面幾個(gè)步驟的輸出結(jié)果就變成了接下來(lái)幾個(gè)步驟的輸入結(jié)果。
開(kāi)始的時(shí)候,我們將這個(gè)框架集成到了Panamax項(xiàng)目中,但是我們很快就要將這個(gè)框架以單獨(dú)的項(xiàng)目的形式發(fā)布出來(lái),這樣就可以幫助其他開(kāi)發(fā)者輕松實(shí)現(xiàn)類似的工作模式。
用于提供微服務(wù)的短生命周期容器
下面讓我們討論一下在具有特定功能的工作流中使用容器的優(yōu)點(diǎn):
- 容器可以運(yùn)行在任何支持容器工作方式的計(jì)算資源上,所以通過(guò)容器構(gòu)建的整個(gè)工作流或者是工作流中的某些步驟也可以直接在這些計(jì)算資源上運(yùn)行。
- 使用容器可以很方便地對(duì)所執(zhí)行的任務(wù)進(jìn)行邏輯單元的劃分,并且容器之間的隔離性可以使其在基于微服務(wù)的設(shè)計(jì)模式中很好地進(jìn)行工作。
- 只有在容器實(shí)際執(zhí)行的時(shí)候,計(jì)算資源才會(huì)被消耗,也就是說(shuō),只有在具體執(zhí)行任務(wù)的時(shí)候才需要計(jì)算資源。
- 工作流的模塊化性質(zhì)可以使得工作流中的每個(gè)步驟或者每一個(gè)邏輯單元,都變得容易進(jìn)行 修改/擴(kuò)展/重組/架構(gòu)解耦。
考慮到在采用上述策略后,我們整個(gè)過(guò)程中的每一步都是解耦的,這樣的話,對(duì)某個(gè)邏輯單元進(jìn)行重用,就會(huì)變得很容易。這就是微服務(wù)架構(gòu)的一個(gè)令人興奮的優(yōu)點(diǎn):即對(duì)于工作單元的可組合的能力。工作單元可以被重新排序,容易修改并且易于擴(kuò)展。雖然,我們用于工作的容器都是用GoLang語(yǔ)言來(lái)構(gòu)建的,但實(shí)際上,每一個(gè)容器都相當(dāng)于是一個(gè)黑盒,因此,開(kāi)發(fā)者可以用任何他們自己希望的方式來(lái)實(shí)現(xiàn)。這與Panamax的遠(yuǎn)程客戶端/適配器的概念很相似,它們同樣都是被封裝在容器中。
特定功能的容器工作流
我希望通過(guò)上面的介紹,你已經(jīng)對(duì)這個(gè)模式的具體工作方式有了一些了解。雖然我們這里討論的是一個(gè)很具體的例子,對(duì)于這種工作模式來(lái)說(shuō),還存在著更多的可能性。這種模式里構(gòu)建即時(shí)所需的傳感器驅(qū)動(dòng)(on-demand sensor driven)和基于事件的架構(gòu)(event based architectures)的能力使我感到非常興奮, 此外,對(duì)于如何計(jì)算資源被消耗的過(guò)程方面,也給了我很多啟發(fā)。如果Docker允許你在亞秒級(jí)別啟動(dòng)一個(gè)容器,在許多情況下,解決方案可以被完全重新構(gòu)建,目的是要使得解決方案更加能基于事件驅(qū)動(dòng)(event driven)以及滿足實(shí)時(shí)需求(on-demand)。這意味著資源密集型的解決方案將變得更少。因?yàn)橛?jì)算資源只有在短生命周期容器存在的情況下才會(huì)被需要。
還存在一種可能的解決方案:構(gòu)建基于容器的函數(shù)庫(kù),這個(gè)函數(shù)庫(kù)可以幫助非技術(shù)型用戶很容易地通過(guò)可視化的方式構(gòu)建他們自己的工作流。比如傳感器類型的容器可以查詢API、 執(zhí)行容器可以執(zhí)行工作單元。***再說(shuō)一點(diǎn),雖然我們目前只開(kāi)發(fā)了最基本的順序工作流,一旦你在實(shí)際工作中需要使用更復(fù)雜的工作流,只要遵照一些工作流模式的簡(jiǎn)單的邏輯規(guī)則, 你就完全有可能自己構(gòu)建出一個(gè)獨(dú)特的解決方案。將上面提到的所有的這些優(yōu)勢(shì)結(jié)合在一起,再加上容器的“到處運(yùn)行”的特性,我想以后可能會(huì)產(chǎn)生出許多令人稱贊產(chǎn)品。
原文鏈接:http://dockerone.com/article/195