一、什麼是devops
在DevOps之前,從業人員使用瀑布模型或敏捷開發模型進行軟體專案開發:瀑布模型或順序模型是軟體開發生命週期(SDLC)中的一種開創性方法,在這個模型中,軟體開發成為一個線性過程,不同的階段和任務被依次定位;而敏捷開發涉及各種方法的使用和SDLC中多個團隊的協作。瀑布模型的線性和敏捷開發的跨功能性無法確保快速、連續地交付無缺陷的軟體應用程式。
軟體行業日益清晰地認識到:為了按時交付軟體產品和服務,開發和運維工作必須緊密合作。這樣的情況下,DevOps應運而生。
DevOps是一個簡單的縮寫詞,源於“development(開發)”和“Operation(運維)”兩個詞,它涉及以特定的方式實踐應用程式開發的任務。更廣泛地說,軟體開發和IT運維的結合被稱為DevOps。
在組織內部負責管理重要 IT 部門的典型 IT 組織通常看起來是這樣的:
主要由於歷史的原因(大部分運維人員來自硬體和電信業務領域),運維人員和開發者分屬不同的組織結構分支。開發者屬於研發部門,而運維人員大部分時候屬於基礎架構部門(或專門的運維部門)。
看了這些,終於知道運維人員到底有多重要了吧!
二、真的很難共存嗎?
DevOps 的共存主要是為了擴充套件敏捷開發實踐,進一步完善軟體變更在構建、驗證、部署、交付等階段中的流動,同時通過軟體應用程式的全面所有權予力跨職能團隊完成從設計到生產支援等各環節的工作。
DevOps 鼓勵軟體開發者和 IT 運維人員之間所進行的溝通、協作、整合和自動化,藉此有助於改善雙方在交付軟體過程中的速度和質量。
DevOps 團隊更側重於通過標準化開發環境和自動化交付流程改善交付工作的可預測性、效率、安全性,以及可維護性。理想情況下,DevOps 可以為開發者提供更可控的生產環境,幫助他們更好地理解生產基礎架構。
三、devops 工具鏈
DevOps 實際是一種文化上的變遷,代表了開發、運維、測試等環節之間的協作,因此 DevOps 工具是非常多種多樣的,甚至可以由多種工具組成一個完整的 DevOps 工具鏈。此類工具可以應用於一種或多種類別,並可體現出軟體開發和交付過程的不同階段:
- 編碼:程式碼開發和審閱,版本控制工具、程式碼合併工具
- 構建:持續整合工具、構建狀態統計工具
- 測試:通過測試和結果確定績效的工具
- 打包:成品倉庫、應用程式部署前暫存
- 釋出:變更管理、釋出審批、釋出自動化
- 配置:基礎架構配置和部署,基礎架構即程式碼工具
- 監視:應用程式效能監視、終端使用者體驗
雖然可用工具有很多,但其中一些環節是組織內部應用 DevOps 工具鏈不可或缺的。
說了這麼多,離了工具怎麼行。這裡羅列出來,以便大家參考使用。
版本控制&協作開發:GitHub、GitLab、BitBucket、SubVersion、Coding、Bazaar,git
自動化構建和測試:Apache Ant、Maven 、Selenium、PyUnit、QUnit、JMeter、Gradle、PHPUnit,Gradle。
持續整合&交付:Jenkins、Capistrano、BuildBot、Fabric、Tinderbox、Travis CI、flow.ci Continuum、LuntBuild、CruiseControl、Integrity、Gump,
容器平臺: k8s,k9s,k3s,k10086s(這個是自己瞎寫的),Mesosphere,
監控,警告&分析:Nagios、Ganglia、Sensu、zabbix、ICINGA、Graphite、Kibana,prometheus,New Relic,Splunk,Elasticsearch,finderWeb
下面介紹幾款常用的工具:
1. maven
Maven專案物件模型(POM),可以通過一小段描述資訊來管理專案的構建,報告和文件的專案管理工具軟體。
Maven 除了以程式構建能力為特色之外,還提供高階專案管理工具。由於 Maven 的預設構建規則有較高的可重用性,所以常常用兩三行 Maven 構建指令碼就可以構建簡單的專案。由於 Maven 的面向專案的方法,許多 Apache Jakarta 專案發文時使用 Maven,而且公司專案採用 Maven 的比例在持續增長。
2. Ansible
我們知道現在自動化工具中,最簡單、易於上手,而且最流行的當屬Ansible莫屬了。和Chef、Puppet等Ruby工具甚至同時Python系的Saltstack等CS架構的自動化工具相比雖然執行效能上可能會稍一點,但是無需客戶端,只需SSH就可以管理優勢還是相當明顯的。伺服器上架後無需額外操作就可以直接進行操作,比如伺服器的初始化標準配置等。
Ansible是一個開源配置管理工具,可以使用它來自動化任務,部署應用程式實現IT基礎架構。Ansible可以用來自動化日常任務,比如,伺服器的初始化配置、安全基線配置、更新和打補丁系統,安裝軟體包等。Ansible架構相對比較簡單,僅需通過SSH連線客戶機執行任務即可:
Ansible的與節點有關的重要術語包括控制節點,受管節點,清單和主機檔案:
- 控制節點(Control node):指安裝了Ansible的主機,也叫Ansible伺服器端,管理機。 Ansible控制節點主要用於釋出執行任務,執行控制命令。Ansible的程式都安裝在控制節點上,控制節點需要安裝Python和Ansible所需的各種依賴庫。注意:目前Ansible還不能安裝在Windows下。
- 受控節點(Managed nodes):也叫客戶機,就是想用Ansible執行任務的客戶伺服器。
- 清單(Inventory):受控節點的列表,就是所有要管理的主機列表。
- host檔案:清單列表通常儲存在一個名為host檔案中。在host檔案中,可以使用IP地址或者主機名來表示具體的管理主機和認證資訊,並可以根據主機的使用者進行分組。預設檔案:/etc/ansible/hosts,可以通過-i指定自定義的host檔案。
- 模組(Modules):模組是Ansible執行特定任務的程式碼塊。比如:新增使用者,上傳檔案和對客戶機執行ping操作等。Ansible現在預設自帶450多個模組,,Ansible Galaxy公共儲存庫則包含大約1600個模組。
- 任務(Task):是Ansible客戶機上執行的操作。可以使用ad-hoc單行命令執行一個任務。
- 劇本(Playbook):是利用YAML標記語言編寫的可重複執行的任務的列表,playbook實現任務的更便捷的讀寫和貢獻。比如,在Github上有大量的Ansible playbooks共享,你要你有一雙善於發現的眼睛你就能找到大量的寶藏。
- 角色(roles):角色是Ansible 1.2版本引入的新特性,用於層次性、結構化地組織playbook。roles能夠根據層次型結構自動裝載變數檔案、tasks以及handlers等。
3. jenkins
Jenkins是一個開源的、提供友好操作介面的持續整合(CI)工具,起源於Hudson(Hudson是商用的),主要用於持續、自動的構建/測試軟體專案、監控外部任務的執行(這個比較抽象,暫且寫上,不做解釋)。Jenkins用Java語言編寫,可在Tomcat等流行的servlet容器中執行,也可獨立執行。通常與版本管理工具(SCM)、構建工具結合使用。常用的版本控制工具有SVN、GIT,構建工具有Maven、Ant、Gradle。
4. Docker
Docker 是一種容器技術,可讓您在特殊環境中隔離應用程式。容器化與虛擬化類似,不同之處在於容器不會啟動完整的作業系統。
使用 Docker 容器,您可以在這些自定義環境中開發和部署應用程式,從而不必擔心相容性問題。您的應用程式可以在任何位置執行,只要它們位於容器中即可。
要啟動 Docker 容器,您必須通過 Dockerfiles 建立 Docker 映像。從 Docker 映像啟動時,Dockerfile 包含 Docker 容器中所需的規範。您不必總是構建自己的 Docker 映像,因為 Docker Hub 上可以使用官方映像。
Docker 本身可以在 Linux 上執行,並且在 macOS 上也可以正常執行,因為它類似於 Unix。對於 Windows 使用者,也可以通過Docker 工具箱來使用 Docker。
5. Kubernetes
Kubernetes (K8s) 是一個谷歌開源工具,它可以讓你管理 Docker 容器。由於在生產中經常有大量的容器在執行,因此,Kubernetes 使編排這些容器成為可能。
首先要了解編排 Docker 容器的原因。當有許多容器在執行時,很難手動監視這些容器,並使它們彼此通訊;另外,這種擴充套件以及負載平衡也變得困難。
使用 Kubernetes,可以控制所有這些容器,因此可以將這組機器作為一臺機器進行管理。與 Docker Compose 相比,Kubernetes 是不同的,因為它使部署,擴充套件和監視容器變得更加容易。當它們中的任何一個崩潰時,它們都可以自愈,而 Kubernetes 可以製造新的來代替。使用 K8s,可以輕鬆地進行儲存編排、服務發現和負載平衡。
您可以在 macOS,Linux 和 Windows 上安裝 Kubernetes,並通過Kubernetes 命令列工具使用它。
四、企業級開發
企業中,整合開發流程非常重要,使用devops能夠有效提高團隊的協作效率,節省團隊中各個角色的時間,多留些時間給親友們,豈不快哉!
下面是一個devops企業級開發的全景圖。