全部產品
Search
文件中心

Container Service for Kubernetes:使用ApplicationSet協調多環境部署與應用依賴關係

更新時間:May 26, 2025

本文基於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的進階用法,旨在實現對應用間依賴和多環境部署的統一管理。工作原理如下:

  1. 通過Matrix Generator定義產生多環境部署(dev/staging)的Application,並給Application添加應用程式名稱標識的Label。

  2. 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功能支援。

應用樣本目錄結構

樣本包含app1app2兩個應用,app2需要依賴app1,並且兩個應用都需要部署到devstaging環境,樣本目錄結構如下所示:

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.yaml
  • manifests/apps/env:請根據具體環境做自訂配置。

    重要

    若您使用本樣本進行部署,需要將樣本Fork到您自己的倉庫,並需修改config.jsoncluster_address為您關聯集群的API Server端點

  • manifests/apps/app1:使用kustomize管理的應用1,每類型環境中可能包含多個地區(樣本僅展示一個bj)。

  • manifests/apps/app2:使用kustomize管理的應用2,每類型環境中可能包含多個地區。

前提條件

步驟一:開啟Progressive Syncs功能

當前ACK One GitOps僅在高可用模式支援開啟Progressive Syncs,開啟步驟如下。

  1. 使用艦隊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
      ...
  2. 執行如下命令,重啟argocd-application-controller pod。

     kubectl rollout restart deployment argocd-application-controller -n argocd

步驟二:在艦隊中建立管理應用間依賴和多環境部署的ApplicationSet

  1. 登入ACK One控制台,在左側導覽列選擇艦隊 > 多叢集應用

  2. 單擊建立多叢集應用 > GitOps進入建立多叢集應用 - 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/bj

      • manifests/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兩個環境中,因此app1app2各自需要產生兩個Application,共計四個應用執行個體。它們的部署順序將為dev-app1>dev-app2>staging-app1>staging-app2,每個應用需等待前一個應用同步成功且狀態健康後啟動。

通過控制台查看

  1. 登入ACK One控制台,在左側導覽列選擇艦隊 > 多叢集應用

  2. 找到目標多叢集應用,單擊查看對應Applicationimage

    應用將按照如下順序進行部署,預期輸出如下:

    1. 部署dev-app1

      image

    2. 部署dev-app2image

    3. 部署staging-app1image

    4. 部署staging-app2image

通過命令列查看

使用艦隊KubeConfig,執行如下命令查看應用狀態。

 kubectl -nargocd get app

應用將按照如下順序進行部署,預期輸出如下:

  1. 部署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
  2. 部署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
  3. 部署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
  4. 部署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