GitOps 初探
前言
GitOps 的概念最初來源于?Weaveworks?的聯合創始人 Alexis 在 2017 年 8 月發表的一篇博客?GitOps - Operations by Pull Request。文章介紹了 Weaveworks 的工程師如何以 Git 作為事實的唯一真實來源,部署、管理和監控基于 Kubernetes 的 SaaS 應用。
隨后,Weaveworks 在其網站上發表了一系列介紹 GitOps 應用案例和最佳實踐的文章,對 GitOps 進行推廣。同時,市場上也出現了一批擁抱 GitOps 模式的工具和產品,如?Jenkins X、Argo CD、Weave Flux?等。而 KubeCon EU 2019 中關于 GitOps 的討論?GitOps and Best Practices for Cloud Native CICD,則讓 GitOps 進入到了更多人的視野當中。
本文將以上述資料為基礎,重點介紹如下內容:
什么是 GitOps?
GitOps 是一種快速、安全的方法,可供開發或運維人員維護和更新運行在 Kubernetes 或其他聲明式編排框架中的復雜應用。
GitOps 四項原則
以聲明的方式描述整個系統
借助 Kubernetes、Terraform 等工具,我們只需要聲明系統想要達到的目標狀態,工具會驅動系統向目標狀態逼近。聲明意味著系統狀態由一組事實而不是一組指令保證,方便進行維護。當我們將聲明信息存儲在 Git 中后,系統狀態便具備了唯一的事實來源。這樣,我們可以輕松地部署和回滾應用。更重要的是,當災難發生時,群集的基礎架構也能夠可靠且快速地再現。
系統的目標狀態通過 Git 進行版本控制
通過將系統的目標狀態存儲在具有版本控制功能的系統中,并作為唯一的事實來源,我們能夠從中派生和驅動一切。
對目標狀態的變更批準后將自動應用到系統
一旦將聲明的狀態保存在 Git 中,下一步就是允許對該狀態的任何變更都能自動地應用于系統,這樣可以極大地提升產品交付速度。更重要的是,GitOps 采用拉模式更新系統狀態,將做什么和怎么做分開,這樣能夠更加有效地劃分出系統的安全邊界。
驅動收斂 & 上報偏離
GitOps 中包含一個操作的反饋和控制循環。它將持續地比較系統的實際狀態和 Git 中的目標狀態,如果在預期時間內狀態仍未收斂,便會觸發告警并上報差異。同時,該循環讓系統具備了自愈能力。自愈不僅僅意味著節點或 pod 失敗, 這些由 Kubernetes 處理,在更廣泛的角度,它能修正一些非預期的操作造成的系統狀態偏離。下圖展示了 GitOps 按控制論思想構建的閉環控制系統。
GitOps 的簡潔定義
進一步,可以將 GitOps 總結成以下兩點:
推模式和拉模式
本章將介紹交付流水線中的推模式和拉模式,并解釋為何 GitOps 選用拉模式來構建流水線。
CI/CD 流水線
目前大多數 CI/CD 工具都基于推模式建交付流水線。代碼被合并到主分支后會觸發 CI 系統進行構建和一系列的測試,并將新生成的鏡像推送至鏡像倉庫,最后再通過kubectl set image、helm upgrade、ksonnet apply等方式將新版本直接應用到系統,整個流程如下圖所示。
雖然這樣的方式自動化程度很高,但對它進行審視后會發現如下問題:
GitOps 流水線
GitOps 基于拉模式構建交付流水線。此時,開發人員發布一個新功能的流程如下:
通過為不同的集群創建各自的子目錄或分支,可以輕松地將該模式拓展到多集群環境。
接下來讓我們看看 GitOps 流水線如何解決推式流水線中存在的那些問題。
GitOps 的主要優勢
經過上面兩章的介紹,可以將 GitOps 的優勢總結如下:
GitOps 關鍵工具
GitOps 的概念來源于 Weaveworks,但它并沒有和特定的公司或工具綁定。下面列出了一些實現 GitOps 模式可選用的工具。
-
Infrastructure as Code & Configuration as Code
- Terraform
- CloudFormation
- ROS
- Kubernetes
- Chef
- Ansible
-
版本控制工具
- GitLab
- Bitbucket
-
狀態比較工具
- Kubediff
-
交付流水線
- Jenkins X
- Argo CD
- Weave Flux
- Spinnaker
總結
Flickr 的工程師 John Allspaw 和 Paul Hammond 在 Velocity Conf 2009 上發表的演講?10+ Deploys Per Day: Dev and Ops Cooperation at Flickr?開啟了 DevOps 時代的序幕。它是人們追求以更高的頻率發布高質量的軟件的必然產物。
進入云原生時代后,產品的基礎設施、系統架構和運維方式都發生了很大變化。為此,GitOps 對 DevOps 理念進行了擴展,它吸收了 DevOps 文化中協作、試驗、快速反饋、持續改進等思想,并以 Git 作為事實的來源和鏈接的橋梁,旨在簡化云原生時代基礎設施和應用程序的部署與管理方式,實現產品更快、更頻繁、更穩定的交付。
原文鏈接
本文為云棲社區原創內容,未經允許不得轉載。
總結
- 上一篇: 基于Topic消息路由的M2M设备间通信
- 下一篇: 浅析基于 Serverless 的前后端