為什麼我選擇 Argo CD 作為 Kubernetes CD 工具?
在之前聊 GitOps 概念的時候,我提過聲明式管理與 Git 作為唯一真實來源的理念。這篇文章我想深入聊聊我在實務上拿來落地 GitOps 的工具——Argo CD,一個專為 Kubernetes 設計的持續交付(CD)平台。
Argo CD 本質上是一個 Kubernetes Controller,它會持續監控你在 Git 倉庫中宣告的「期望狀態」,並與叢集裡實際跑著的狀態做比對。一旦發現兩者不一致,就會自動(或提醒你手動)把實際狀態拉回期望狀態。它支援多種配置管理工具,包含 Kustomize、Helm、Jsonnet 等,而且自帶一個直覺好用的 Web UI。
傳統 Push 模式 CD 的痛點
大部分團隊在 CI/CD Pipeline 裡用的都是 Push 模式——CI 跑完之後執行 kubectl apply 或 helm install 把應用推上叢集。這種做法看起來直觀,但用久了會發現幾個問題:
| 問題面向 | 說明 |
|---|---|
| 額外工具依賴 | CI 環境需安裝 kubectl、helm 等 CLI,增加維護成本 |
| 權限暴露 | CI Server 需要直接存取 K8s API,等於把 kubeconfig 散佈在外部系統 |
| 雲端授權複雜 | 多雲或多叢集環境下,每個 CI Job 都要處理不同的認證方式 |
| 無法感知實際狀態 | 部署完就斷線了,不知道 Pod 是否真的啟動成功,也沒辦法偵測人為 drift |
Argo CD 的 Pull 模式如何解決這些問題
Argo CD 採用 Pull 模式——它直接部署在 K8s 叢集裡,週期性地拉取 Git 倉庫中的配置清單,然後與叢集實際狀態比對。不管是 CI Pipeline 更新了 image tag,還是 DevOps 工程師手動改了 YAML,Argo CD 都會自動偵測並同步。
這帶來的好處是 CI 和 CD 完全解耦:CI Pipeline 只需要負責測試、建置映像檔和推送到 Registry,不需要碰 K8s 叢集。CD 則由 Argo CD 全權處理。
我認為 Argo CD 最有價值的幾個特性
Git 作為唯一真實來源
所有 K8s 資源宣告都存在 Git 裡,更新應用只需要 push commit 或合併 PR。Argo CD 不只監控 Git 的變更,也會持續比對叢集實際狀態。就算有人偷偷改了副本數或環境變數,Argo CD 一樣會自動恢復到 Git 裡宣告的狀態——這在多人協作環境裡非常有安全感。
如果需要臨時調試,也可以設定 Argo CD 不自動覆寫手動修改,改為發送告警提醒。
快速回滾
出問題時只要把 Git 倉庫 revert 到上一個可用的 commit,Argo CD 就會自動同步。如果你管理多個叢集共用同一個 Git Repo,這個優勢更明顯——不需要逐一在不同叢集執行 kubectl rollout undo 或 helm rollback。
叢集災難復原
假設某個叢集炸了短期無法修復,你只需要建一個新叢集、把 Argo CD 接上同一個 Git Repo,整個叢集狀態就能自動還原,完全不需要人工介入。
透過 Git 實現存取控制
傳統做法是在 K8s 裡設定複雜的 RBAC,但有了 Argo CD,大部分人只需要有 Git Repo 的存取權限就好。所有人都可以提交 PR,但只有 Senior 可以 merge。CI 工具也不再需要 K8s 的存取憑證,安全邊界更清楚。
深度整合 Kubernetes
Argo CD 利用 K8s 自身的 Controller 機制和 Etcd 來追蹤資源狀態,所以可以在 UI 上即時看到 Pod 的建立進度、健康狀態、是否需要回滾等資訊。這是傳統 CI/CD 工具做不到的。

ArgoCD UI 中的 Resource Tree,可以即時看到每個資源的同步與健康狀態。
Argo CD 架構簡介
Argo CD 主要由三個元件組成,分別對應三個工作階段:
| 元件 | 階段 | 職責 |
|---|---|---|
| Repository Server | 檢索(Retrieve) | 從 Git 倉庫 clone 配置清單並快取到本地,支援原生 YAML、Helm Chart、Kustomize |
| Application Controller | 調諧(Reconcile) | 比對 Git 期望狀態與叢集實際狀態,偵測到 OutOfSync 時執行修正 |
| API Server | 呈現(Present) | 提供 gRPC/REST API 與 Web UI,展示同步結果、管理應用、處理 Webhook |
部署方式
Argo CD 提供幾種部署模式:
| 模式 | 適用場景 | 特點 |
|---|---|---|
| 多租戶(標準) | 多團隊共用 | 完整 UI + CLI,支援 RBAC,有 HA 與非 HA 版本 |
| 多租戶(Namespace) | 只部署到外部叢集 | 只需 namespace 權限,可為每個團隊獨立部署 |
| Core | 精簡部署 | 不含 API Server 和 UI,需要 kubectl 存取權限 |
安裝很簡單,兩行指令就搞定:
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
也可以用 Kustomize 或 Helm 來部署。Helm Chart 由社群維護,倉庫在 argoproj/argo-helm。
部署完畢後用 port-forward 存取 UI:
kubectl port-forward svc/argocd-server -n argocd 8080:443
初始密碼取得方式:
kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d; echo

應用同步完成後,狀態徽章會顯示 Healthy + Synced。
核心概念:Application 與 Project
Application
Application 是 Argo CD 最基本的單位,定義了:
- Source:Git 倉庫中配置清單的位置(支援原生 YAML、Helm、Kustomize)
- Destination:目標 K8s 叢集的 API Server URL 與 namespace
一個 Application 配置範例:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: myapp-argo-application
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/your-org/your-repo.git
targetRevision: HEAD
path: deploy/dev
destination:
server: https://kubernetes.default.svc
namespace: myapp
syncPolicy:
syncOptions:
- CreateNamespace=true
automated:
selfHeal: true
prune: true
幾個重要參數:
| 參數 | 說明 |
|---|---|
syncPolicy.automated.selfHeal |
叢集實際狀態偏離期望時,自動修正 |
syncPolicy.automated.prune |
Git 中移除的資源也會從叢集中刪除 |
syncOptions.CreateNamespace |
目標 namespace 不存在時自動建立 |
Argo CD 預設每 3 分鐘輪詢 Git 倉庫一次,也可以設定 Webhook 即時觸發同步。
Project
當團隊數量多、應用數量大的時候,可以用 Project 來分組管理 Application,實現多租戶隔離。Project 還提供更細粒度的存取控制:
- 限制可信任的 Git 倉庫來源
- 限制目標部署叢集和 namespace
- 限制可部署的資源類型(如 RBAC、CRD、DaemonSet)
- 定義 Project 專屬的角色與 RBAC
實際操作 Demo
簡單走一遍流程:
- 在 GitHub 建一個 Repo,裡面放
dev/deployment.yaml和dev/service.yaml - 在 Repo 根目錄放上面那個
application.yaml - 執行
kubectl apply -f application.yaml建立 Application - 打開 Argo CD UI,就能看到應用已經自動同步並部署到叢集中
- 修改
deployment.yaml的 image tag 並 push,Argo CD 會自動偵測並更新叢集中的 Deployment
整個流程不需要在 CI 端碰 kubectl,也不需要手動部署,Git push 就是你的部署按鈕。
小結
用了 Argo CD 一段時間,我覺得它最大的價值在於讓 CD 變得可預期、可追蹤、可回滾。Git 就是唯一的真實來源,所有變更都有記錄,出問題可以秒回。下一篇我會繼續分享 Argo CD 搭配 Helm 和 Kustomize 的進階使用方式。

發佈留言