在現代雲原生應用開發中,持續整合(CI)和持續佈署(CD)已經成為標準實踐。在前面我們已經探討了 Tekton 和 GitHub Actions 等工具如何實作持續整合,但真正的挑戰在於:如何以符合 GitOps 理念的方式將應用佈署到 Kubernetes 環境中?
正如行業工作者 Daniel Bryant 所言:「如果你過去不用 SSH 佈署生產應用,那就別用 kubectl 在 Kubernetes 中做同樣的事。」這句話精確地點出了傳統佈署方式在雲原生環境中的侷限性。
Argo CD 正是為解決這一挑戰而生的工具 — 一個專為 Kubernetes 設計的宣告式 GitOps 持續佈署工具。Argo CD 不僅支援佈署原生 Kubernetes 資源清單,還能處理 Kustomize 和 Helm 專案,為複雜應用提供協調能力。
在本文中,玄貓將帶領大家從基礎安裝開始,探討 Argo CD 的核心功能,包括:
- 基本安裝與首個應用佈署
- 自動佈署與自我修復機制
- 容器更新時的滾動佈署
- 複雜應用的佈署協調
讓我們開始這場 GitOps 之旅,探索如何用 Argo CD 開發更可靠、更高效的應用佈署流程。
Argo CD 基礎:佈署你的第一個應用
問題背景
在採用 GitOps 模式時,我們面臨的首要問題是:如何讓 Argo CD 從 Git 倉函式庫得並佈署應用定義?傳統的佈署方式通常依賴於 CI 流程中的指令式指令碼,這與 GitOps 的宣告式理念相悖。
解決方案:Application 資源
Argo CD 的核心理念是將所有設定儲存在 Git 倉函式庫並透過 Application 資源告訴 Argo CD 在哪裡尋找這些設定。以下是實作這一目標的步驟:
1. 安裝 Argo CD
首先,讓我們在 Kubernetes 叢集中安裝 Argo CD:
kubectl apply -n argocd \
-f https://raw.githubusercontent.com/argoproj/argo-cd/v2.3.4/manifests/install.yaml
這個命令會在名為 argocd
的名稱空間中佈署 Argo CD 的所有必要元件。
可選步驟:安裝 CLI 工具與存取 Dashboard
雖然不是必需的,但安裝 Argo CD CLI 工具並存取其 Dashboard 可以幫助我們更直觀地管理應用。
- 從 Argo CD GitHub 發布頁面 下載適合你平台的 CLI 工具
- 使用連線埠轉發存取 Argo CD 伺服器:
kubectl port-forward svc/argocd-server -n argocd 9090:443
- 取得初始管理員密碼:
argoPass=$(kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d)
- 登入 CLI:
argocd login --insecure --grpc-web localhost:9090 --username admin --password $argoPass
這些憑證也可用於存取 Argo CD 的 Web 介面(http://localhost:9090)。
2. 設定並佈署範例應用
現在讓我們佈署一個簡單的 Web 應用,它會顯示一個具有設定顏色的框。該應用由三個 Kubernetes 資源組成:名稱空間、佈署和服務定義。
要讓 Argo CD 佈署這個應用,我們需要建立一個 Application 資源:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: bgd-app
namespace: argocd # Argo CD 安裝的名稱空間
spec:
destination:
namespace: bgd
server: https://kubernetes.default.svc # 目標叢集和名稱空間
project: default # 安裝在 Argo CD 的預設專案中
source:
repoURL: https://github.com/gitops-cookbook/gitops-cookbook-sc.git # 資源清單所在的倉函式庫 path: ch07/bgd # 資源清單的路徑
targetRevision: main # 要簽出的分支
內容解析:
這個 YAML 檔案告訴 Argo CD:
- 在
argocd
名稱空間中建立一個名為bgd-app
的應用 - 該應用的原始碼位於指定 GitHub 倉函式庫
ch07/bgd
路徑中 - 應用應該佈署到當前叢集的
bgd
名稱空間 - 使用
main
分支的內容
3. 註冊並同步應用
應用定義完成後,我們需要將其應用到叢集並觸發同步:
kubectl apply -f manual-bgd-app.yaml
此時,應用已在 Argo CD 中註冊,但尚未佈署。我們可以使用 CLI 檢查狀態:
argocd app list
輸出結果可能如下所示:
NAME CLUSTER NAMESPACE PROJECT STATUS
bgd-app https://kubernetes.default.svc bgd default OutOfSync
注意 STATUS
欄位顯示為 OutOfSync
,這表示 Git 倉函式庫期望狀態與叢集中的實際狀態存在差異。此時,如果檢查 bgd
名稱空間,你會發現沒有任何 Pod 執行:
kubectl get pods -n bgd
# 輸出:No resources found in bgd namespace.
這是因為 Argo CD 預設不會自動同步應用。要觸發同步,我們可以執行:
argocd app sync bgd-app
同步完成後,再次檢查 bgd
名稱空間,你會發現應用已成功佈署:
kubectl get pods -n bgd
# 輸出:NAME READY STATUS RESTARTS AGE
# bgd-788cb756f7-jll9n 1/1 Running 0 60s
kubectl get services -n bgd
# 輸出:NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)
# bgd ClusterIP 172.30.35.199 <none> 8080:32761/TCP
技術深度解析
在這個例子中,我們透過一個簡單的 Application 資源實作了 GitOps 的核心理念:
宣告式設定:我們沒有使用命令式的
kubectl create
或kubectl apply
,而是定義了一個 Application 資源來描述我們想要的狀態。單一事實來源:所有設定都儲存在 Git 倉函式庫Argo CD 僅負責確保叢集狀態與 Git 中的定義一致。
手動觸發同步:預設情況下,Argo CD 不會自動同步應用,這讓團隊可以控制何時應用更改。
狀態視覺化:Argo CD 提供了清晰的介面來顯示應用的同步狀態,使得設定偏差一目瞭然。
這種模式與傳統 CI/CD 最大的區別在於,佈署不再是 CI 流程的延伸,而是一個獨立的、根據 Git 的協調過程。這使得佈署更加可靠、可稽核與可重現。
Argo CD 與自動化:實作自動同步與自我修復
在實際生產環境中,手動觸發每次同步操作可能會成為團隊的負擔,特別是當應用數量增加或更新頻繁時。Argo CD 提供了自動同步的能力,讓系統能夠自動回應 Git 倉函式庫更。
自動同步設定
要為應用啟用自動同步,我們需要在 Application 資源中增加同步策略:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: bgd-app-auto
namespace: argocd
spec:
destination:
namespace: bgd
server: https://kubernetes.default.svc
project: default
source:
repoURL: https://github.com/gitops-cookbook/gitops-cookbook-sc.git
path: ch07/bgd
targetRevision: main
syncPolicy:
automated:
prune: true
selfHeal: true
內容解析:
這裡新增了 syncPolicy
部分,其中:
automated
:啟用自動同步prune: true
:自動刪除 Git 中已移除的資源selfHeal: true
:當叢集中的資源與 Git 中的定義不符時自動修復
透過這些設定,Argo CD 將:
- 監控 Git 倉函式庫化
- 當檢測到變更時自動同步應用
- 如果有人直接修改叢集中的資源(繞過 GitOps 流程),自動將其還原為 Git 中定義的狀態
自我修復機制的實際應用
自我修復功能是 Argo CD 最強大的特性之一,它確保了叢集始終與 Git 中定義的狀態一致。讓我們透過一個實際例子來理解這一機制:
假設某個開發人員出於除錯目的,直接使用 kubectl
修改了佈署的副本數:
kubectl scale deployment bgd -n bgd --replicas=3
在沒有自我修復的情況下,這種變更會持續存在,導致實際狀態與 Git 中定義的期望狀態不一致。但有了自我修復機制,Argo CD 將檢測到這種偏差並自動將副本數還原為 Git 中定義的值。
這種機制確保了:
- 所有設定變更都必須透過 Git 提交
- 叢集設定具有高度的一致性和可預測性
- 臨時變更不會持久化,減少了環境漂移
技術實作原理
Argo CD 的自動同步和自我修復功能根據以下技術原理:
- 資源監控:Argo CD 持續監控已佈署資源的實際狀態
- 差異比較:將實際狀態與 Git 倉函式庫期望狀態進行比較
- 事件觸發:當檢測到差異時,觸發相應的同步操作
- 資源調和:應用必要的變更以使叢集狀態與 Git 定義一致
在 Kubernetes 生態系統中,這種模式被稱為「控制器模式」,它是宣告式 API 的核心機制。Argo CD 本質上是一個特殊的控制器,負責確保叢集中的資源與外部定義(Git 倉函式庫持一致。
整合 Kustomize 與 Helm:擴充套件 Argo CD 的應用管理能力
Argo CD 的強大之處不僅在於能夠佈署原生 Kubernetes 資源,還能無縫整合 Kustomize 和 Helm 等流行的 Kubernetes 設定工具。這使得團隊可以利用這些工具的優勢,同時享受 GitOps 的好處。
使用 Kustomize 管理環境差異
Kustomize 是 Kubernetes 原生的設定製工具,它允許我們在不同環境中重用基礎設定,同時應用環境特定的變更。結合 Argo CD,我們可以實作更靈活的多環境佈署。
以下是一個使用 Kustomize 的 Argo CD Application 範例:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: kustomize-app
namespace: argocd
spec:
destination:
namespace: kustomize-demo
server: https://kubernetes.default.svc
project: default
source:
repoURL: https://github.com/example/kustomize-demo.git
path: overlays/production
targetRevision: main
kustomize:
namePrefix: prod-
images:
- name=nginx:latest
內容解析:
這個設定告訴 Argo CD:
- 從指定倉函式庫
overlays/production
路徑取得 Kustomize 設定
Argo CD的GitOps實踐:從佈署到自動化
在現代Kubernetes環境中,GitOps已成為管理應用佈署的主流方法論。而Argo CD作為一個專為Kubernetes設計的GitOps工具,讓我們能夠直接從Git儲存函式庫並同步應用設定到叢集中。在這篇文章中,玄貓將帶領大家深入理解Argo CD的核心功能,包括應用佈署、同步策略,以及與Kustomize的整合。
驗證佈署狀態與存取服務
在GitOps流程中,驗證佈署成功是關鍵步驟。首先需要取得Minikube的IP位址:
minikube ip -p gitops
# 輸出結果: 192.168.59.100
取得IP後,我們可以透過瀏覽器存取該IP和暴露的連線埠(在這個例子中是192.168.59.100:32761)來驗證應用是否正確佈署。此時,應用介面中的圓圈應該呈現藍色。
更新應用設定與手動同步
GitOps的核心理念是透過Git管理所有設定變更。現在我們來修改應用的環境變數,讓圓圈從藍色變為綠色:
- 開啟
bgd-deployment.yaml
檔案,修改COLOR環境變數:
spec:
containers:
- image: quay.io/redhatworkshops/bgd:latest
name: bgd
env:
- name: COLOR
value: "green"
- 提交並推播變更到Git儲存函式庫
git add .
git commit -m "Updates color"
git push origin main
- 檢查應用狀態:
argocd app list
初始狀態可能顯示為Sync
,這是因為Argo CD使用輪詢機制來檢測偏差。預設情況下,每3分鐘檢查一次。等待片刻後,狀態將變為OutOfSync
,表示Git儲存函式庫義與叢集中的佈署已經不一致。
- 手動同步應用:
argocd app sync bgd-app
同步完成後,再次存取服務,圓圈顏色應已變為綠色。
實作自動同步策略
手動同步雖然安全,但在持續佈署環境中可能不夠高效。Argo CD支援自動同步策略,讓設定變更自動應用到叢集中。
要啟用自動同步,需要在Application定義中增加syncPolicy
部分:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: bgd-app
namespace: argocd
spec:
destination:
namespace: bgd
server: https://kubernetes.default.svc
project: default
source:
path: ch07/bgd
repoURL: https://github.com/gitops-cookbook/gitops-cookbook-sc.git
targetRevision: main
syncPolicy:
automated: {}
應用此設定後,Argo CD將自動佈署應用,無需額外命令:
kubectl apply -f bgd/bgd-app.yaml
可以透過以下命令驗證佈署狀態:
kubectl get pods -n bgd
這個自動同步設定中,syncPolicy.automated: {}
表示啟用自動同步但使用預設設定。這意味著Argo CD會在檢測到Git儲存函式庫集之間的差異時自動同步,但不會自動刪除資源或修復手動更改。這是一種保守的自動化策略,確保安全性的同時提供一定程度的自動化。
深入理解自動同步策略的安全機制
Argo CD的自動同步策略包含兩個重要的安全機制:資源清理(pruning)和自我修復(self-healing)。
資源清理機制
預設情況下,當Git儲存函式庫除某個資源定義時,Argo CD不會自動刪除叢集中對應的資源,而是將應用狀態標記為OutOfSync
。這樣設計是為了防止意外刪除重要資源。
啟用自動清理有兩種方式:
- 手動執行帶有
--prune
選項的同步命令:
argocd app sync --prune
- 在自動同步策略中啟用
prune
選項:
syncPolicy:
automated:
prune: true
自我修復機制
另一個重要機制是自我修復。預設情況下,如果有人直接在叢集中修改了應用設定(繞過Git),Argo CD不會自動修復這些更改。
讓我們透過實驗來理解這一機制:
- 使用
kubectl patch
命令直接更改佈署中的環境變數:
kubectl -n bgd patch deploy/bgd \
--type='json' -p='[{"op": "replace", "path": "/spec/template/spec/containers/0/env/0/value", "value":"green"}]'
- 等待佈署完成:
kubectl rollout status deploy/bgd -n bgd
此時,應用介面中的圓圈應該變為綠色,但Argo CD會顯示應用狀態為OutOfSync
,因為叢集中的設定與Git儲存函式庫定義不一致。然而,Argo CD不會自動修復這種偏差。
要啟用自我修復功能,需要設定selfHeal
為true
:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: bgd-app
namespace: argocd
spec:
destination:
namespace: bgd
server: https://kubernetes.default.svc
project: default
source:
path: ch07/bgd
repoURL: https://github.com/gitops-cookbook/gitops-cookbook-sc.git
targetRevision: main
syncPolicy:
automated:
prune: true
selfHeal: true
應用此設定:
kubectl apply -f bgd/heal-bgd-app.yaml
現在,如果再次嘗試直接修改佈署設定,Argo CD會自動將設定還原到Git儲存函式庫義的狀態,確保叢集與Git儲存函式庫一致。
這個增強版的自動同步設定增加了兩個重要引數:prune: true
使Argo CD能夠自動刪除在Git中被移除的資源;selfHeal: true
使其能夠自動修復叢集中手動引入的變更。這種設定非常適合嚴格的GitOps環境,確保叢集始終反映Git儲存函式庫預期狀態,防止任何未經授權的更改持續存在。
Kustomize與Argo CD的整合
Argo CD不僅支援原生Kubernetes清單,還支援多種組態管理工具,包括Kustomize、Helm、Ksonnet和Jsonnet。當Argo CD檢測到kustomization.yaml
、kustomization.yml
或Kustomization
檔案時,會自動識別為Kustomize專案。
讓我們看一個使用Kustomize佈署BGD應用的例子,同時將圓圈顏色設定為黃色:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: bgdk
resources:
- ../base
- bgdk-ns.yaml
patchesJson6902:
- target:
version: v1
group: apps
kind: Deployment
name: bgd
namespace: bgdk
patch: |-
- op: replace
path: /spec/template/spec/containers/0/env/0/value
value: yellow
這個Kustomize設定做了幾件重要的事情:
- 設定名稱空間為
bgdk
- 包含基礎目錄中的標準佈署檔案(預設顯示藍色圓圈)
- 包含一個用於建立名稱空間的特設定檔案
- 使用JSON Patch格式修改佈署檔案,將環境變數
COLOR
的值從原來的藍色覆寫為黃色
透過這種方式,我們可以在不直接修改原始佈署檔案的情況下,為不同環境或使用案例定製應用設定。這是Kustomize的核心優勢之一,而Argo CD原生支援這種工作流程。
Argo CD自動化佈署的最佳實踐
在實際使用Argo CD進行自動化佈署時,有幾點最佳實踐值得注意:
謹慎使用自動清理:雖然自動清理可以保持叢集整潔,但也可能導致意外刪除重要資源。在生產環境中,建議先手動驗證同步計劃,確認無誤後再啟用自動清理。
分階段啟用自我修復:自我修復功能強大,但可能會覆寫緊急修復。建議在非關鍵環境中先試用,熟悉其行為後再在生產環境啟用。
適當設定同步間隔:預設的3分鐘同步間隔可能不適合所有場景。對於關鍵應用,可以縮短間隔;對於變更不頻繁的應用,可以延長間隔以減少資源消耗。
利用應用集(ApplicationSets):對於需要佈署到多個叢集或名稱空間的應用,使用ApplicationSets可以大簡化管理。
實施漸進式同步:對於大型應用,可以使用Argo CD的漸進式同步功能,按照特定順序應用更改,減少服務中斷風險。
結合CI管道:將Argo CD與CI管道整合,實作程式碼更改自動測試、構建和佈署的完整流程。
Argo CD為Kubernetes環境提供了強大的GitOps實作方案,從手動同步到全自動佈署,從基本設定到Kustomize整合,滿足了各種複雜度的佈署需求。透過合理設定自動同步策略,可以在確保安全的同時提高佈署效率。
在實際專案中,玄貓建議從簡單的手動同步開始,逐步引入自動化功能,同時建立完善的監控和回復機制。隨著對Argo CD的深入理解,可以進一步探索其高階功能,如藍綠佈署、金絲雀發布等,開發更加強大的持續佈署流程。
GitOps的核心理念是"以Git為單一事實來源",而Argo CD則是將這一理念落地為實用工具的絕佳選擇。透過本文介紹的實踐方法,相信你已經掌握了Argo CD的基本使用技巧,可以開始在實際專案中實施GitOps了。
Argo CD 的多元化佈署策略:超越基礎應用
在實際的 Kubernetes 環境中,我們通常需要比基礎 GitOps 佈署更靈活的解決方案。隨著應用程式複雜度增加,管理設定變異性、整合不同工具和自動化更新容器映像等需求變得日益重要。在這篇文章中,我將分享在多年實踐過程中,如何利用 Argo CD 與主流 Kubernetes 設定工具的整合能力,開發強大而靈活的 GitOps 工作流程。
Kustomize 整合:靈活定製佈署設定
Kustomize 是 Kubernetes 原生的組態管理工具,能讓我們在不修改原始 YAML 檔案的情況下,對應用程式設定進行客製化。當 Argo CD 偵測到佈署目錄中有 kustomization.yaml
檔案時,會自動使用 Kustomize 進行資源處理。
佈署 Kustomize 應用
讓我們來看一個實際案例,使用 Argo CD 佈署一個透過 Kustomize 管理的應用程式:
首先,我們需要建立一個 Application 資源檔案來定義應用程式佈署:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: bgdk-app
namespace: argocd
spec:
destination:
namespace: bgdk
server: https://kubernetes.default.svc
project: default
source:
path: ch07/bgdk/bgdk
repoURL: https://github.com/gitops-cookbook/gitops-cookbook-sc.git
targetRevision: main
syncPolicy:
automated: {}
這個 Argo CD Application 資源定義了一個名為 bgdk-app
的應用程式:
metadata
部分指定了應用程式的名稱和名稱空間spec.destination
指定佈署目標為本地 Kubernetes 叢集的bgdk
名稱空間spec.source
定義了來源設定,指向 GitHub 儲存函式庫特定路徑,Argo CD 會自動偵測此路徑下的kustomization.yaml
檔案syncPolicy.automated
啟用了自動同步功能,當 Git 儲存函式庫設定變更時,Argo CD 將自動更新佈署
將此設定應用到叢集後,可以執行以下命令:
kubectl apply -f bgdk/bgdk-app.yaml
佈署完成後,你會發現應用程式中的圓圈從原本的藍色變成了黃色,這正是 Kustomize 設定所定義的變化。若要移除應用程式,可以使用以下命令:
argocd app delete bgdk-app
覆寫 Argo CD 工具偵測機制
在某些情況下,我們可能需要明確指定要使用的工具,而不依賴 Argo CD 的自動偵測演算法。例如,即使存在 kustomization.yaml
檔案,我們也可以強制使用純目錄策略:
source:
directory:
recurse: true
Argo CD 支援多種佈署策略,包括:
- directory
- chart
- helm
- kustomize
- path
- plugin
值得注意的是,在 Argo CD 中使用 Kustomize 時,所有 Kustomize 的功能都能正常運作,這使得組態管理變得更加靈活。
Helm 整合:強大的包管理能力
Helm 是 Kubernetes 生態系統中廣泛使用的包管理工具,提供了範本化、版本控制和相依性管理等功能。Argo CD 能夠整合 Helm,當它在佈署目錄中偵測到 圖表.yaml
檔案時,會自動以 Helm 方式佈署應用程式。
佈署 Helm 應用
讓我們使用 Helm 佈署相同的 BGD 應用程式:
在 GitHub 儲存函式庫已經準備好了一個標準的 Helm 專案結構:
├── 圖表.yaml
├── charts
├── templates
│ ├── NOTES.txt
│ ├── _helpers.tpl
│ ├── deployment.yaml
│ ├── ns.yaml
│ ├── service.yaml
│ ├── serviceaccount.yaml
│ └── tests
│ └── test-connection.yaml
└── values.yaml
接著,我們建立 Application 資源來定義 Argo CD 佈署:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: bgdh-app
namespace: argocd
spec:
destination:
namespace: bgdh
server: https://kubernetes.default.svc
project: default
source:
path: ch07/bgdh
repoURL: https://github.com/gitops-cookbook/gitops-cookbook-sc.git
targetRevision: main
syncPolicy:
automated: {}
這個 Application 資源與前面的 Kustomize 範例類別似,主要差別在於:
- 應用程式名稱為
bgdh-app
- 佈署名稱空間為
bgdh
- 來源路徑指向 Helm 圖表 所在位置
將此設定應用到叢集:
kubectl apply -f bgdh/bgdh-app.yaml
驗證 Pod 是否在 bgdh
名稱空間中執行:
kubectl get pods -n bgdh
NAME READY STATUS RESTARTS AGE
bgdh-app-556c46fcd6-ctfkf 1/1 Running 0 5m43s
Helm 環境變數與引數覆寫
Argo CD 在處理 Helm 清單時,會自動填入一系列環境變數,這些變數也適用於 Kustomize、Jsonnet 和自定義工具:
- ARGOCD_APP_NAME
- ARGOCD_APP_NAMESPACE
- ARGOCD_APP_REVISION
- ARGOCD_APP_SOURCE_PATH
- ARGOCD_APP_SOURCE_REPO_URL
- ARGOCD_APP_SOURCE_TARGET_REVISION
- KUBE_VERSION
- KUBE_API_VERSIONS
我們可以在 Application 定義中使用這些環境變數:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: bgdh-app
namespace: openshift-gitops
spec:
destination:
# ...省略
source:
path: ch07/bgd
# ...省略
helm:
parameters:
- name: app
value: $ARGOCD_APP_NAME
在這個範例中:
- 我們在
source
部分增加了helm
設定區塊 - 透過
parameters
設定 Helm 引數,優先順序高於values.yaml
中的設定 - 使用
$ARGOCD_APP_NAME
環境變數作為引數值,這將被替換為應用程式的實際名稱
Argo CD 也支援使用不同的 values.yaml
檔案或直接設定引數覆寫原有的值:
argocd app set bgdh-app --values new-values.yaml
argocd app set bgdh-app -p service.type=LoadBalancer
注意,自定義的 values 檔案必須與 Helm 圖表 位於同一個 Git 儲存函式庫此外,Argo CD 也支援 Helm hooks,這讓佈署流程更加靈活。
Image Updater:自動化容器映像更新
在持續交付過程中,最常見的重複性任務之一就是佈署新版本的容器映像。在純 Argo CD 的解決方案中,當新的容器映像發布到容器倉函式庫我們需要手動更新 Kubernetes/Kustomize/Helm 清單檔案,並將變更推播到 Git 儲存函式庫個過程通常包括:
- 複製儲存函式庫. 解析 YAML 檔案並進行相應更新
- 提交並推播變更
雖然這種方法可行,但過程繁瑣與重複性高。理想情況下,叢集應能自動偵測到容器倉函式庫新映像並更新佈署。這正是 Argo CD Image Updater (簡稱 ArgoCD IU) 的功能 — 它是一個 Kubernetes 控制器,能監控容器映像的新版本並自動更新 Argo CD Application 中定義的資源。
Argo CD Image Updater 工作流程
Argo CD IU 與 Argo CD 協同工作的流程如下:
- 容器映像被推播到容器倉函式庫. Argo CD IU 偵測到新映像
- Argo CD IU 更新資源清單(可透過 Git 或 Argo CD API)
- Argo CD 偵測到 Git 儲存函式庫或直接收更新
- Argo CD 佈署新版本的應用程式
目前,Argo CD IU 僅支援更新 Kustomize 或 Helm 資源清單。對於 Helm,它需要能夠透過引數(如 image.tag
)指定映像標籤。
安裝 Argo CD Image Updater
讓我們在 Argo CD 所在的名稱空間中安裝控制器:
kubectl apply -f \
https://raw.githubusercontent.com/argoproj-labs/argocd-imageupdater/v0.12.0/manifests/install.yaml -n argocd
驗證安裝是否成功:
kubectl get pods -n argocd
NAME READY STATUS RESTARTS AGE
argocd-image-updater-59c45cbc5c-kjjtp 1/1 Running 0 40h
設定 Git 認證
在使用 Argo CD IU 之前,我們需要建立一個 Kubernetes Secret 來儲存 Git 認證,以便更新的資源清單能夠推播到儲存函式庫
kubectl -n argocd create secret generic git-creds \
--from-literal=username=<git_user> \
--from-literal=password=<git_password_or_token>
建立映像更新自動化應用
接下來,我們使用特殊註解來標記 Application 資源,使控制器開始監控容器倉函式庫
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: bgdk-app
namespace: argocd
annotations:
argocd-image-updater.argoproj.io/image-list: myalias=quay.io/rhdevelopers/bgd
argocd-image-updater.argoproj.io/write-back-method: git:secret:openshift-gitops/git-creds
argocd-image-updater.argoproj.io/git-branch: main
spec:
destination:
namespace: bgdk
server: https://kubernetes.default.svc
project: default
source:
path: ch07/bgdui/bgdk
repoURL: https://github.com/gitops-cookbook/gitops-cookbook-sc.git
targetRevision: main
syncPolicy:
automated: {}
在這個範例中,我們增加了三個重要的註解:
image-list
:指定要監控的映像,格式為<別名>=<映像路徑>
write-back-method
:指定更新傳播方法,這裡使用 Git 方法並指定認證位置 (<名稱空間>/<金鑰名稱>
)git-branch
:指定要推播變更的分支
將此設定應用到叢集:
kubectl apply -f bgdui/bgdui-app.yaml
此時,版本 1.0.0 的應用程式已在 bgdk
名稱空間中執行,並且 Argo CD IU 已準備好監控容器倉函式庫更。
測試自動更新功能
為了測試自動更新功能,我們可以為容器映像增加一個新標籤 (如 1.1.0),模擬發布新版本。當 Argo CD IU 偵測到新映像時,它將:
- 更新 Git 儲存函式庫資源清單
- Argo CD 偵測到變更並佈署新版本
- 應用程式自動更新到最新版本
這個流程完全自動化,無需人工干預,大提高了持續佈署的效率。