如何組合多種DevOps工具來解決現實問題
譯文【51CTO.com快譯】在我們開始下面的討論之前,首先通過一張總圖來了解一下不同的工具,在DevOps生命周期中所處的位置。
DevOps生命周期階段
我敢斷言長期從事開發工作的您,一定對上述圖片并不陌生。那么,這是否意味著您能夠自如地使用各個階段的各種工具,而不會碰到任何問題呢?
本文將通過引導您遍歷DevOps生命周期中的各個階段,并向您介紹如何綜合使用多種DevOps工具,來解決各種現實問題。總的說來,我們在采用DevOps模式進行軟件與應用程序開發時,通常會經歷如下五個不同的階段:
- 持續開發
- 持續測試
- 持續集成
- 持續部署
- 持續監控
1.持續開發
此階段涉及到對于軟件應用程序基本功能的計劃與編碼。雖然對于計劃而言,并沒有什么可選的工具,但是可用于代碼維護的工具卻有不少。
通常情況下,項目的實現目標是在計劃階段被確定的。而當項目組成員開始著手編寫代碼時,就進入了所謂的編碼階段。
程序代碼可以用任何一種語言來編寫,但是我們需要配備相應的版本控制工具予以維護。如今,在此類持續開發的DevOps工具中,受用戶歡迎的莫過于:Git、SVN、Mercurial、CVS和JIRA了。
那么,您是否真正理解保留代碼主要版本的重要性呢?讓我們從如下兩個方面來討論它對于開發與運營的影響吧:
- 只有各種版本(特別是存儲在中央存儲庫中)得到了管控,我們才能確保統一的可信代碼來源。在此基礎上,所有的開發人員都可以針對最新提交的代碼開展協作。同時,在計劃發布最新版本時,運營人員可以確保訪問到一致的代碼。
- 在發布過程中,如果出現各種意外,或是發現程序代碼中存在著嚴重的缺陷,以及功能性故障,那么運營人員就能夠從容且快速地回滾或恢復到,先前部署過的、已處于穩定狀態的代碼版本上。
目前,大家普遍認可的工具是Git和GitHub(https://dzone.com/articles/git-vs-github-demystifying-the-differences)。其中,Git允許開發人員在分布式的VCS(版本控制系統)上開展彼此協作。
另外,由于并不依賴于中心服務器,因此運營人員可以從遠程位置,對存儲庫進行各種拉和推式的操作。此處用于維護代碼的中央存儲庫,便是GitHub。可見,Git可謂是世界領先的版本控制系統之一。
2.持續測試
眾所周知,開發好的代碼是不能夠直接部署或發布到生產系統上的。我們應當充分測試代碼的潛在錯誤和性能瓶頸。
通常,執行測試的方式有兩種:效率低下的手動測試和高效快捷的自動化測試。如今業界普遍使用的便是自動化的方式,其中具有代表性的包括:Selenium、TestNG、JUnit/NUnit等工具,它們可以自動執行各種用戶定義的測試用例。下面我們來看看此類工具的基本特點:
- 自動化測試節省了手動執行各類測試的大量時間、精力和成本。
- 此外,生成報告是它們的一大優勢。通過評估測試套件中有哪些測試用例失敗了,運營人員能夠更直觀地執行各項任務。
- 此類測試也可以安排在預先指定的時刻被執行。
顯然,我們應該在DevOps生命周期中不斷嘗試各種工具,形成持續測試階段的習慣。如果您要問哪一款是我的最愛?我會告訴你:我會將它們組合起來使用。例如:我會用Selenium進行自動化測試,由TestNG生成報告,進而使用Jenkins觸發持續集成。
3.持續集成
這個階段可謂DevOps最為出彩的部分。它在第一次發布過程中,就發揮了重要的作用。它能夠最大限度地促進持續集成工具與配置管理工具的聯合部署。
毫無疑問,如今市面上最受歡迎的持續集成工具便是Jenkins。當然,其他流行的CI工具還是Bamboo和Hudson。
持續集成工具的主要功效在于:它能夠通過協調其他DevOps生命周期階段的自動化工具,將整個DevOps結構完整地保持在一起。也就是說:無論是持續開發、測試或部署工具,還是持續監視工具,或是持續集成工具,都可以與CI工具全面集成。
- 在與Git/SVN集成后,Jenkins可以自動化地安排諸如:從共享存儲庫中提取代碼之類的作業,并使其為構建和測試做好準備(即持續開發)。Jenkins可以被設置為在某個預定的時刻,或是有提交被推送到中央存儲庫時,觸發構建作業。
- 與Selenium等測試工具集成后,我們可以實現持續測試。通常,我們可以使用Maven/Ant/Gradle之類的工具,來對已開發的代碼進行構建。此后,Selenium可以通過創建一組測試用例,以及逐個執行這些測試用例,來自動執行各種代碼。在整個過程中,Jenkins/Hudson/Bamboo的角色就是自動化計劃。
- 與持續部署工具集成后,Jenkins/Hudson/Bamboo可以通過配置管理,以及容器化工具來觸發部署計劃。
- 另外,Jenkins/Hudson可以與Splunk、ELK、Nagios或NewRelic等監控工具相集成,進而對那些已部署的服務器狀態和性能提供持續監控。
4.持續部署
在討論了從頭開始構建代碼的工具、以及測試類工具之后,我們現在來一起看看配置管理工具或容器化工具。這兩套工具都有助于在DevOps中實現持續部署(CD)。實際上,持續部署是軟件項目的實際落地階段。
目前,配置管理工具具有如下特點:
- 通常,配置管理需要在應用程序的功能需求和性能中,建立和維護一致性的行為。簡而言之,它是將部署發布到服務器上,調度所有服務器上的更新,以及保持所有服務器上一致性配置的行為。
- 業界常用的此類工具有:Puppet、Chef、Ansible、以及SaltStack,其中最好的當屬Puppet。這些工具都是基于主-從(master-slave)架構的。當有新的部署被發送到主服務器時,這臺主服務器負責在所有從服務器之間復制此類變更。
下面我們看看容器化工具:
作為一套工具集,容器化工具可以協助運營人員在開發、測試和部署應用程序的環境中,保持一致性。通過對那些在開發/測試/階段性環境中頻繁使用到的相同依賴項和程序包進行打包與復制,容器化工具大幅消除了生產環境中各種錯誤與故障的可能。
Docker是最早也是久負盛名的容器化工具之一。過去,由于開發人員使用到了各種虛擬機與服務器,因此他們必須通過手動管理,才能保持生產環境狀態的一致性。如今,有了Docker容器的協助,大家能夠輕松地實現一致性的自動化保持。
近年來,許多云端應用的解決方案,都開始為容器服務提供支持了。其中,Amazon ECS、Azure容器服務和Google容器引擎,都能夠對Docker容器提供原生的云服務支持。這也就是Docker能夠廣為普及的原因之一。當然,其他類型的容器化工具還有:Vagrant。
5.持續監控
如果我們不對應用程序的性能進行監視,那么開發和部署應用還有什么意義呢?就算是再全面的測試,也難免疏漏掉一些潛在的錯誤或性能問題,因此,持續監控與應用開發同等重要。
目前,屬于此階段的流行監控工具有:Splunk、ELK Stack、Nagios,Sensu、NewRelic。它們與Jenkins結合使用,可以讓運營人員達到持續監控的目的。總的說來,持續監控工具的必要性在于如下兩個方面:
- 由于程序的缺陷會給服務提供方造成財務上的損失,因此我們需要通過持續監控,來最大程度地減少功能性錯誤所出現的頻率和帶來的后果。
- 監控工具可以在用戶普遍碰到故障,并產生不良使用體驗之前,及時報告故障或服務水平的驟降。
Splunk和ELK堆棧是該領域的兩大工具,它們之間有著競爭關系。它們雖然能夠提供幾乎相近的功能,但是具體提供的方式卻不盡相同。
Splunk是一款非常容易上手的商業工具。而ELK堆棧則是由ElasticSearch、LogStash和Kibana三種開源工具組合而成。雖然可以免費使用,但是ELK設置起來卻不像Splunk那么容易。我建議您親自試用一下這兩款工具,以選擇更適合自己項目的一款。
原文標題:How To Combine DevOps Tools Together To Solve Our Problems,作者:Sahiti Kappagantula
【51CTO譯稿,合作站點轉載請注明原文譯者和出處為51CTO.com】