昨天我們已經將 ArgoCD 需要讀取的 Repo、以及需要管理的 cluster 註冊完畢。今天開始,我們會深入介紹我們昨天提過的架構圖,並且要讓 Argo CD 真正發揮 GitOps 的威力:透過 Application 與 App-of-Apps Pattern 來一次管理多個應用。
在我們的架構裡,會有一個 central cluster 部署 ArgoCD,並且透過它來把 manifest 部署到多個 project cluster 中。Central Argo CD 從 GitLab 拉取設定,再透過 Application 的 destination 欄位、把資源套用到各個 project cluster。這樣做的好處主要是,Central 只持有到各叢集 API 的最小權限,讓每個專案的機密資訊留在該專案所屬的帳號裡,達到安全性的隔離。
在 Argo CD 的世界裡,Application 是部署的最小單位。它描述了:
只要寫好一個 Application manifest,Argo CD 就會幫你自動化這個部署。最小化的範例 YAML 長這樣:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: nginx
namespace: argocd
spec:
project: default # 實務上會用自訂的 Project 來加強隔離,而不是直接用 default
source:
repoURL: https://charts.bitnami.com/bitnami ### git repo 在哪?
chart: nginx ### 部署哪張 chart?
targetRevision: 15.10.2
helm:
values: |
replicaCount: 2
destination:
server: https://kubernetes.default.svc ### 部署在哪個 cluster
namespace: demo ### 部署在哪個 namespace
如果平台上只有一兩個應用,直接寫 Application YAML 就很足夠。但實務上,我們面對的是大量應用,不只是一兩個,而是十幾甚至數十個應用需要同步;這時候就必須用到 App-of-Apps Pattern。
它的核心概念是:
這種模式的好處:
在我們的架構裡,App-of-Apps 不是直接放一堆裸裝 Application YAML,而是進一步用 Helm Chart 來管理。
我們有一個專門的 Root Helm Chart,裡面 templates/
下的每一個檔案,都是一個 Application manifest。
dev-backstage.yaml
、testing-worker.yaml
都是一個 Application;values/
下的對應檔案,注入各自的設定。這樣一來,我們就可以用同一個 Base Chart,產生出許多不同應用的 Application。
所有子 Application 的 source
都會指向同一個 chart,也就是 general-http。
這個 chart 定義了 Deployment、Service、Ingress、Secret、Keda Scaler 等常見元件。
最後,每個 Application manifest 裡的 helm.valueFiles
,都會指定對應的 values 檔案,讓它套用 child chart。
換句話說:
可以看到 worker application 的 yaml 中,有指定一些 ArgoCD Image Updater 的 annotation。這邊的細節會留到後續講 CI/CD 時再進一步做介紹哦 O.<
今天我們介紹了:
今天我們解決了單一環境中,有可能要部署多個 applications 的管理問題。不過,要是 同一個應用需要同時部署在多個 cluster,那就是另一個挑戰了。這部分就不是 App-of-Apps 的重點,而會交給 ApplicationSet 來解決。這就是我們明天要探討的主題。