在Amazon EC2容器服務(wù)中運行Docker可以達到更好的云移植性并降低成本。這里將解釋如何做到這一點。
云計算開發(fā)者常常要同配置問題作斗爭。各種服務(wù)在實驗室環(huán)境里都是好的,但在生產(chǎn)環(huán)境中卻無法以預(yù)期的方式運行。亞馬遜EC2容器服務(wù)提供了托管、可管理和完全可編程的API來從EC2內(nèi)部直接運行Docker 容器。開發(fā)者只需要選擇Docker fleet中所需的服務(wù)器大小和數(shù)目,然后Amazon就會將這些容器放入實例中。
亞馬遜Web服務(wù)(AWS)的彈性計算云(EC2)允許用戶根據(jù)配置來運行虛擬機,以編程方式或者自動方式皆可。EC2用戶要先定義虛擬機將要存在的實例類型,區(qū)域和可用區(qū)(AZ)。EC2的實例數(shù)是可以擴展的,但EC2的真正強大之處體現(xiàn)在當(dāng)你加上擴散功能的時候,它可以將服務(wù)分割到多個位于不同AZ和區(qū)域的服務(wù)器中。
但EC2的計費方式使得它在少數(shù)幾個大型的實例中運行是比較經(jīng)濟的。那些想要完全隔離特定的服務(wù),讓這些服務(wù)彼此之間不會互相影響的企業(yè)們,便轉(zhuǎn)向使用Docker。
Docker是為了微服務(wù)和云移植性設(shè)計的。
微服務(wù)可以預(yù)防那些由服務(wù)互相影響所產(chǎn)生的問題。比如說,如果你的PDF歸檔進程失去控制并占用了大量的CPU,你就不會想要它也順便消滅你的搜尋索引器。傳統(tǒng)的解決方法是在獨立的EC2實例上運行這兩個服務(wù),但是,兩個m3.large實例可是比一個m3.large實例貴。Amazon鼓勵你使用更大的實例而不是更多的實例。
但Docker不是專屬于AWS或云的,IT團隊可以在任何東西上運行Docker,從公有云到裸機都行。這個軟件是以抽象層的方式建立在虛擬機之上的,并不會移除另一個完整虛擬層的開銷。這代表了那些想用其他公有云供應(yīng)商來試驗的企業(yè)不需要重寫任何代碼。如果你的基礎(chǔ)功能是隨著時間在Amazon 機械實例(AMI)上慢慢累積起來的話,你不但要為了新的安全補丁修改代碼來更新AMI,你還必須要為了例如Google計算引擎之類的新云供應(yīng)商重建整個系統(tǒng)。
以下是當(dāng)你要建立及運行Amazon EC2容器服務(wù)時要遵守的幾個步驟。
Amazon ECS入門
EC2容器服務(wù)里有個控制臺,里面包含了所有你需要的工具,幫助你設(shè)立Docker和AWS。第一步是先建立一個集群并將實例加入你的Docker池子里。這些實例可以被加入一個Auto Scaling組(ASG)里,這樣可以確??偸谴嬖诮】档膶嵗?,從而確保Docker系統(tǒng)背后有足夠的額外能力來運行你的容器。
一開始,首先進入Amazon ECS 控制臺并建立一個集群,也就是Docker實例的最高級別上的分組。你可以使用分離的集群讓測試和開發(fā)環(huán)境相互獨立開來,在同一個AWS帳號里。
當(dāng)你創(chuàng)建好一個集群之后,啟動其中的一個實例。我推薦使用Auto Scaling Group,即便你只想在這個集群里運行固定數(shù)量的實例。設(shè)置一個Auto Scaling Group能提供一個防護措施,如果某個服務(wù)器宕機,將會被自動替換掉。
在控制臺中,創(chuàng)建一個新的啟動配置,然后在AWS Marketplace中選擇最新的ECS優(yōu)化實例。
點擊繼續(xù)然后選擇一個要啟動的實例類型。我建議使用一個C4或M3的實例類型,大的或者更高。不要選擇T2或T1的實例類型,這些針對突增容量設(shè)計的,對于長期運行的進程可能會有些問題。
填完剩余的信息然后依照出現(xiàn)的提示設(shè)定好ASG。你也許想將你的ASG設(shè)定成在虛擬私有云(VPC)中運行,但要確保設(shè)置成運行在至少兩個不同可用區(qū)中的兩個不同的子網(wǎng)里。
當(dāng)你的ASG建立好這個群集的EC2實例后,就會看到他們出現(xiàn)在你的ECS控制臺中(圖1)。
創(chuàng)建任務(wù)定義
任務(wù)是一個或多個Docker容一起為了一個服務(wù)或微服務(wù)而運行。任務(wù)可以用于類似Redis服務(wù)器這樣的簡單工作負(fù)載或復(fù)雜工作負(fù)載如整個 Wordpress棧,連著用于數(shù)據(jù)庫,memcached和一個Web服務(wù)器的容器。將容器連接起來有助于他們能夠一起緊密的協(xié)作。
當(dāng)為你的任務(wù)定義配置一個容器時,你必須定義一個容器名、鏡像、CPU、內(nèi)存,可選的端口映射,可選的環(huán)境變量,一個可選的覆蓋命令和連接等。你必須指定你想要為每個容器預(yù)留多少的內(nèi)存(以MB為單位),以及預(yù)留多少個CPU單元(每個2.8GHz的處理器總共有大約1024個CPU單元)。這樣能確保服務(wù)器不會因為有太多容器而過載,防止某個容器使用太多的資源而使得其他容器變慢。集群的首頁會顯示可用的CPU單元和內(nèi)存。如果任何一個可用資源顯示不足的話,請先在你的集群里啟動額外的服務(wù)器再啟動更多的容器。
創(chuàng)建服務(wù)
一旦你創(chuàng)建了任務(wù)定義,接下來是創(chuàng)建服務(wù),也就是ECS版本的一個簡化的Auto Scaling Group。這確保了一定數(shù)量的任務(wù)實例運行,并且允許開發(fā)者將他們綁定到一個彈性負(fù)載均衡器中。為服務(wù)設(shè)定角色有助于分類;獨立的Docker容器有他們自己的身份和訪問管理角色。這給與EC2幾乎和一個獨立的Docker容器一樣的能力。
你也許想從私有的Docker Registry開始,可以創(chuàng)建Docker鏡像的私有庫來抓取鏡像到系統(tǒng)中。私有Docker庫會顯示為一個可配置的Docker容器支持將鏡像庫存儲到簡單存儲服務(wù)中。
圖2是我使用的一個任務(wù)定義的例子,用來托管我自己的Docker Registry。
圖3顯示了相關(guān)的服務(wù)。
我的Docker集線器的內(nèi)部負(fù)載均衡器代理端口從80到5000。因為只在我的VPC里允許,我不需要任何自定義的認(rèn)證或者SSL的支持。我可以設(shè)置從Docker庫里抓取鏡像,并且我有一個特殊的Docker實例用來構(gòu)建和推送鏡像到Docker庫。
運行藍綠更新
與彈性Beanstalk相似,Amazon EC2 容器服務(wù)通過運行額外任務(wù)來處理更新,通過負(fù)載均衡器切換并在新容器就緒后終止舊的容器。這典型的消除了宕機時間,這樣IT團隊可以在正常的業(yè)務(wù)時間內(nèi)推出更新而不會影響客戶。
要進行一個藍綠部署,創(chuàng)建一個新版本的任務(wù),可能指向一個鏡象的新版本,然后更新服務(wù)來使用該版本。在ECS中,所有的任務(wù)版本都會保存,這樣你可以輕松的回復(fù)到一個舊的版本如果部署出現(xiàn)任何問題的話。
Docker容器:ECS對比Beanstalk
在亞馬遜實例上運行Docker不是一個新的概念。如果你需要一個基于Web的應(yīng)用來定期使用新的部署,Beanstalk加Docker是最好的選擇。但這對于在一個應(yīng)用后臺運行幾個微服務(wù)來說不一定是理想的。如果你有一個Web應(yīng)用會驅(qū)動其他的后臺系統(tǒng),比如視頻轉(zhuǎn)錄提取,自動圖像人臉檢測或游戲分析,你也許需要同時使用ECS和彈性Beanstalk加Docker。
最好是指導(dǎo)ECS上的微服務(wù)從SQS隊列中讀取,然后擴展服務(wù)橫跨你的整個fleet來運行這些服務(wù)的多個拷貝。舉個例子,我的一個fleet擁有4個 m3.xlarge實例運行10個PDF提取工具的拷貝,2個全文索引系統(tǒng)的拷貝,4份交付系統(tǒng)和一些雜項任務(wù),如更新我們的Geckoboard儀表盤和同步數(shù)據(jù)到RDS以便在Tableau中進行分析。
要增加更多的PDF提取進程,我可以進到那個服務(wù)然后增加運行任務(wù)的數(shù)目。如果我需要更多的空間,我可以瞬間提高服務(wù)器的大小或者增加我的任務(wù)池大小。如果我是在Beanstalk上這么做的話,我至少需要10個不同的實例來運行10個我的PDF提取工具拷貝。用ECS我可以利用與運行幾個小實例相比更低的成本來運行更大的實例。
如果你正在AWS上使用Docker的話,那么ECS是最合理的選擇。讓Amazon完成主要的工作,你只需輕松的使用熟悉的元素如彈性負(fù)載均衡,自動擴展及固定容器實例數(shù)目的類似服務(wù)來管理這些實例即可。