GitOps 使用 Git 作為基礎架構的唯一可信來源。自動化協調可確保每台伺服器都執行相同的宣告式組態。系統會自動偵測並修正期望狀態與實際狀態之間的組態漂移。這個過程能夠消除人工組態錯誤。

所有變更都會記錄在 Git 中,從而提供可視性與直接回復的能力——回退一次提交即可還原環境。由於變更透過拉取請求而不是直接 SSH 存取來流轉,人為失誤會大幅減少。持續消除漂移可確保一致性。GitOps 能夠管理多台伺服器的組態一致性。

關鍵要點

  • GitOps 使用 Git 作為基礎架構的唯一可信來源。
  • 自動化工具會自動偵測並修復組態漂移。
  • 宣告式組態定義了伺服器所需的目標最終狀態。
  • 從一個程式碼儲存庫和一個叢集開始,然後逐步擴展。
  • 治理與策略檢查可確保所有環境中的一致性。

多伺服器一致性挑戰

規模化下的組態漂移

你手動設定了一台伺服器,然後又設定另一台、第三台。每台機器接收到的軟體套件、修補程式和設定都會略有不同。數週乃至數月後,這些細微差異會不斷累積,最終形成組態漂移。一台主機執行較舊的核心,另一台多了一個額外服務,第三台則存在一條沒有人記得何時加入的防火牆規則。你預期中的組態與實際狀態之間的差距,會隨著每一次手動變更而不斷擴大。

這個問題在跨環境時會更加嚴重。你的預備叢集可能與正式環境完全不同,災難復原站點可能又落後於兩者。這些環境之間的不一致會在發佈期間造成不可預測的行為。一個在測試中通過的功能,到了正式環境可能因為與程式碼本身無關的原因而失敗。

來看一個具體案例。一位工程師為了修復 Bug,在預備伺服器上升級了一個共用函式庫,而正式環境仍然執行舊版本。應用程式在預備環境中通過了全部測試,但在正式發佈時,新程式碼呼叫了一個只有升級後函式庫中才存在的函式,於是部署失敗。回復耗費了數小時。追根究柢,根本原因只是一場未經協調的手動變更。

手動管理的隱性成本

手動管理伺服器會帶來許多很少出現在預算表中的成本。組態複雜性會提高維護開銷,而這些開銷又要求制定文件標準、變更管理流程和治理策略。這些控制措施的存在,就是為了防止漂移,並確保在不同部署中的營運可靠性。

如果沒有這些控制,你的團隊就會把時間花在救火上,而不是建設新能力。工程師會透過 SSH 登入機器修復一次性問題,卻沒有人記錄到底改了什麼。下一次事故發生時,同樣的排查還要再來一遍。你的基礎架構最終會變成一組「雪花伺服器」,每一台都獨一無二,也都十分脆弱。

其財務影響不僅限於人工成本。發佈失敗會延遲收入,緊急回復會消耗工程工時,稽核失敗則可能引發合規處罰。這些費用會悄悄累積,直到一次重大故障將其徹底暴露。你無法衡量那些從未被追蹤的事物,而手動流程恰恰不會留下可靠的紀錄。

GitOps 如何管理組態一致性

宣告式目標狀態

宣告式組態定義的是你想要達成的最終結果,而不是實現它所需的步驟。你描述目標伺服器數量、負載平衡器以及具體設定,接著工具會計算並執行達到該狀態所需的所有操作。這與命令式腳本形成鮮明對比:在命令式模式中,你必須撰寫並維護每一個手動步驟。

Terraform 的宣告式模型很好地說明了這一點。團隊只需指定基礎架構的目標最終狀態,而不必撰寫逐步的部署命令。該工具推動一種不可變基礎架構模式,即透過替換資源而不是原地修改資源來實現變更。由於伺服器不會隨著時間推移被不斷套用修補程式或反覆修改,組態漂移會顯著減少。這有助於讓多伺服器環境保持一致。

宣告式組態為大規模伺服器管理帶來若干優勢。規劃階段可以在實際套用前預覽變更,從而避免意外摧毀基礎架構。不可變基礎架構可避免因手動更新或腳本錯誤而導致伺服器不一致。基礎架構變更可以透過拉取請求觸發,從而像應用程式程式碼一樣進行自動化測試與同儕審查。無論是單一開發者還是上千人的團隊,這種方法都適用,並支援在大量伺服器之間實現一致管理。

版本控制與自動協調

協調迴圈是 GitOps 模型的核心。代理會持續比較即時叢集狀態與 Git 中保存的目標狀態。一旦出現偏差,代理就會自動進行修正。受 ArgoCD Kubernetes 資源管理方式啟發的持續協調,目標是透過持續保持狀態對齊,消除對定時漂移偵測的依賴。

這與以管線為基礎的方法有根本區別。以管線為基礎的方法只會在管線執行時套用變更,因此在兩次執行之間可能產生不一致。採用 FluxCD 的 GitOps 會監看 Git 程式碼儲存庫,並使叢集與宣告式組態保持同步。結果就是一致、自動且可追蹤的部署。

在實際落地中,可以依照用途拆分程式碼儲存庫。一個儲存庫存放應用程式原始碼和開發環境清單,另一個專門的基礎架構儲存庫存放 Terraform 和 Kubernetes 清單,用於預備與正式環境。應用程式儲存庫使用 Helm 以實現彈性參數化,而基礎架構儲存庫使用 Kustomize,因為那裡的組態是固定的,也更容易管理。清單依環境目錄組織,例如 manifests/app1/productionmanifests/app1/staging。Helm chart 版本會固定在 Chart.yaml 的相依項中,以便 ArgoCD 能從兩個位置轉譯清單。

manifest_projects 組態用於定義 Kubernetes 清單的儲存位置。代理會監看這些儲存庫,並在清單檔案發生變更時部署更新。關鍵參數包括 id(Git 儲存庫路徑)、ref(可選的 Git 參照)以及 paths(需要掃描清單檔案的儲存庫路徑)。reconcile_timeout 參數控制套用器等待所有已套用資源完成協調的時長,預設值為 3600 秒。prune 設定決定是否在套用後清理先前已套用的物件,預設值為 true。

這種結構讓部署工作流程保持簡潔,也不會增加開發者成本。它支援 ArgoCD 監看基礎架構儲存庫中的變更。自動同步可確保你的叢集狀態始終與 Git 儲存庫匹配。你還能清楚了解部署健康狀況與同步狀態。GitOps 管理組態一致性的方式,透過消除手動資源修改來防止組態漂移。

面向多叢集群組的核心 GitOps 工具

用於多叢集管理的 Argo CD

Argo CD 可以透過一個 Git 儲存庫管理多個 Kubernetes 叢集。這個集中控制點可使每個叢集都與同一份宣告式狀態保持一致。ApplicationSet 控制器結合 Git 產生器,會掃描儲存庫目錄,並為每個符合條件的服務和環境建立 Application 資源。如此一來,每個服務都遵循相同的部署模式。

機制如何確保一致性與自動同步
搭配 Git 產生器的 ApplicationSet掃描 Git 目錄,並為每個服務和環境建立 Application 資源
自動同步策略prune: true 會移除 Git 中已不存在的資源;selfHeal: true 會修正狀態偏差
Git 作為唯一可信來源Argo CD 會持續將即時狀態與 Git 進行協調
Kustomize Base + Overlays共用基礎組態並結合依環境劃分的覆蓋組態,以減少重複
Git Webhook 整合當儲存庫發生變更時,Webhook 會觸發自動同步

自動同步策略進一步強化了這種模型。prune 設定會刪除那些已不再由 Git 定義的 Kubernetes 資源。selfHeal 設定會修復即時叢集與目標狀態之間的任何偏差。Webhook 整合會在儲存庫發生變更的第一時間通知 Argo CD,從而無需人工介入即可完成同步。

Flux 與模組化控制器

Flux 採用了另一種路徑。它由一組模組化控制器構成,每個控制器只負責一項任務,例如來源管理、kustomization 或 helm release。這些控制器會監看 Git 儲存庫,並分別獨立地協調叢集狀態。你可以只採用所需的控制器,這很適合希望對工具鏈進行細粒度控制的團隊。

兩種工具共享相同的基礎。它們都會監看 Git、偵測漂移並自動修正。Argo CD 提供統一儀表板和以應用程式為中心的檢視;Flux 則提供更輕量、可組合的控制器集合。你的選擇取決於團隊工作流程與維運偏好,而不是功能能力上的差距。

逐步實施 GitOps

儲存庫結構與環境資料夾

你可以在同一個 Git 分支上,用不同資料夾來建模不同環境。這種模式支援一致的環境提升。一個變更從預備進入正式,是透過拉取請求完成的,而不是透過手動重建。你的團隊審查的是將要真正進入每個叢集的同一份差異。

一種實用的目錄布局會將基礎組態與環境覆蓋分開:

manifests/
  app1/
    base/
    staging/
    production/
  app2/
    base/
    staging/
    production/

base 資料夾保存共用資源。每個環境資料夾只對有差異的部分套用修補,例如副本數或資源限制。這種結構支援多環境組態,而不必複製每一份清單。你可以為每項服務保留一份單一可信來源。

自動化與環境覆蓋

Argo CD 和 Flux 都扮演協調工具的角色。它們會持續比較 Git 中保存的目標組態與 Kubernetes 中正在執行的實際狀態。在這個比較過程中,它們會檢查 Git 與即時叢集狀態之間是否存在漂移。如果偵測到漂移,工具會提醒相應團隊,或者自動協調系統,使即時狀態重新與 Git 中的目標組態對齊。

這種自動協調可防止手動正式環境變更——例如臨時的 kubectl 編輯——在無人察覺的情況下長期存在。系統會覆蓋這些改動,並還原 Git 所定義的狀態。對於多叢集部署,Argo CD 支援跨所有部署的集中可視化模型;Flux 支援分散式模型,也就是每個叢集執行自己的 Flux 實例,並從 Git 儲存庫自主協調,這提升了隔離性並減少了跨環境相依。

你可以在 Argo CD 中透過為每個 Application 啟用 self-heal 和 prune 來設定自動同步。Flux 則透過其 Kustomization 和 HelmRelease 控制器實現相同結果。兩種方式都能提供讓每個叢集保持一致的自動化能力。

跨叢集一致性不只是部署問題,也是治理問題,尤其是在組織跨區域、跨業務單位和跨多雲擴張時更是如此。你需要為網路、RBAC、服務與安全制定一套標準規則,然後在程式碼儲存庫和組態中加以執行。許多組織會以基礎組態、可重用元件和共用函式庫來組織儲存庫結構。這種方式既保證一致性,也允許受控客製化。變更可以在合併前接受審查,使安全、平台和維運團隊能夠評估風險或提出改進建議。

GitOps 工具並不會消除維運複雜性。團隊仍然需要決定如何組織儲存庫、定義權限,以及為密鑰和緊急變更建立策略。如果團隊透過直接修改正式環境來繞過流程,那麼無論工具多強大,漂移遲早都會捲土重來。防止漂移的關鍵,在於把 Git 視為唯一可信來源,而不只是備份。這種紀律性,才是讓 GitOps 管理組態一致性能在眾多 Kubernetes 環境中長期成立的根本。

從一個儲存庫和一個叢集開始。隨著信心增加,再加入環境資料夾。當你的審查流程與策略檢查逐漸成熟後,再擴展到更多叢集。

治理與最佳實務

策略執行與稽核

Git 為每一次變更提供完整的稽核軌跡。每個提交都會記錄是誰、在何時、修改了什麼。拉取請求在變更合併前強制執行審查,為每一次修改增加了一道安全控制。編輯者可以建立分支、預覽變更,並透過拉取請求將變更合併到正式環境。這個工作流程支援受控且可追蹤的變更管理。

你還應限制誰可以向受保護分支推送。對 Git 儲存庫實施基於角色的存取控制,可確保只有獲得授權的工程師才能核准正式變更。再結合漂移偵測工具,即可發現未授權的修改。Falco 規則可以識別未授權的二進位執行和套件管理器使用行為;使用 Bash 腳本持續驗證映像摘要可以發現竄改;Kubernetes 清單可強制使用唯讀根檔案系統,以防止執行階段組態變更。當出現漂移時,可透過分步驟回應手冊執行「偵測、隔離、驅逐」模型進行事故處置。

維持跨環境一致性

集中式 Git 儲存庫有助於緩解多個叢集之間的組態漂移。你可以共用版本控制範本,防止環境之間發生分化。CloudFormation 的 Drift Detection 功能能夠識別在堆疊之外被修改的資源;Change sets 可以驗證堆疊更新是否與預期操作一致。Control Tower 的漂移偵測與登陸區中的修復控制,可限制允許使用的區域並減少漂移面。

對於 Kubernetes 環境,自動協調會讓每個叢集始終與 Git 保持一致。這種集中式環境管理方法意味著,無論區域或團隊如何變化,你的部署都遵循相同模式。你只需定義一次基礎架構,然後透過環境資料夾逐步提升。之後,每個叢集都會針對同一份宣告式狀態進行協調。

從一個儲存庫和一個叢集開始。隨著團隊成熟,再加入策略檢查。當你的審查流程趨於穩定後,再擴展到更多叢集。這種紀律性,正是讓 GitOps 管理組態一致性能在眾多 Kubernetes 環境中持續有效的基礎。請將 Git 視為你的唯一可信來源,而不只是備份。任何繞過工作流程、直接修改正式環境的團隊,最終都會再次面對漂移。GitOps 模型獎勵一致性,而你的治理實務決定了這種一致性能否持久。

如果你以紀律化方式實施 GitOps,它就能在多台伺服器之間帶來可預測性與一致性。你將獲得可稽核的變更歷史、更快的回復能力、更少的漂移,以及更強的團隊協作。每一次變更都透過 Git 流轉,留下清楚的審查與除錯紀錄。你可以透過回退一次提交來撤銷有問題的部署。協調迴圈會在漂移引發正式環境問題之前先行發現。

從一個儲存庫和一個叢集開始。隨著信心提升,再逐步擴展工作流程。這種漸進式方法能幫助團隊建立肌肉記憶,而不會讓維運工作不堪負荷。請把 Git 視為你的唯一可信來源。這種紀律會在擴展到更多環境時持續帶來回報。一致性將成為一種可預期的結果。

常見問題

什麼是組態漂移?

組態漂移是指伺服器的即時組態不再符合其預期設計。手動修改、被遺忘的修補程式和一次性修復,都會隨著時間推移讓機器彼此偏離。每台主機都會慢慢變得獨特,你原本規劃好的整個平台也就失去了統一行為。

為什麼 Git 比共用 Wiki 頁面更好?

Wiki 記錄的是某人記得寫下來的內容,而 Git 記錄的是每一次變更的作者、時間戳與差異。代理可以讀取 Git 並據此執行操作,不需要人工去解讀頁面內容,也不需要猜測哪個版本才是目前版本。

一個儲存庫可以同時管理預備與正式環境嗎?

可以。你可以在同一個分支上為每個環境設定獨立資料夾。一個變更透過拉取請求從預備提升到正式。審查者看到的正是將會進入每個叢集的那份精確差異。這種模式讓環境提升保持一致且可追蹤。

是什麼阻止別人直接編輯叢集?

自動協調會覆蓋手動變更。代理會比對即時狀態與 Git,並還原宣告式組態。若想做出持久性變更,工程師就必須先提交到儲存庫。這個要求自然形成了一道審查門檻與永久稽核紀錄。

初學者應該從多少個叢集開始?

從一個儲存庫和一個叢集開始。隨著團隊信心提升,再加入環境資料夾。當審查流程與策略檢查成熟後,再擴展到更多叢集。漸進式採用能夠建立可靠習慣,而不會讓維運工作超出承受範圍。