什麼是 DevOps?

在傳統的軟體開發模式中,開發人員為新功能、產品、錯誤修正等撰寫大量程式碼,然後將工作交給作業團隊進行部署,通常是透過自動化的票務系統進行。作業團隊會在其佇列中收到此請求,測試程式碼,並讓其準備好投入生產 - 此流程可能需要數天、數週或數月的時間。在這種傳統模式下,如果作業在部署過程中遇到任何問題,團隊就會將票據傳回給開發人員,告訴他們該如何修正。最後,當這些來來回回的問題解決之後, 工作負載 就會被推進生產。

這種模式使得軟體交付成為一個冗長且分散的過程。開發人員經常將作業團隊視為路障,拖慢他們的專案時程,而作業團隊則覺得自己像是開發問題的傾銷場。

DevOps 透過在整個軟體交付流程中聯合開發團隊與作業團隊來解決這些問題,使他們能夠提早發現並修復問題、自動化測試與部署,並縮短上市時間。

為了更好地理解什麼是 DevOps,讓我們先了解什麼不是 DevOps。

 

DevOps 不是

  • 結合了 Dev 和 Ops 團隊:仍然有兩個團隊,只是以溝通、合作的方式運作。
  • 它有自己獨立的團隊:根本就沒有什麼「DevOps 工程師」。雖然有些公司在嘗試過渡到 DevOps 文化時,可能會指定一個 DevOps 團隊作為試點,但 DevOps 是指開發人員、測試人員和作業人員在整個軟體交付生命週期中通力合作的文化。
  • 一種工具或一套工具:雖然有些工具可以很好地配合 DevOps 模式,或有助於推廣 DevOps 文化,但 DevOps 始終是一種策略,而非工具。
  • 自動化:雖然自動化對 DevOps 文化非常重要,但它本身並不能定義 DevOps。

 

DevOps 定義

在 DevOps 模式中,開發人員不會先編寫龐大的功能集,再盲目交給作業系統進行部署,而是會經常交付少量程式碼以進行持續測試。開發和營運團隊不再透過票務系統溝通問題和請求,而是定期開會、分享分析結果,並共同擁有端到端的專案。

 

CI/CD 管道

DevOps 是持續整合與持續交付(或持續部署)的循環,又稱為 CI/CD 管道。CI/CD 管道可整合開發與作業團隊,藉由基礎架構與工作流程自動化,以及不斷地可測量應用程式效能,提高生產力。看起來是這樣的:

CI/CD 管道的階段和 DevOps 工作流程
圖 1:CI/CD 管道的階段和 DevOps 工作流程
  • 持續性整合 需要開發人員每天多次將程式碼整合至程式碼儲存庫,以進行自動測試。每次檢查都會經由自動建置驗證,讓團隊能及早發現問題。
  • 持續交付(Continuous Delivery)與持續部署(Continuous Deployment)不能混淆,持續交付是指 CI 管道自動化,但代碼在生產中實作之前必須經過手動技術檢查。
  • 持續部署 讓持續交付更進一步。代之以手動檢查,代碼通過自動測試並自動部署,讓客戶即時使用新功能。

 

DevOps 與安全性

DevOps 的一個問題是,安全性經常會被忽略。開發人員動作迅速,工作流程自動化。安全性是一個獨立的團隊,開發人員不希望因為安全性檢查和請求而減慢速度。因此,許多開發人員在部署時沒有經過適當的安全管道,難免會犯下有害的安全錯誤。

 

為了解決這個問題,組織正在採用 DevSecOps。DevSecOps 採用 DevOps 背後的概念,即開發人員與 IT 團隊應在整個軟體交付過程中密切合作,而非各自為政,並將其延伸至安全性,並將自動檢查整合至完整的 CI/CD 管道中。這就解決了安全性看起來像是外來力量的問題,並讓開發人員在不影響資料安全性的情況下維持速度。

 

DevOps 常見問答集

基礎結構即程式碼 (IaC) 涉及透過機器可讀的定義檔來管理和佈建 IT 基礎結構。Terraform 和 AWS CloudFormation 等 IaC 平台可實現基礎結構設定的自動化,從而實現一致且可重複的部署。透過將基礎結構視為軟體,組織可以將版本控制、測試和持續整合實務應用到基礎結構變更上,進而提升敏捷度和可靠性。
持續整合 (CI) 是一種開發實務,開發人員會不斷地將程式碼變更合併到中央儲存庫,以觸發自動建置和測試。CI 可以儘快偵測出整合錯誤,提升軟體品質,並縮短提供新更新軟體的時間。它是應用程式不斷地交付到生產環境的基礎。
持續交付 (CD) 延伸了持續整合,在建立階段後自動將所有程式碼變更部署到測試或生產環境。CD 可讓開發人員確保他們的程式碼始終處於可部署狀態,有助於更順暢、更快速地交付給終端使用者。它縮小開發和作業之間的差距,促進更敏捷、反應更迅速的軟體生命週期。
不斷地部署是指將已驗證的變更自動釋放到生產中,而不需要手動介入。它比持續交付更進一步,在持續交付中,每項變更只要通過生產管道的所有階段,都會釋放給客戶。這種做法加速了回饋循環,並提高了發佈流程的效率和可靠性。
自動化的運作方式是執行預先定義的指令來管理任務,而不需要人為介入。在雲端安全方面,自動化工具可部署政策、掃描弱點並對威脅作出回應,簡化安全作業。他們與雲端 API 互動,運用腳本和工作流程來佈建資源、執行合規性,並有效率地協調複雜的流程。
組態管理是指將系統保持在所需的一致狀態。它會追蹤軟體和硬體的變更和組態,以防止漂移和未經授權的變更。Ansible、Puppet 和 Chef 等工具可將整個 IT 環境中的組態變更自動化,確保系統配置正確一致。
Orchestration 可將跨多個系統和服務的複雜任務和工作流程自動化管理。它將自動化任務協調為一個連貫的流程,管理相互依賴的關係,並為行動排序。在雲端環境中,Kubernetes 等編排工具可管理容器化應用程式,處理部署、大規模擴充和網路,以最佳化資源利用率並維持應用程式效能。
微服務是 一種設計方法,應用程式由小型、獨立的服務組成,這些服務透過定義良好的 API 進行通訊。每項服務都專注於單一的業務能力,執行自己的流程,並可獨立部署。此架構可增強擴充性、加快開發週期,並改善故障隔離。
監控和記錄對於維持雲端環境的運作效能和安全性至關重要。監控提供基礎架構、應用程式和服務的即時可見性,可主動管理系統狀態和效能。日誌記錄事件和資料點,對於故障排除、鑑識分析和合規性稽核非常重要。兩者結合可快速偵測及回應事件,確保持續可用性及安全性。
版本控制系統追蹤並管理程式碼、文件或其他資訊集合的變更。它們有助於開發團隊之間的協作、維護變更歷史,並在需要時還原到先前的版本。版本控制是管理程式碼庫、減少衝突、確保部署一致且可追蹤的基礎。
常見的部署策略包括藍綠部署(blue-green deployment),即兩個相同的環境並行運行,其中一個作為實時環境,而另一個託管新版本。Canary 版本在廣泛部署之前,會先向一小部分使用者逐步推出變更。滾動更新會逐漸以新版本取代舊版本,減少停機時間和風險。
容器化將 應用程式及其相依性封裝到容器中,可在任何運算環境中執行。此方法提供虛擬機器的輕量級替代方案,在開發、測試和生產環境中提供效率和一致性。容器化簡化了應用程式的部署、大規模擴充與管理,將應用程式與底層基礎架構隔離。
Docker 用於透過容器來建立、部署和執行應用程式。它讓開發人員可以將應用程式及其所有相依性套件打包成標準的單元。Docker 提供管理容器生命週期的工具與平台,包括建立映像、容器大規模、擴充與網路。
Kubernetes 可協調容器化應用程式,管理其部署、大規模擴充及作業。它可確保應用程式的預期狀態與雲端環境中的實際狀態相符。Kubernetes 可自動進行負載平衡、監控應用程式的健康狀況,並透過重新啟動或取代故障或無回應的容器,提供自我修復功能。它還能處理服務發現,並能以機密方式管理組態和敏感資訊。
建置管道由一系列編譯程式碼、執行測試和部署軟體的自動化程序所組成。它從版本控制中擷取程式碼開始,接著是建立可執行程式、執行自動測試,以及部署到各種環境。管道的設計可在每個階段提供回饋,確保程式碼品質,並簡化從開發到生產的路徑。
測試自動化可加速軟體功能、安全性和效能的驗證。它無需人工即可進行重複和廣泛的測試,提高一致性和覆蓋率。自動化測試可在多種環境和裝置上同時執行,為開發人員提供快速回饋,並縮短新發佈版本的上市時間。
程式碼儲存庫是程式碼及其相關檔案的儲存位置,有助於版本控制和協作。它是儲存、追蹤和管理程式碼庫變更的中央樞紐。程式碼儲存庫支援分支與合併,讓開發人員可以在隔離的環境中進行功能、修正或實驗,然後再將變更整合到主要程式碼中。
發行管理包含軟體建置在不同階段與環境中的規劃、排程與控制。它包括管理發行管道、與利害關係人協調、確保合規性發行標準,以及將軟體部署到生產中。此流程的目的是可靠、有效率地提供新功能和修補程式,並將對服務的干擾降至最低。
敏捷方法強調迭代開發、客戶協作以及對變革的回應能力。它提倡小規模、遞增式的發行、不斷地回饋和適應性規劃。敏捷原則提倡跨功能團隊合作、永續發展步調,以及反思實務,以不斷地改善流程和產品。
無伺服器架構可讓開發人員建立並執行應用程式,而無需管理伺服器基礎架構。它將伺服器抽象化,讓開發人員只需專注於編寫程式碼。雲端供應商會管理執行環境,動態管理資源分配。無伺服器架構可隨需求自動大規模擴充,使用者只需為所消耗的運算時間付費。
效能調整包括最佳化系統設定和程式碼,以改善回應時間、吞吐量和資源使用等效能指標。這需要剖析和監控應用程式以找出瓶頸,然後調整組態、最佳化程式碼,並確保有效的資源分配,以提升整體系統效率。
透過設計可處理故障並從故障中恢復而不會中斷服務的容錯系統,可確保彈性和可靠性。實作備援、故障移轉機制、定期測試災難復原程序,以及即時監控,都有助於強大的系統架構。儘管有系統壓力或突發問題,這些作法仍有助於維持一致的效能與可用性。