昨天我們體驗透過 ArgoCD 來實踐 GitOps,利用 Git 來管理/部署 Kubernetes Resource。
今天讓我們更深入了解 ArgoCD 的架構 與 功能性。
圖檔來源:ArgoCD 官方網站
在上圖右側區塊中,包含 ArgoCD 最核心的 3 個組件:
applications.argoproj.io
、appprojects.argoproj.io
簡單來說,這三個組件各司其職:
Repository Server 負責收集 Git repo 中的 manifest 並轉為原生 YAML,讓 Application Controller 與 Git、YAML 管理工具解耦。
Application Controller 則專注在與 Kubernetes API 交互,來同步集群中的資源,確保 Kubernetes 中的應用與 Git 中的定義保持一致。
最後由 API Server 來補足視圖化、rollback.. 等維護操作等需求,提供完整的功能性給使用者。
ArgoCD 主要透過以下兩個 CRD 來管理 GitOps 流程的行為。
Application (applications.argoproj.io):定義一個 GitOps Application,描述從哪個 Git Repo 中取得 Kubernetes manifests,並如何部署到哪個 Kubernetes Cluster。
AppProject (appprojects.argoproj.io):管理多個 Application 的範疇及權限,通常能用來避免部署錯環境的問題。
來看看 CRD 的 範例
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: argocd-demo
namespace: argocd
spec:
destination:
server: https://kubernetes.default.svc
namespace: ithome
source:
repoURL: https://github.com/YihongGao/iThome_30Day_2024
path: resources/day19/argoCD-demo/apps/overlays/production
targetRevision: main
project: default
syncPolicy:
automated:
selfHeal: true
syncOptions:
- CreateNamespace=true
- ApplyOutOfSyncOnly=true
- PruneLast=true
source
:從哪個 Git repo 取得 manifest file
repoURL
:Git repo 的 URLpath
: manifest file 的路徑targetRevision
:git 的版本:branch、tagdestination
:要部署到哪個 Kubernetes cluster
server
:Kubernetes 的 api server URLnamespace
:部署到哪個 namespaceproject
:這個 Application 所屬的 AppProject,需滿足 source
與 destination
的配置需滿足 AppProject 中的條件syncPolicy
:
automated
:配當 Git Repo 發生變化且 Kubernetes 狀態不同步時,自動觸發同步操作,將 Git 配置部署到 Kubernetes。
selfHeal
:開啟此選項後,當 Kubernetes 資源與 Git Repo 不一致時,會自動同步以保持狀態一致。若未啟用,僅當 Git Repo 有變更時才會觸發同步。
📘 單獨使用
automated
,而未開啟selfHeal
時,只有 Git Repo 有異動時才會觸發部署。
ApplyOutOfSyncOnly
:僅同步狀態不一致的資源,適合管理大量資源的情況,能提升效能並減少對 Kubernetes API Server 的負擔。PruneLast
:若 Git Repo 中的資源被移除,則同步時會自動從 Kubernetes 中刪除該資源。未啟用時,預設不會自動刪除資源,以防止誤刪重要資源(如 PersistentVolume)。apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
name: demo
namespace: argocd
spec:
clusterResourceWhitelist:
- group: '*'
kind: '*'
destinations:
- name: '*'
namespace: '*'
server: https://kubernetes.default.svc
namespaceResourceWhitelist:
- group: '*'
kind: '*'
sourceRepos:
- https://github.com/YihongGao/iThome_30Day_2024
clusterResourceWhitelist
:定義哪些 Cluster level 的 Resource 能操作,例如 Namespace、PersistentVolume ..等等,若設為 *
代表不限制。
namespaceResourceWhitelist
:與 clusterResourceWhitelist
類似,但管理的是 Namespace level 的 Resource,如 Deployment、Service、Pod。
destinations
:允許此 Project 的 Application 能部署到哪個 Kubernetes Cluster 或 namespace。
sourceRepos
:允許此 Project 的 Application 能從哪個 Git Repo 取得 manifest。
如果讀者有完成 Day19 的操作,可以使用以下指令檢視昨天透過 UI 建立的 ArgoCD Application 以及預設的 AppProject:
kubectl get applications.argoproj.io,appprojects.argoproj.io -n argocd
NAME SYNC STATUS HEALTH STATUS
application.argoproj.io/argocd-demo Synced Healthy
NAME AGE
appproject.argoproj.io/default 2d7h
您可以透過 UI 介面編輯 Application 或直接操作 CRD 來調整配置。更進一步,您也可以將 ArgoCD 的 CRD 納入 ArgoCD Application 管理,這樣 ArgoCD 本身的配置變更也能透過 GitOps 進行管理與追蹤。
今天介紹了 ArgoCD 的架構 與 CRD,明天會介紹其他 ArgoCD 的進階/管理功能應用。