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 叢集中。
-
定義應用: 使用者在 Git 倉庫中定義應用的 Kubernetes 資源清單,並將這些清單檔案提交到 Git 倉庫。
-
建立 ArgoCD Application: 在 ArgoCD 中建立一個
Application
資源,該資源描述了應用在 Git 倉庫中的位置,以及在 Kubernetes 叢集中部署的位置。 -
同步狀態監控: ArgoCD Controller 持續監控 Git 倉庫中的配置,並與當前叢集狀態進行對比。每次檢測到 Git 倉庫中的應用配置發生變化時,Controller 會自動更新叢集中的資源,保持與 Git 倉庫的一致性。
-
自動同步與手動同步: ArgoCD 支援自動同步和手動同步。自動同步模式下,一旦檢測到 Git 倉庫有變化,ArgoCD 會自動更新 Kubernetes 叢集中的資源。而在手動同步模式下,使用者需要手動觸發同步操作。
-
回滾功能: 如果應用更新導致問題,ArgoCD 提供了回滾功能,使用者可以輕鬆恢復到先前的狀態。
3. ArgoCD 自動拉取更新的機制
ArgoCD 透過持續監控 Git 倉庫的變更來實現自動拉取和更新機制。其背後工作原理如下:
-
定時輪詢: ArgoCD Controller 會定期輪詢指定的 Git 倉庫,以檢查是否有新的提交。預設情況下,這個輪詢週期是每 3 分鐘一次。
-
Webhook 觸發: 為了更快地響應更新,ArgoCD 支援透過 Git 倉庫的 Webhook 來觸發同步操作。當倉庫中發生提交或合併請求時,GitLab、GitHub 等平臺可以透過 Webhook 通知 ArgoCD 立即進行同步。
-
狀態對比: 每次拉取到最新的 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 events
或 Merge 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 能力,讓您的應用部署更加高效和可靠。