すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:ApplicationSet を使用して複数環境デプロイとアプリケーション依存関係を調整する

最終更新日:May 31, 2025

このトピックでは、Argo CD の Progressive Syncs 機能と ApplicationSet の複数環境リソースオーケストレーション機能を組み合わせて、開発環境とステージング環境間のアプリケーション依存関係管理をサポートする自動デプロイシステムを構築する方法について説明します。

背景情報

Web アプリケーションは、フロントエンド、バックエンド、データベースの 3 つの部分で構成されています。デプロイ時には、データベース > バックエンド > フロントエンドの順序でデプロイして、適切な依存関係管理を確保する必要があります。 Distributed Cloud Container Platform for Kubernetes (ACK One) GitOps を使用してこのようなアプリケーションをデプロイする場合、各コンポーネント (データベース/バックエンド/フロントエンド) は Argo CD アプリケーションに対応します。複数のアプリケーション間のデプロイ依存関係を処理する必要があります。

ApplicationSet は、マルチクラスターアプリケーションのオーケストレーションを簡素化します。単一のアプリケーションオーケストレーションテンプレートに基づいて、1 つ以上のアプリケーションを自動的に生成します。 ApplicationSet は、アプリケーションのマルチクラスターまたは複数環境デプロイ (開発/ステージング/本番) の管理によく使用されます。

アプリケーション依存関係管理と複数環境デプロイの要件は複雑です。このトピックでは、アプリケーションの依存関係と複数環境デプロイメントの統合管理を目的とした ApplicationSet の高度な使用方法を紹介します。次のセクションでは、その仕組みについて説明します。

  1. Matrix Generator を使用して複数環境デプロイ (開発/ステージング) 用のアプリケーションを定義し、アプリケーションにラベルを追加して名前を識別します。

  2. rollingSync で依存関係を持つアプリケーションの作成順序を定義します。たとえば、最初に app1 をデプロイし、次に app2 をデプロイします。

構成後、デプロイは定義された順序で進行します。dev-app1>dev-app2>staging-app1>staging-app2。次の図を参照してください。

Progressive Syncs

Argo CD の Progressive Syncs 機能を使用すると、ApplicationSet を使用してインテリジェントなデプロイオーケストレーションを実現できます。この機能は、ApplicationSet によって管理されるアプリケーションの依存関係とヘルスステータスに基づいて、アプリケーションの作成と更新の順序を制御します。 steps リストを定義すると、Progressive Syncs は各フェーズのアプリケーションのヘルスステータスを継続的に監視します。アプリケーションのステータスが Healthy の場合にのみ、次のフェーズの操作がトリガーされます。

説明

Pod のデプロイ中にアプリケーションが Progressing ステータスになるため、DaemonSet、StatefulSet、および Argo Rollouts はすべて Progressive Syncs 機能でサポートされています。実際、Progressing ステータスを報告できるヘルスチェックを備えたリソースはすべて、Progressive Syncs 機能でサポートされています。

アプリケーションのディレクトリ構造

この には、app1app2 の 2 つのアプリケーションが含まれています。 app2app1 に依存し、両方のアプリケーションを 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.yaml
  • manifests/apps/env: 特定の環境に応じてこのパラメーターを構成します。

    重要

    この例をデプロイに使用する場合は、を自分のリポジトリにフォークし、config.jsoncluster_address を関連付けられているクラスターの API サーバーエンドポイントに変更する必要があります

  • manifests/apps/app1: kustomize によって管理されるアプリケーション 1。各環境タイプには複数のリージョンが含まれる場合があります (上記の例では 1 つだけ示しています: bj)。

  • manifests/apps/app2: kustomize によって管理されるアプリケーション 2。各環境タイプには複数のリージョンが含まれる場合があります。

前提条件

ステップ 1: Progressive Syncs 機能を有効にする

ACK One GitOps は、高可用性モードでのみ Progressive Syncs の有効化をサポートしています。有効にする手順は次のとおりです。

  1. フリート kubeconfig を使用して、次のコマンドを実行し、構成を変更します。

    kubectl edit cm -nargocd argocd-cmd-params-cm

    applicationsetcontroller.enable.progressive.syncs: "true" 構成を argocd-cmd-params-cm に追加します。

    apiVersion: v1
    data:
      applicationsetcontroller.enable.progressive.syncs: "true"
      ...
    kind: ConfigMap
    metadata:
      name: argocd-cmd-params-cm
      namespace: argocd
      ...
  2. 次のコマンドを実行して、argocd-application-controller ポッドを再起動します。

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

ステップ 2: アプリケーションの依存関係と複数環境デプロイを管理するために、フリートに 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 は 4 つのアプリケーションを生成します。

    • Progressive Syncs の rollingSync.steps パラメーターでは、一致するラベルは ArgoCD アプリケーションのラベルであるため、生成されたラベルを .spec.template.metadata.labels で指定する必要があります。

    • Matrix Generator は 2 つの Git ジェネレーターを組み合わせます。以下は、Git ジェネレーターによって提供される変数です。

      パラメーター

      説明

      {{.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 - 配列インデックス)。

      • app1

      • app2

      説明

      pathParamPrefix を指定した場合、{{.path.basename}} のような変数を参照するには、プレフィックスパスを追加して変数にアクセスする必要があります。たとえば、元の変数 {{.path.basename}}{{.target.path.basename}} に変更する必要があります。ここで、targetpathParamPrefix の値です。

重要

本番環境のセキュリティを確保するために、本番環境と開発/テスト/ステージング環境を 2 つの異なる ApplicationSet に分離することをお勧めします。本番環境アプリケーションを生成する場合は、手動同期方式を選択する必要があります。

ステップ 3: アプリケーションのデプロイ依存関係とリリースステータスを表示する

各アプリケーションは開発環境とステージング環境の両方にリリースする必要があるため、app1app2 はそれぞれ 2 つのアプリケーションを生成する必要があり、合計 4 つのアプリケーションインスタンスになります。デプロイ順序は dev-app1>dev-app2>staging-app1>staging-app2 となり、各アプリケーションは前のアプリケーションが正常に同期して正常な状態になるまで待機してから開始します。

コンソールを使用する

  1. ACK One コンソール にログインします。左側のナビゲーションウィンドウで、[フリート] > [マルチクラスターアプリケーション] を選択します。

  2. マルチクラスターアプリケーションを見つけ、[アプリケーション] 列の値を表示します。image

    アプリケーションは次の順序でデプロイされ、予想される出力は次のとおりです。

    1. dev-app1 をデプロイします。

      image

    2. dev-app2 をデプロイします。image

    3. staging-app1 をデプロイします。image

    4. staging-app2 をデプロイします。image

CLI を使用する

フリート 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