GitOps中推送與拉取兩種風格的區別 – thenewstack
自從出現第一個“基礎結構即程式碼”工具以來,人們就意識到對版本進行環境定義的版本控制和自動執行更改是很有意義的。您可以說那些早期的先驅者正在使用Git進行操作。或者,您可以將其稱為GitOps。
就像敏捷,DevOps或雲原生一樣,經常有人可能會問:“我們真的需要另一個營銷流行語嗎?作為既是工程師又是營銷人員的人,我認為GitOps一詞的產生更多是出於工程需求,而不是營銷需求。
軟體工程的基本原則是抽象實踐。我們將可重複的步驟抽象到函式中,將函式抽象到庫中,將庫抽象到框架中,然後將這些框架一起構建到工具中,然後不斷進行抽象,直到獲得Kubernetes。這與在我們的語言中使用抽象的概念非常相似。
您可以使用一個單詞“ GitOps”作為一個簡單概括,讓人們可以知曉其中更豐富和更深層的含義。
但是,當您知道如何呼叫API卻不瞭解底層執行時可能會出現麻煩,因此呼叫GitOps也會返回意外結果。
對於GitOps的兩種主要風格:“ 推送push”和“ 拉取pull”確實是這種情況。那麼,推和拉GitOps之間真的有什麼區別嗎?
Push
在這種樣式中,您使用CI / CD(連續整合/連續交付)管道將更改推送到您的環境,管道由程式碼提交或合併觸發。
好處:
- 簡便性:由於push使用了易於理解的CI / CD工具,因此對於組織中最廣泛的工程師來說,它將是最容易使用的工具。這通常意味著您可以更快地開始,並擁有更廣泛的協作池。
- 靈活性:如今,大多數拉式GitOps代理僅在Kubernetes中執行。如果要部署到Kubernetes以外的任何其他裝置,則需要將配置推送到該環境。可以使用在Kubernetes群集中執行的pull GitOps代理來協調對外部目標(如VM和裸機)的部署,但最終您將回到推送狀態。該代理正在推動那些環境。您最終需要管理許多相同的安全問題,即在環境外部儲存憑據以及開啟網路防火牆埠以允許入站連線。
- 效率:針對您的雲原生和傳統工作負載,採用相同的部署方法進行標準化可以提高您的效率。通過減少認知開銷,您可以更輕鬆地入職和培訓新團隊成員,同時確保現有團隊成員專注於解決問題,而不是瞭解多種技術。
- 優化的頻寬:使用Kubernetes代理不斷輪詢您的Git儲存庫以查詢更改可能不是幾個群集的問題,但是從規模上講,您可以體驗到有意義的網路資源消耗。此外,如果您的Git和容器登錄檔工具需要處理來自數百個群集的請求,並且不斷輪詢狀態,則它可能會承受巨大的負擔。您可以縮短輪詢間隔,但同時也會增加程式碼提交和部署之間的延遲。藉助推式GitOps,您可以在快速,低延遲的部署中獲得兩全其美的優勢,同時將網路和工具的負擔降至最低。
Pull
使用pull GitOps,在您的環境中執行的代理會不斷輪詢您的Git儲存庫和/或容器登錄檔中是否有更改。當它檢測到已定義狀態和執行狀態之間不匹配時,代理會將已定義的配置拉入環境。
好處:
- 原生雲:如果您的全部或大部分工作負載都在Kubernetes中執行,那麼使用代理進行部署可以是簡單有效的選擇。與所有其他Kubernetes運營商一樣,使用和管理CD代理也是如此。
- 安全性:使用pull GitOps可以降低安全性和合規性風險。由於CD代理在群集內部執行,因此無需在外部CI中儲存憑據。同樣,您可以減少或消除防火牆中允許入站連線的漏洞。
- 一致性:推送GitOps通常僅在一個方向上工作,從Git儲存庫到環境。拉動GitOps的工作方向也相反。代理不僅可以輪詢Git儲存庫和容器登錄檔中的更改,還可以將群集狀態與Git中定義的狀態進行比較。在手動或從其他來源對叢集進行更改的情況下,這可以檢測和糾正配置偏差。可以將推式CI / CD設定為定期輪詢您的環境,將執行狀態與已定義狀態進行比較,並在配置發生漂移時恢復到已定義狀態,但這是您需要設定的額外內容。大多數Pull GitOps代理都帶有此雙向比較,作為一項功能,您無需使用其他設定即可簡單地使用該代理。
總結
歸根結底,沒有必要過於嚴格,在練習GitOps的過程中,您可以進行一些推拉操作(雙關語)。權衡每種方法的利弊對團隊或組織的需求,將幫助您決定使用其中一個或兩個。儘管每種樣式都不同,但是兩者都會為您帶來好處,例如通過合併請求/拉取請求管理操作所帶來的增強的協作和合規性,以及自動化基礎架構和部署所帶來的增強的穩定性和彈性。
相關文章
- 資料網格與Data Fabric的區別 - thenewstack
- C++中建立物件的兩種方法及其區別C++物件
- Javascript中兩種方式定義函式的區別JavaScript函式
- 兩種增量備份的區別!
- hash和history兩種模式的區別模式
- rails中兩種回滾-reversible和revert區別AI
- hibernate中建立session的兩種方式方式,區別在哪裡?Session
- 將NSTimer新增至RunLoop中的兩種方法區別OOP
- vue-router的兩種模式的區別Vue模式
- JavaScript建立閉包的兩種方式的優劣與區別分析JavaScript
- 動態代理的兩種方式以及區別
- Mysql兩種主要資料引擎的區別MySql
- javascript兩種宣告函式方式的區別JavaScript函式
- 建立連結串列兩種方法的區別
- Abaqus與Ansys的區別和不同, 兩種軟體哪個更好?
- JS中幾種迴圈的區別與相同點JS
- PEP8風格和python版本區別Python
- 利用GitExtensions從GitHub推送或拉取程式碼Github
- tp5 db函式的兩種區別函式
- 定義函式的兩種形式及區別函式
- Retrofit 風格的 RxCache及其多種快取替換演算法快取演算法
- Golang兩種執行流程以及區別Golang
- asp.net 中兩種不同方式檔案流下載的區別?ASP.NET
- 面試— !Doctype的作用,嚴格模式和混雜模式的區別、以及如何觸發兩種模式面試模式
- __weak與__block區別,深層理解兩者區別BloC
- Javascript中“==”與“===”的區別JavaScript
- js中“==”與"==="的區別JS
- ios蘋果企業開發者賬號與蘋果另外兩種賬號的區別iOS蘋果
- GET和POST兩種基本請求方法的區別
- 各種流行的程式設計風格程式設計
- 兩步實現類似格瓦拉的轉場動畫動畫
- 微服務間如何選擇推送和拉取資料微服務
- Java中(==)與equals的區別Java
- numpy中dot與*的區別
- Python中 ‘==‘ 與‘is‘的區別Python
- 從程式碼的風格看出六種不同型別的程式設計師型別程式設計師
- VUE的兩種跳轉push和replace對比區別Vue
- 請教兩種Singleton Pattern 實現方式的區別!