快速回顧 在第1部分中,我們討論了DevOps文化和所需的基礎。 在第2部分中,我們討論瞭如何為程式碼部署奠定基礎:配置。 在第3部分中,我們討論瞭如何保持部署程式碼的有序性:版本控制。 在這裡,我們將討論如何打包程式碼以便於部署和後續執行。 紅圈表示我們當前所處的位置: 註意,當你看到本系列的這篇文章,你能發現每一篇都有著承上啟下的作用,這很重要且有其原因。因為無論你是與你現在的,還是將來的老闆交談,你都必須能夠清楚地表達出DevOps是什麼以及它為何如何重要。你能透過一個連貫的故事來講述如何使用最佳實踐快速地有效地將程式碼從開發人員的手上部署到生產環境進而產生商業價值。 因此,我們不是為了學習一堆流行的但是卻毫無關聯的工具。我們是在學習一系列由業務驅動、由技術工具支援的技能。 好了,廢話不多說,我們開始吧! 虛擬化入門 還記得物理伺服器嗎?就是那些你需要等待數周才能獲得訂單審批,發貨,被資料中心接收,上架,網路除錯,安裝好系統並打好補丁的那些。 想象一下,如果想擁有住所,唯一的方法就是建造一座新的房子。需要居住的地方?那麼你只能等到房子建好之後。現實中每個人都有房子,但也不是真的擁有,因為建房子需要耗費很長的時間。在這個類比中,物理伺服器就像一座房子。 然後人們開始惱火於這些事耗費了他們太長時間,於是乎一些聰明的人就提出了虛擬化的想法:在一臺物理機器上執行一堆虛擬的“機器”,讓每臺機器都假裝自己是一臺真實的機器。很聰明的想法是吧! 所以,如果你真的想要一座房子,你可以自己建造並等待一段時間。或者,你也可以選擇住在公寓裡,與其他租戶共享資源。也許不是特別好但已足夠滿足需求,最重要的是,完全無需等待! 這種情況持續了一段時間,很多公司(例如VMWare)在這上面賺了很大一筆錢。 直到其他某些人認為,將一堆虛擬機器塞進物理機器中還不夠好,他們需要將更多行程更緊湊地打包到更少的資源中。 從這個需求點來說,房子跟公寓都太貴了。如果我只需要暫時租用一個房間呢?我可以隨時搬進搬出,是不是很神奇! 實際上,這就是Docker。 Docker的誕生 Docker很新,但它背後的思想已經有很長歷史。在2000年,FreeBSD這個作業系統就已經有了Jails的概念!的確,很多新的東西都是基於舊的思想來演進的。 那時與現在的想法都是想在同一作業系統中隔離單個行程,即所謂的“作業系統級虛擬化”。 註意:這與“完全虛擬化”不同,後者是在同一物理主機上並行執行虛擬機器。 這在實踐中意味著什麼? 在實踐中,這意味著Docker的流行正好巧妙地反映了微服務的興起,微服務是一種軟體工程方法,將軟體分解為許多單獨的元件。 而這些元件需要一個“家”。單獨部署獨立的Java應用程式或二進位制可執行檔案是一件很痛苦的事:你管理Java、C++與Golang應用程式的方式都各不相同。 相反,Docker提供一個簡單管理介面,允許軟體工程師以一致的方式打包,部署和執行各種應用程式。 這是一個巨大的利好訊息!下麵我們將談談Docker的好處。 Docker的好處 行程隔離 Docker允許每個服務都具有完全的行程隔離。服務A跟B都單獨存在於自己的一個具備所有依賴關係的小容器中,兩者之間不再存在衝突! 此外,如果一個容器崩潰,只有該容器受到影響。其餘的容器(應該)還能繼續執行。 這同時有利於安全。如果容器被洩露,那麼透過該容器並破解宿主作業系統是非常困難的(但並非不可能)。 最後,如果容器行為不當(如消耗太多CPU或記憶體),則可以僅將影響範圍限制到該容器,而不會影響系統的其餘部分。 部署 回顧下在實踐中如何構建各種應用程式。 如果它是一個Python應用程式,它將有一大堆各種Python依賴包。一些將作為pip模組安裝,還有一些是rpm或deb軟體包,其他的則是透過簡單的git clone安裝。如果使用virtualenv,它將是virtualenv目錄中所有依賴項的一個zip檔案。 另一方面,如果它是一個Java應用程式,它會使用gradle構建,將其所有依賴拉取並放到適當的目錄上。 你明白了吧。這些使用不同語言和不同執行時構建的應用程式,當將它們部署到生產環境時將是一項挑戰。 那麼我們怎樣才能滿足所有的依賴關係呢? 另外,如果存在衝突,問題將會更嚴重。如果服務A依賴於v1版本的庫但服務B依賴於v2版本的庫怎麼辦?因為存在衝突,v1和v2都不能在同一臺機器上共存。 再次回到Docker。 Docker不僅允許完全行程隔離,還允許完全依賴隔離。在同一作業系統上併排執行多個容器是完全可能且常見的,每個容器都有自己的和衝突的庫和包。 執行時管理 我們管理不同應用程式的方式因應用程式而異。Java的日誌不同,啟動方式不同,監控方式與Python不同。Python與Golang等其他的也不相同。 透過使用Docker,我們獲得了一個統一的管理介面,允許我們啟動,監控,集中日誌,停止和重啟許多不同型別的應用程式。 這是一個巨大的勝利,它極大地減少了執行生產系統的操作開銷。 深入Lambda 雖然Docker很棒,但它也有缺點。 首先,執行Docker仍是在執行伺服器。伺服器很脆弱。必須對它們進行管理,修補和其他方面的保護。 其次,沒有人真的只用Docker來執行Docker(有點繞)。相反,它幾乎總是作為一些複雜的容器編排架構的一部分進行部署,例如Kubernetes,ECS,docker-swarm或Nomad。這些是相當複雜的平臺,需要專職人員來運維(後面將詳細介紹這些解決方案)。 但是,如果我是開發人員,我只想編寫程式碼並讓別人替我執行。Docker,Kubernetes和所有諸如此類都不是簡單易學的東西。我真的需要學習這些嗎?! 簡而言之,這要看情況而定! 對於那些只想讓他人去執行程式碼的人來說,AWS Lambda(以及其他類似的解決方案)就是解決方案: AWS Lambda允許你在不配置或管理伺服器的情況下執行程式碼。你只需為你消耗的計算時間付費,當程式碼未執行時不收取任何費用。 如果你聽說過“無伺服器”,那麼它就是了!你不再需要執行伺服器或管理容器。你只需編寫程式碼,將其打包成zip檔案,上傳到AWS,接下來那些頭痛的東西讓別人替你解決! 而且,由於Lambda是短暫執行的,所以幾乎無從破解。從設計上來講,Lambda非常安全。 很好,但需要註意以下幾項: 首先,Lambda最多隻能執行15分鐘(截至2018年11月)。這意味著長時間執行的行程(如Kafka消費者或資料處理程式)無法在Lambda中執行。 其次,Lambda是功能即服務,這意味著你的應用程式必須完全分解為微服務,並與其他複雜的PaaS服務(如AWS Step Functions)結合使用。不是所有企業都處於這種微服務架構的水平。 第三,在Lambda上排障很困難。因為它們是雲原生執行的,所有錯誤修複都發生在AWS的生態系統中。這通常具有挑戰性,而且很不直觀。 簡而言之,世上沒有免費的午餐。 註意:現在也出現了“無伺服器”雲容器解決方案。AWS Fargate就是其中之一。不過我們可以暫時忽略它們,因為這些往往比較昂貴並且需謹慎使用。 總結 Docker和Lambda是兩種最流行的現代雲原生方法,用於打包,執行和管理生產應用程式。 它們通常是互補的,每種都適用於略有不同的用例和應用。 無論如何,一個現代化的DevOps工程師必須精通兩者。因此,學習Docker和Lambda是很好的短期和中期標的。 註意:到目前為止,在我們的系列中,我們已經處理了初級到中級DevOps工程師應該知道的主題。在後續章節中,我們將開始討論更適閤中級到高階DevOps工程師的技術。但是請記住,通向成功的道路沒有捷徑可尋,必須靠不斷的實踐! 原文連結:https://medium.com/@devfire/how-to-become-a-devops-engineer-in-six-months-or-less-part-4-package-47677ca2f058 已傳送到看一看 你的朋友會在“發現-看一看”看到你點選“在看”的內容 取消 傳送 我知道了 已取消,想法已同步刪除 知道了 已傳送到看一看寫下你的想法 最多200字,當前共字 傳送 已傳送 朋友將在看一看看到 確定 寫下你的想法… 取消 傳送想法到看一看 確定 </div> <p><span class=”like_comment_msg” id=”js_b_like_comment_msg” style=”visibility: hidden;”>最多200字,當前共<span id=”js_b_like_current_cnt”/>字</span> </div> </div> <div class=”like_comment_primary_mask” id=”js_mask_2″/> </div> <div id=”js_loading” style=” display: none;”> <div class=”weui-mask_transparent”/> <div class=”weui-toast”> <i class=”weui-loading weui-icon_toast”/></p> <p class=”weui-toast__content”>傳送中</p> </div> </div> <div id=”js_fail” style=”display:none”> <div class=”weui-mask”/> <div class=”weui-dialog”> <div class=”weui-dialog__bd”> 網路異常,請稍後重試 </div> <div class=”weui-dialog__ft”> <a class=”weui-dialog__btn weui-dialog__btn_primary” href=”javascript:;” id=”js_fail_inform”>知道了</a> </div> </div> </div> <div class=”weui-desktop-popover weui-desktop-popover_pos-up-center weui-desktop-popover_img-text” id=”js_pc_weapp_code” style=”display: none;”> <div class=”weui-desktop-popover__content”> <div class=”weui-desktop-popover__desc”> <img id=”js_pc_weapp_code_img”/><br /> 微信掃一掃<br/>使用小程式<span id=”js_pc_weapp_code_des”/> </div> </div> </div> <div id=”js_minipro_dialog” style=”display:none;”> <div class=”weui-mask”/> <div class=”weui-dialog”> <div class=”weui-dialog__bd”>即將開啟”<span id=”js_minipro_dialog_name”/>”小程式</div> <div class=”weui-dialog__ft”> <a class=”weui-dialog__btn weui-dialog__btn_default” href=”javascript:void(0);” id=”js_minipro_dialog_cancel”>取消</a><br /> <a class=”weui-dialog__btn weui-dialog__btn_primary” href=”javascript:void(0);” id=”js_minipro_dialog_ok”>開啟</a> </div> </div> </div> </div>