前言
作為程式設計師或開發運維人員,可能很少有沒在開發、部署、交付過程中遇到過問題的。特別是在企業環境、多人協同工作、模組紛繁複雜的情況下,要用簡單粗暴的方式(例如手動上傳程式碼,或是線上更改程式碼)往往會造成很嚴重的問題。因此對於企業級環境中開發部署來說,有一套嚴格完備的工作流機制會減少很多失誤和因此而導致的延期,增加交付應用的健壯性,從而提升交付效率。
現在有個很流行的名詞叫 DevOps,意為開發(Development)與運維(Operations)的組合簡寫,從字面上的意思解釋,就是讓開發團隊(Dev)和運維團隊(Ops)相互溝通、融合、協作,旨在促進開發和技術運營與品質保障之間的整合。甚至有些職位就設定為 DevOps 工程師,要求工程師既做開發,又做運維,這對人本身、技術以及流程要求都較高。
本文將簡單介紹 DevOps,以及 DevOps 工作流程包含的一些基礎架構元素。而本系列文章將從應用開源框架的角度,介紹如何實用開源軟體構建一個健壯、實用的企業級 DevOps 工作流。本系列文章主要集中在 DevOps 三大要素(下面我們會簡單介紹)中的技術這一塊講解。
本文或本系列文章適合對軟體開發及運維有一定基礎,並想要實踐 DevOps 工作流到工作中的技術人員。
DevOps概述DevOps 的概念由一個名叫 Patrick Debois 的 IT 諮詢師發明。他在負責測試工作的時候發現,他既需要跟隨開發團隊的敏捷節奏,還需要以傳統方式維護這些系統,並領會到這兩種工作環境的巨大差異。他看到2009年的 Velocity 大會上的一篇轟動世界的演講,該演講提出了以業務敏捷為中心、構造適應快速釋出軟體的工具(Tools)和文化(Culture)。Patrick 由此萌發了舉辦"社群版" Velocity 大會的想法,取名為 DevOpsDays,並號召了全球各地的人來參加。DevOps 這個概念由此誕生。
人們對 DevOps 這個概念的認識不盡相同:有認為 DevOps 是一種技術或平臺的,這種認識過於片面,忽視了人和流程的作用;另一種認為 DevOps 是一種流程,這種認識雖然比較合理,也相對片面;還有一種認為 DevOps 是Dev和Ops的組合的一種職位,這完善了 DevOps 的定義。下圖是 DevOps 的三大元素,可以看到 DevOps 是平臺(技術)、流程、人的融合出來的結果,少了一樣都會很片面。
本文或系列文章主要關注的是平臺或技術這一塊,講解如何用開源軟體打造企業級 DevOps 工作流。但要注意的是,DevOps 只考慮技術是不夠的,還需要考慮流程和人的因素。如果一個技術人員只知道如何配置 Jenkins 自動釋出應用,而不知道將該流程推廣到整個公司,不能形成一個文化的話,這樣的 DevOps 是失敗的。DevOps 要求有合適的工具,更需要全公司參與,打造成一個工作流程和文化。
下圖是 DevOps 涉及到的技術。
可以看到,DevOps 涉及的技術相當繁多,包括玲琅滿目的技術類別。我們不用掌握所有的技術,對不同的場景,我們用合適的工具就足夠。本系列文章將講解一些基礎功能,包括版本控制(VCS)、持續整合(CI)、容器化(Container)、編排(Orchestration)以及網路(Networking),以及如何用開源軟體實現上述功能。
版本控制(VCS)版本控制系統(Version Control System)是 DevOps 中重要的環節。這相可以看作是程式碼的資料庫,誰修改了什麼、誰刪除了什麼,都可以通過這個系統來管理。在中大型專案中,不用版本控制系統很可能會導致嚴重的問題。
下面是一個典型的場景。
線上服務被發現有 bug,需要立即修復;維護人員發現是因為一個變數名稱寫錯導致的;這名維護人員採用了最快速的線上修改程式碼的方式,將這個問題暫時解決了,大家似乎相安無事;一個月以後,這個問題又出現了,由於程式碼量和專案複雜度的增加,這個問題隱藏得很深,久久得不到解決,或者好不容易把這個問題解決了,其他問題又出現了。其實,如果一開始所有開發人員都用了版本控制系統 Git 或者 SVN 的話,並且要求所有程式碼更改都必須進入版本控制,就有很難出現上述這個問題了。
在後續文章中,我們將講解如何用開源軟體 GitLab 來實現版本控制。
持續整合(CI)
持續整合(Continuous Integration)也是非常重要的部分,因為這個將構建應用並打包上線的工作自動化了,減少了很多人工上線的成本。
可以想象,沒有持續整合,我們的部署流程會是什麼樣子:
開發人員開發好一個應用,編寫好部署文件;運維人員獲取原始碼,並按照部署文件來部署應用;中途運維人員發現,部署文件中缺少了一個安裝依賴的步驟,需要去找開發人員要這個步驟;開發人員測試了半天,將正確的部署文件發給運維人員;反反覆覆折騰,終於部署好了,但時間也浪費了好幾天。這是個典型的沒有持續整合的例子。如果採用 Jenkins 將釋出做成自動化的,就不需要部署文件了,開發人員可以直接看到部署是否成功,可以立即除錯和配置。
在後續文章中,我們將講解如何用開源軟體 Jenkins 來實現持續整合和自動部署。
容器化(Container)想象這樣一個開發場景,為了保證環境隔離,我們建立了開發、測試、生產三個環境,每個環境儘量保證一致,例如作業系統都為 Linux,資料庫版本一致,編譯器版本一致,等等。但可惜的是,我們不可能完全做到環境一致,特別是開發者自己的環境,與測試(Test)和生產環境(Production),不可能完全一致。大多數開發者還是用的 Windows 作業系統或 Mac OS 系統,但實際測試環境和生產環境大多數情況是 Linux 的,很多 Windows 或 MacOS 上可以的,到了伺服器上就不能運行了或者有 bug。這都是環境不一致導致的。
早期有解決方案是讓每個開發者裝一個虛擬機器(VM),在上面安裝虛擬的 Linux 環境,讓開發好的應用在上面除錯,通過後再測試部署到測試或者生產環境上。自動化的軟體也湧現出來,有著名的 Vagrant,可以通過編寫配置檔案一鍵生成虛擬環境。但是,安裝虛擬機器開銷比較大,需要預分配記憶體和磁碟空間,這對於資源並不充裕的伺服器來說不是個最優的解決方案。
2013年,Docker 開源專案橫空出世,實現了容器化功能。它與虛擬機器有本質區別,不要求預分配資源。Docker 的使用非常簡單,其中的 容器(Container)概念類似於程式語言中的例項(Instance),映象(Image)類似於類(Class),很易於管理,橫向擴充套件非常簡單。實質上,Docker 的配置跟編寫一個應用差不多,用 Dockerfile 可以讓構建一個五臟俱全的應用程式變得非常容易。如果把版本控制系統比喻為收藏設計圖紙的圖書館,持續整合比喻成工廠流水線,那麼容器則可看作是一個個功能樣式統一的產品。Docker 正在(或者已經)成為程式設計部署應用的首選。
在後續文章中,我們將講解如何利用大紅大紫的 Docker 來構建容器化部署。
編排(Orchestration)
隨著伺服器資源變得越來越廉價,分散式應用得到普及,像微服務這樣的架構在現在正在逐漸成為主流。而伴隨而來的痛點是如何有效的讓這些分散式應用或者叢集被更好的管理起來。編排(Orchestration)技術正是這樣的管理叢集的有效方法,保證分散式應用能得到很好的擴充套件。對於一些簡單的應用來說,單機或許已經足夠,但對於某些大型應用,例如搜尋引擎爬蟲、高併發伺服器、大資料應用,對資源要求較高,需要大規模的分散式叢集,而為了管理這些叢集,編排技術必不可少。
Kubernetes 是 Google 開源的容器編排引擎,後續文章將講解如何利用 Kubernetes 實現叢集的管理。
網路(Networking)網路是非常重要的技術。我們可以沒有 DevOps 這樣的流程和技術,但 99% 以上的可能是少不了網路技術的。而網路技術也種類繁多,涉及通訊、傳輸、配置等等,這裡我們只會講解其中一個類別,也就是反向代理。為什麼會講反向代理呢?我相信絕大多數人在開發 Web 應用的時候會碰到配置路由的情況,而反向代理正是解決網路路由問題的技術。另外,反向代理還可以實現負載均衡(Load Balance),合理利用分散式應用的計算、網路頻寬等資源。如果沒有反向代理,你會發現很多內部埠會暴露在外,既不安全,也不美觀。
在後續文章中,我們將講解如何使用 Nginx 實現反向代理,並會介紹如何將其整合到 DevOps 工作流中。
總結本文介紹了 DevOps 的基本概念,以及簡單介紹了一些 DevOps 工作流中的技術,包括版本控制、持續整合、容器、編排、網路,另外我們還介紹了即將在後續系列文章裡講解的開源軟體。但是 DevOps 的技術 RoadMap 絕對不僅僅侷限於此,從前面小節中的圖就可以看出來,要懂得所有技術絕對是 CTO 級別的大師級人物。而我們也應該了解 DevOps 也不僅限於技術和平臺,而應該將其與流程跟人結合起來,才可能很好地實踐 DevOps。
本文只是個開始,後面我們將更加細緻的講解各項技術以及實現用到的開源軟體,並且如何將他們應用到企業級 DevOps 工作流中來。請關注後續的文章,有更精彩的內容。
如果您覺得本文章對您有幫助,或有任何疑問或建議,請掃描下方二維碼或者加作者微信 tikazyq1 並註明"DevOps",作者將答疑解惑。
作者:MarvinZhang連結:https://juejin.im/post/5db2eee8e51d452a31582064