本文基於Argo CD的Progressive Syncs分階段同步功能,結合ApplicationSet的多環境Resource Orchestration Service能力,構建了一套支援開發與預發布環境間多應用依賴管理的自動化部署體系。
背景資訊
Web應用通常由前端(Frontend)、後端(Backend)和資料庫(Database)三部分組成。您在部署時,會希望按以下順序來部署:Database > Backend > Frontend,來保證其依賴性。當您使用ACK One GitOps來部署該類應用時,Database/Backend/Frontend每一部分對應一個Argo CD Applicaiton,則需要考慮處理多個Application之間的部署依賴問題。
ApplicationSet用於簡化多叢集應用編排,可以基於單一應用編排並根據編排內容自動產生一個或多個Application,所以通常使用ApplicationSet來管理您的應用的多叢集或多環境部署(dev/staging/prod)。
同時滿足應用間依賴管理和多環境部署的需求較為複雜。為此,本文將介紹一種ApplicationSet的進階用法,旨在實現對應用間依賴和多環境部署的統一管理。工作原理如下:
通過Matrix Generator定義產生多環境部署(dev/staging)的Application,並給Application添加應用程式名稱標識的Label。
在
rollingSync中定義有依賴關係的應用的建立順序(例如先部署app1,再部署app2)。
配置完成後,將按照定義的dev-app1>dev-app2>staging-app1>staging-app2順序進行部署,如下圖所示:
Progressive Syncs
Argo CD的Progreessive Syncs功能可以通過ApplicationSet實現智能部署編排。該功能根據ApplicationSet所管理的Application的依賴關係和健康狀態,控制Application的建立和更新順序。您可以定義steps列表,Progressive Syncs會持續監控每個階段中Application的健康狀態,當Application達到Healthy狀態後,才會觸發下一階段的操作。
DaemonSet、StatefulSet和Argo Rollout均受Progressive Syncs功能支援,因為Application在 Pod 部署過程中會進入Progressing狀態。實際上,任何具有健全狀態檢查並能夠報告Progressing狀態的資源都受Progressive Syncs功能支援。
應用樣本目錄結構
本樣本包含app1和app2兩個應用,app2需要依賴app1,並且兩個應用都需要部署到dev和staging環境,樣本目錄結構如下所示:
manifests
└── apps
├── env
│ ├── dev
│ │ └── config.json
│ └── staging
│ └── config.json
├── app1
│ ├── base
│ │ ├── deployment.yaml
│ │ ├── kustomization.yaml
│ │ └── service.yaml
│ └── overlay
│ ├── dev
│ │ └── bj
│ │ ├── deployment.yaml
│ │ └── kustomization.yaml
│ └── staging
│ └── bj
│ ├── deployment.yaml
│ └── kustomization.yaml
└── app2
├── base
│ ├── deployment.yaml
│ ├── kustomization.yaml
│ └── service.yaml
└── overlay
├── dev
│ └── bj
│ ├── deployment.yaml
│ └── kustomization.yaml
└── staging
└── bj
├── deployment.yaml
└── kustomization.yamlmanifests/apps/env:請根據具體環境做自訂配置。重要若您使用本樣本進行部署,需要將樣本Fork到您自己的倉庫,並需修改
config.json中cluster_address為您關聯集群的API Server端點。manifests/apps/app1:使用kustomize管理的應用1,每類型環境中可能包含多個地區(樣本僅展示一個bj)。manifests/apps/app2:使用kustomize管理的應用2,每類型環境中可能包含多個地區。
前提條件
步驟一:開啟Progressive Syncs功能
當前ACK One GitOps僅在高可用模式支援開啟Progressive Syncs,開啟步驟如下。
使用艦隊kubeconfig,執行以下命令修改配置。
kubectl edit cm -nargocd argocd-cmd-params-cm在
argocd-cmd-params-cm添加配置applicationsetcontroller.enable.progressive.syncs: "true",如下所示。apiVersion: v1 data: applicationsetcontroller.enable.progressive.syncs: "true" ... kind: ConfigMap metadata: name: argocd-cmd-params-cm namespace: argocd ...執行如下命令,重啟argocd-application-controller pod。
kubectl rollout restart deployment argocd-application-controller -n argocd
步驟二:在艦隊中建立管理應用間依賴和多環境部署的ApplicationSet
登入ACK One控制台,在左側導覽列選擇。
單擊進入建立多叢集應用 - GitOps頁面,單擊YAML 建立,使用以下樣本建立應用。
apiVersion: argoproj.io/v1alpha1 kind: ApplicationSet metadata: name: dependency-apps namespace: argocd spec: goTemplate: true goTemplateOptions: ["missingkey=error"] generators: - matrix: generators: - git: repoURL: https://github.com/AliyunContainerService/gitops-demo.git revision: main pathParamPrefix: env files: - path: "manifests/apps/env/*/config.json" - git: repoURL: https://github.com/AliyunContainerService/gitops-demo.git revision: main pathParamPrefix: target directories: - path: "manifests/apps/app1/overlay/{{.env.path.basename}}/*" - matrix: generators: - git: repoURL: https://github.com/AliyunContainerService/gitops-demo.git revision: HEAD pathParamPrefix: env files: - path: "manifests/apps/env/*/config.json" - git: repoURL: https://github.com/AliyunContainerService/gitops-demo.git revision: HEAD pathParamPrefix: target directories: - path: "manifests/apps/app2/overlay/{{.env.path.basename}}/*" strategy: type: RollingSync rollingSync: steps: - matchExpressions: - key: app.kubernetes.io/instance operator: In values: - app1 - key: environment operator: In values: - dev - matchExpressions: - key: app.kubernetes.io/instance operator: In values: - app2 - key: environment operator: In values: - dev - matchExpressions: - key: app.kubernetes.io/instance operator: In values: - app1 - key: environment operator: In values: - staging - matchExpressions: - key: app.kubernetes.io/instance operator: In values: - app2 - key: environment operator: In values: - staging template: metadata: name: '{{.env.path.basename}}-{{index .target.path.segments 2}}-{{.target.path.basename}}' labels: app.kubernetes.io/instance: '{{index .target.path.segments 2}}' environment: '{{.env.path.basename}}' spec: project: default source: repoURL: https://github.com/AliyunContainerService/gitops-demo.git targetRevision: HEAD path: '{{.target.path.path}}' destination: #server: https://kubernetes.default.svc server: '{{index .cluster_address .target.path.basename}}' namespace: demo syncPolicy: automated: prune: true selfHeal: true retry: limit: 5 backoff: duration: 5s maxDuration: 3m0s factor: 2 syncOptions: - CreateNamespace=true本例使用Matrix Generator來管理應用部署到多環境,使用Progressive Syncs的RollingSync來實現應用間的依賴。本例中,該ApplicationSet會產生四個Application。
Progressive Syncs的
rollingSync.steps中,匹配的Label是ArgoCD Application的Label,因此需要在.spec.template.metadata.labels中明確產生的Label。Matrix Generator組合了兩個Git Generator,以下是Git Generator提供的變數。
參數
說明
本文樣本值
{{.path.basename}}設定檔所在目錄的路徑的基礎名稱。
dev
staging
{{.target.path.path}}Git 倉庫中包含匹配設定檔的目錄路徑。
manifests/apps/app2/overlay/dev/bjmanifests/apps/app2/overlay/staging/bj
{{index .path.segments n}}Git 倉庫中匹配設定檔的路徑,拆分為數組元素(n - array index)。
app1
app2
說明若您指定了
pathParamPrefix,若需引用{{.path.basename}}等變數,則需要添加首碼路徑以訪問變數。例如原變數{{.path.basename}}需修改為{{.target.path.basename}},其中target為pathParamPrefix的值。
為保障生產環境的安全性,建議您將生產環境和開發測試預發環境分為兩個不同的ApplicationSet。產生生產環境應用時,應選擇Manual Sync方式。
步驟三:查看應用部署依賴關係和發布狀態
由於每個應用需要發布到dev和staging兩個環境中,因此app1和app2各自需要產生兩個Application,共計四個應用執行個體。它們的部署順序將為dev-app1>dev-app2>staging-app1>staging-app2,每個應用需等待前一個應用同步成功且狀態健康後啟動。
通過控制台查看
登入ACK One控制台,在左側導覽列選擇。
找到目標多叢集應用,單擊查看對應Application。

應用將按照如下順序進行部署,預期輸出如下:
部署
dev-app1。
部署
dev-app2。
部署
staging-app1。
部署
staging-app2。
通過命令列查看
使用艦隊KubeConfig,執行如下命令查看應用狀態。
kubectl -nargocd get app應用將按照如下順序進行部署,預期輸出如下:
部署
dev-app1。NAME SYNC STATUS HEALTH STATUS dev-app1-bj Synced Progressing dev-app2-bj OutOfSync Missing staging-app1-bj OutOfSync Missing staging-app2-bj OutOfSync Missing部署
dev-app2。NAME SYNC STATUS HEALTH STATUS dev-app1-bj Synced Healthy dev-app2-bj Synced Progressing staging-app1-bj OutOfSync Missing staging-app2-bj OutOfSync Missing部署
staging-app1。NAME SYNC STATUS HEALTH STATUS dev-app1-bj Synced Healthy dev-app2-bj Synced Healthy staging-app1-bj Synced Progressing staging-app2-bj OutOfSync Missing部署
staging-app2。NAME SYNC STATUS HEALTH STATUS dev-app1-bj Synced Healthy dev-app2-bj Synced Healthy staging-app1-bj Synced Healthy staging-app2-bj Synced Progressing