このトピックでは、Argo CD の Progressive Syncs 機能と ApplicationSet の複数環境リソースオーケストレーション機能を組み合わせて、開発環境とステージング環境間のアプリケーション依存関係管理をサポートする自動デプロイシステムを構築する方法について説明します。
背景情報
Web アプリケーションは、フロントエンド、バックエンド、データベースの 3 つの部分で構成されています。デプロイ時には、データベース > バックエンド > フロントエンドの順序でデプロイして、適切な依存関係管理を確保する必要があります。 Distributed Cloud Container Platform for Kubernetes (ACK One) GitOps を使用してこのようなアプリケーションをデプロイする場合、各コンポーネント (データベース/バックエンド/フロントエンド) は Argo CD アプリケーションに対応します。複数のアプリケーション間のデプロイ依存関係を処理する必要があります。
ApplicationSet は、マルチクラスターアプリケーションのオーケストレーションを簡素化します。単一のアプリケーションオーケストレーションテンプレートに基づいて、1 つ以上のアプリケーションを自動的に生成します。 ApplicationSet は、アプリケーションのマルチクラスターまたは複数環境デプロイ (開発/ステージング/本番) の管理によく使用されます。
アプリケーション依存関係管理と複数環境デプロイの要件は複雑です。このトピックでは、アプリケーションの依存関係と複数環境デプロイメントの統合管理を目的とした ApplicationSet の高度な使用方法を紹介します。次のセクションでは、その仕組みについて説明します。
Matrix Generator を使用して複数環境デプロイ (開発/ステージング) 用のアプリケーションを定義し、アプリケーションにラベルを追加して名前を識別します。
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 機能でサポートされています。
アプリケーションのディレクトリ構造
この 例には、app1 と app2 の 2 つのアプリケーションが含まれています。 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: 特定の環境に応じてこのパラメーターを構成します。重要この例をデプロイに使用する場合は、例を自分のリポジトリにフォークし、
config.jsonのcluster_addressを関連付けられているクラスターの API サーバーエンドポイントに変更する必要があります。manifests/apps/app1: kustomize によって管理されるアプリケーション 1。各環境タイプには複数のリージョンが含まれる場合があります (上記の例では 1 つだけ示しています: bj)。manifests/apps/app2: kustomize によって管理されるアプリケーション 2。各環境タイプには複数のリージョンが含まれる場合があります。
前提条件
ステップ 1: Progressive Syncs 機能を有効にする
ACK One GitOps は、高可用性モードでのみ Progressive Syncs の有効化をサポートしています。有効にする手順は次のとおりです。
フリート kubeconfig を使用して、次のコマンドを実行し、構成を変更します。
kubectl edit cm -nargocd argocd-cmd-params-cmapplicationsetcontroller.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 ...次のコマンドを実行して、argocd-application-controller ポッドを再起動します。
kubectl rollout restart deployment argocd-application-controller -n argocd
ステップ 2: アプリケーションの依存関係と複数環境デプロイを管理するために、フリートに 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 は 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/bjmanifests/apps/app2/overlay/staging/bj
{{index .path.segments n}}Git リポジトリ内の一致する構成ファイルのパス。配列要素に分割されます (n - 配列インデックス)。
app1
app2
説明pathParamPrefixを指定した場合、{{.path.basename}}のような変数を参照するには、プレフィックスパスを追加して変数にアクセスする必要があります。たとえば、元の変数{{.path.basename}}は{{.target.path.basename}}に変更する必要があります。ここで、targetはpathParamPrefixの値です。
本番環境のセキュリティを確保するために、本番環境と開発/テスト/ステージング環境を 2 つの異なる ApplicationSet に分離することをお勧めします。本番環境アプリケーションを生成する場合は、手動同期方式を選択する必要があります。
ステップ 3: アプリケーションのデプロイ依存関係とリリースステータスを表示する
各アプリケーションは開発環境とステージング環境の両方にリリースする必要があるため、app1 と app2 はそれぞれ 2 つのアプリケーションを生成する必要があり、合計 4 つのアプリケーションインスタンスになります。デプロイ順序は dev-app1>dev-app2>staging-app1>staging-app2 となり、各アプリケーションは前のアプリケーションが正常に同期して正常な状態になるまで待機してから開始します。
コンソールを使用する
ACK One コンソール にログインします。左側のナビゲーションウィンドウで、 を選択します。
マルチクラスターアプリケーションを見つけ、[アプリケーション] 列の値を表示します。

アプリケーションは次の順序でデプロイされ、予想される出力は次のとおりです。
dev-app1をデプロイします。
dev-app2をデプロイします。
staging-app1をデプロイします。
staging-app2をデプロイします。
CLI を使用する
フリート 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 Missingdev-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 Missingstaging-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 Missingstaging-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