← 返回上一頁
CI/CD Kubernetes

在 K8S 上使用 ArgoCD 和 Jenkins 實現端對端 GitOps 自動化

本頁目錄
Jenkins 與 ArgoCD 端對端 GitOps CI/CD 流水線架構圖

前言:為什麼需要 ArgoCD?

我先前寫了一系列關於在 Kubernetes 上使用 Jenkins 建構 CI/CD 管線的文章,涵蓋了 Django 和 Java Web 應用程式兩個藍圖專案。整條管線從開發者的本地電腦開始,經過 Pull Request 合併到主分支,流程都在 Jenkins 平台上清楚定義。不過說實話,這只完成了持續整合(CI)的部分。

至於持續交付/部署(CD),在那個系列裡基本上是半手動處理的——工作負載的 manifest(Pod、StatefulSet、Deployment 等)雖然在 Jenkins Pipeline 裡做了參數化,但最終還是靠 kubectl 從 Pipeline 裡觸發部署。這種做法被稱為「Push-based CD」,也就是由 CI/CD 工具主動把 manifest 推送到 K8S 叢集裡。

Jenkins 與 ArgoCD 端對端 GitOps CI/CD 流水線架構圖

Jenkins + ArgoCD 端對端 GitOps CI/CD 流水線架構

Push-based vs Pull-based CD

Push-based 最大的問題在於:你必須把 K8S 的憑證暴露給 CI/CD 工具,讓它有權限去修改叢集。這在安全性上是一個不小的風險。

另一種做法是「Pull-based CD」,由 ArgoCD(或其他 GitOps 工具)主動輪詢版本控制系統(VCS)來偵測變更,再自動同步到叢集。這樣 K8S 憑證就不需要外洩給任何外部工具了。

下面用表格整理兩種方式的比較:

比較項目 Push-based CD Pull-based CD(GitOps)
觸發方式 CI/CD 工具主動推送到 K8S ArgoCD 輪詢 VCS 或透過 Webhook 觸發
K8S 憑證暴露 必須提供給 CI/CD 工具 僅 ArgoCD 內部持有
版本控制 manifest 散落在 Pipeline 腳本中 Git 是唯一真相來源(Single Source of Truth)
擴展性 叢集和服務數量增加時管理困難 宣告式管理,適合大規模環境
回溯能力 需要額外實作 Git 歷史紀錄天然支援

為什麼要導入 ArgoCD?

說白了,這個系列要做的事就是用 ArgoCD 把 CD 階段自動化。你可能會問:之前的 Pipeline 不是跑得好好的嗎?兩個理由:

  1. 規模問題:如果你只管 2 個叢集、20 個應用,手動管 manifest 還行。但在微服務(甚至奈米服務)的時代,事情會快速膨脹。某家電商公司的 Grafana 儀表板顯示他們有超過 350 個 K8S 叢集和 14,000 個微服務。就算你的規模沒這麼誇張,純手動管理在企業環境裡也是不可接受的。
  2. 版本控制需求:原生 K8S 物件目前有 60 多種類型,乘以命名空間和叢集數量,任何企業裡都會達到數千規模。再加上你不是一個人在戰鬥——想像五個人在沒有版本控制的情況下管理這些物件,那畫面會有多混亂。

系列文章規劃

為了讓內容容易消化,這個系列分成三篇:

篇次 主題
第一篇 ArgoCD 使用場景論證 + K8S 上的安裝與設定
第二篇 Java 專案搭配 Jenkins 和 ArgoCD 在 K8S 上的部署實戰
第三篇 ArgoCD 整合 HashiCorp Vault 的秘密管理

注意:這系列不是從零開始的 step-by-step 教學,你需要具備 DevOps、Linux 容器、Kubernetes、Git、Jenkins 和 ArgoCD 的基礎知識。

安裝 ArgoCD

官方文件對安裝步驟描述得很清楚。Argo 提供四種安裝選項,依據高可用性(HA)和權限層級的不同組合:

安裝選項 HA 命名空間層級權限 適用場景
選項 A 大型企業(建議)
選項 B 中型環境 / 單叢集
選項 C 開發測試環境
選項 D 個人學習 / PoC

大型企業的最佳實踐是把 Argo 安裝在獨立的叢集中,並啟用 HA。原因很簡單——ArgoCD 是所有 CD 操作的中心,不能因為共同託管的應用故障而受到影響。同時也應該用命名空間層級的權限來遵循最小權限原則。

在我的環境中只有一個叢集,所以選擇了 HA + 非命名空間層級的安裝。安裝指令就是簡單的 kubectl apply

kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/ha/install.yaml

成功執行後,你會看到一長串元件清單,包含多個 StatefulSet 和 Deployment。建議花點時間看一下這些工作負載物件,更能理解整個系統的運作方式。

ArgoCD 架構概覽圖

ArgoCD 架構概覽

管理 ArgoCD:Web UI vs CLI

管理 ArgoCD 有兩種方式:Web UI 和 CLI。我個人覺得 Argo 的 Web UI 做得相當不錯,除了一些特殊需求之外,對日常管理來說已經綽綽有餘。

核心概念:Application 與 Project

Application

這是 ArgoCD 最基本的建構單元。每一個你要部署的東西,在 Argo 的視角都是一個 Application。安裝後它會建立一個同名的 Custom Resource Definition(CRD),你可以透過 Web UI、CLI 或直接操作 K8S 資源來管理。

Project

Project 的作用是把 Application 分組管理。每次安裝都會附帶一個 default Project,通常直接用就好。如果你有更細緻的權限需求——例如限制特定的 Source Repository 或 Target Cluster——可以建立額外的 Project。

GitOps 的核心心態:Single Source of Truth

導入 ArgoCD 後,最重要的觀念轉變是:Git 是 K8S 物件修改的唯一來源。換句話說,你必須停止直接用 kubectl 或其他工具來修改正在運行的應用程式。所有變更都要透過 Git commit 來完成。

Reconciliation Loop(協調循環)

那 ArgoCD 怎麼知道 Git 上有變更呢?如果 VCS 的變更和 K8S 的反映之間有明顯延遲,事情就會變得難以管理。這裡有兩個解決方案:

同步方式 機制 優缺點
Reconciliation Timeout argocd-cm ConfigMap 設定輪詢間隔 設定簡單,但即使設為 1 秒仍有延遲
Webhook VCS 平台(如 GitHub)在 commit 時主動通知 ArgoCD 即時觸發,更普遍的選擇

我個人選擇 GitHub Webhook。設定完成後,對特定分支的任何 commit 都會立即觸發 ArgoCD 進行同步,幾乎零延遲。

健康檢查機制

ArgoCD 對每個 K8S 物件都有預設的健康檢查邏輯,狀態包括:

狀態 說明
Healthy 物件正常運作
Progressing 正在變更中
Degraded 效能下降或部分異常
Missing 物件不存在
Unknown 無法判定狀態

但有些 K8S 物件的預設健康檢查並不完善。例如 Nginx Ingress 就和 Argo 的預設邏輯不相容,會錯誤觸發「不健康」狀態,導致誤報通知(想像半夜三點被 Slack 叫醒的痛苦)。

解決方案是用 Lua 腳本撰寫自訂健康檢查,然後加入 argocd-cm ConfigMap 中。以 Ingress 為例,你需要建立一個自訂腳本來正確回報其健康狀態。

小結

這篇文章涵蓋了 ArgoCD 的基本概念和安裝設定。重點回顧:

  • Push-based CD 有 K8S 憑證暴露的風險,Pull-based(GitOps)更安全
  • ArgoCD 的 Application 和 Project 是兩個核心資源
  • Git 必須是唯一的真相來源
  • Webhook 比 Reconciliation Timeout 更適合即時同步
  • 自訂健康檢查可避免誤報通知

下一篇我會實際展示 Java 專案如何透過 Jenkins + ArgoCD 完成端對端的 GitOps 部署。敬請期待!

分享這篇
X LinkedIn Facebook Hacker News Reddit

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料