深入理解Argo CD工作原理

chester·chen發表於2024-09-09

1. ArgoCD 的架構

ArgoCD 是一個 Kubernetes 原生的持續交付工具,它透過監控 Git 倉庫中的應用定義來自動部署應用到 Kubernetes 叢集。其核心架構由以下幾個關鍵元件構成:

  • API Server: ArgoCD 的 API 入口,提供了外部介面以便使用者或外部工具與 ArgoCD 進行互動。API Server 同時也是 Web UI 的後臺服務。

  • Repository Server: 負責與 Git 倉庫互動。它從倉庫中拉取應用定義,並將這些定義轉化為 Kubernetes 清單檔案。Repository Server 會快取從 Git 倉庫中獲取的檔案,以加快後續的操作。

  • Controller: 核心控制器,持續監控 Kubernetes 叢集的當前狀態與期望狀態(定義在 Git 倉庫中)之間的差異。Controller 負責將叢集的狀態與 Git 中的期望狀態保持一致。

  • Application Controller: 負責處理使用者定義的 ArgoCD Application 資源。它會檢查 Git 倉庫中的定義,並確保這些定義與 Kubernetes 叢集中的應用狀態保持同步。

  • Redis Server: 用於快取資料和提升系統效能,尤其在處理大量應用和頻繁同步操作時顯得尤為重要。

  • Web UI: 提供了一個友好的圖形化介面,使用者可以透過 Web UI 檢視應用狀態、同步狀態以及進行手動操作。

2. ArgoCD 的工作原理

ArgoCD 的核心理念是 GitOps,即以 Git 倉庫作為單一的真理源,透過自動化的方式將倉庫中的應用配置同步到 Kubernetes 叢集中。

  1. 定義應用: 使用者在 Git 倉庫中定義應用的 Kubernetes 資源清單,並將這些清單檔案提交到 Git 倉庫。

  2. 建立 ArgoCD Application: 在 ArgoCD 中建立一個 Application 資源,該資源描述了應用在 Git 倉庫中的位置,以及在 Kubernetes 叢集中部署的位置。

  3. 同步狀態監控: ArgoCD Controller 持續監控 Git 倉庫中的配置,並與當前叢集狀態進行對比。每次檢測到 Git 倉庫中的應用配置發生變化時,Controller 會自動更新叢集中的資源,保持與 Git 倉庫的一致性。

  4. 自動同步與手動同步: ArgoCD 支援自動同步和手動同步。自動同步模式下,一旦檢測到 Git 倉庫有變化,ArgoCD 會自動更新 Kubernetes 叢集中的資源。而在手動同步模式下,使用者需要手動觸發同步操作。

  5. 回滾功能: 如果應用更新導致問題,ArgoCD 提供了回滾功能,使用者可以輕鬆恢復到先前的狀態。

3. ArgoCD 自動拉取更新的機制

ArgoCD 透過持續監控 Git 倉庫的變更來實現自動拉取和更新機制。其背後工作原理如下:

  1. 定時輪詢: ArgoCD Controller 會定期輪詢指定的 Git 倉庫,以檢查是否有新的提交。預設情況下,這個輪詢週期是每 3 分鐘一次。

  2. Webhook 觸發: 為了更快地響應更新,ArgoCD 支援透過 Git 倉庫的 Webhook 來觸發同步操作。當倉庫中發生提交或合併請求時,GitLab、GitHub 等平臺可以透過 Webhook 通知 ArgoCD 立即進行同步。

  3. 狀態對比: 每次拉取到最新的 Git 倉庫狀態後,ArgoCD 會與當前叢集中的應用狀態進行對比。如果發現差異,ArgoCD 會自動執行同步操作,確保叢集與 Git 倉庫的配置一致。

4. 如何與 GitLab 整合

ArgoCD 可以無縫整合 GitLab,透過 Webhook 和 CI/CD 流水線實現自動化部署。以下是整合步驟:

1. 配置 GitLab 專案

在 GitLab 中建立或選擇一個專案,確保專案中包含 Kubernetes 資源清單檔案,並將這些檔案儲存在倉庫的一個目錄中,例如 manifests/

2. 配置 ArgoCD Application

在 ArgoCD 中建立一個 Application 資源,指向 GitLab 倉庫,並設定好相關的路徑和目標叢集。例如:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: my-app
  namespace: argocd
spec:
  project: default
  source:
    repoURL: 'https://gitlab.com/your-username/your-repo.git'
    path: 'manifests'
    targetRevision: HEAD
  destination:
    server: 'https://kubernetes.default.svc'
    namespace: my-namespace
  syncPolicy:
    automated:
      prune: true
      selfHeal: true

3. 配置 GitLab Webhook

進入 GitLab 專案的 Settings -> Webhooks,新增一個新的 Webhook,URL 填寫 ArgoCD 的 Webhook 地址,通常為 https://argocd.example.com/api/webhook,選擇 Push eventsMerge request events 觸發器。

4. 驗證整合

每當 GitLab 倉庫中有新的提交或合併請求時,ArgoCD 會收到 Webhook 通知,並立即觸發同步操作。您可以透過 ArgoCD 的 Web UI 檢視同步進度和結果。

5. 示例程式碼

以下是一個完整的 ArgoCD Application 配置示例,與 GitLab 整合並自動同步:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: demo-app
  namespace: argocd
spec:
  project: default
  source:
    repoURL: 'https://gitlab.com/your-username/demo-app.git'
    path: 'k8s-manifests'
    targetRevision: HEAD
  destination:
    server: 'https://kubernetes.default.svc'
    namespace: demo
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
  webhook:
    gitlab:
      - url: https://argocd.example.com/api/webhook
        secret: your-webhook-secret

在上述配置中,syncPolicy 中的 automated 引數啟用了自動同步和自動修復功能,這意味著 ArgoCD 會自動拉取 GitLab 中的最新配置,並將其應用到 Kubernetes 叢集中。


透過上述內容,您應該已經瞭解了 ArgoCD 的架構、工作原理、自動拉取更新的機制,以及如何將其與 GitLab 整合。ArgoCD 強大的自動化和 GitOps 能力,讓您的應用部署更加高效和可靠。

相關文章