Argo CDのApplication SetとApp of apps patternの違いと使い分け

2023.05.09

「Argo CDのApplication SetとApp of apps patternはどう違うの?」

どちらも複数のApplicationを一度にArgo CD上に作成することができます。

どう違うのか気になったので、ブログにしてみました。

結論

  • 同一構成のApplicationを複数環境にデプロイしたい -> Application Set
  • Application間の依存関係やデプロイ順を制御したい -> App of apps pattern

Application SetとApp of apps patternの概要

それぞれの概要を紹介します。

ArgoCDのサンプルアプリケーションのguestbookを、2つのApplicationにデプロイすることを想定してサンプルを紹介します。

Application Set

Argo CDのApplication Setは、同じ構成を持つ複数のApplicationを自動的に展開するためのカスタムコントローラーです。

templateを定義して、Applicationごとに変えたい部分(デプロイ先Cluster等)をパラメータにして定義することができます。

サンプル

templateセクションに共通部分を書き、generatorsセクションにApplicationごとに変えたいパラメータを書きます。

application-set.yaml

apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: guestbook
spec:
  generators:
  - list:
      elements:
      - cluster: app1
        url: https://1.2.3.4
      - cluster: app2
        url: https://2.4.6.8
  template:
    metadata:
      name: '{{cluster}}-guestbook'
    spec:
      project: default
      source:
        repoURL: https://github.com/argoproj/argocd-example-apps.git
        targetRevision: HEAD
        path: guestbook
      destination:
        server: '{{url}}'
        namespace: guestbook

App of apps pattern

Argo CDで複数のapplicationをインストール(デプロイ)したい場合に用いられるパターン(構成)です。

他のapplicationを内包するapplicationを作成する構成です。

(以下ブログから引用)

サンプル

app-of-apps.yamlが親アプリケーションで、app1.yamlapp2.yamlが子アプリケーションです。

$ tree
├── app-of-apps.yaml
└── apps
    ├── app1.yaml
    └── app2.yaml

app-of-apps.yaml

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: app-of-apps
spec:
  project: default
  source:
    repoURL: https://github.com/<ファイルがあるリポジトリ>
    targetRevision: HEAD
    path: apps
  destination:
    namespace: argocd
    server: https://kubernetes.default.svc

app1.yaml

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: app1
spec:
  project: default
  source:
    repoURL: https://github.com/argoproj/argocd-example-apps.git
    targetRevision: HEAD
    path: guestbook
  destination:
    server: https://1.2.3.4
    namespace: guestbook

app2.yaml

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: app2
spec:
  project: default
  source:
    repoURL: https://github.com/argoproj/argocd-example-apps.git
    targetRevision: HEAD
    path: guestbook
  destination:
    server: https://2.4.6.8
    namespace: guestbook

Application SetとApp of apps patternの使い分け

同一構成のApplicationを複数環境にデプロイしたいならApplication Set

単純に同一構成のApplicationを複数環境にデプロイしたい場合は、Application Setの方がtemplate機能を使えるため少なくシンプルに設定できます。

サンプルからも、Application Setの方が記述量やファイル数が少ないことがわかります。

Applicationのデプロイ順を制御したい場合は、App of apps pattern

Application Setだけでは、applicationのデプロイ順を制御することはできません。

App of apps patternとSyncWavesを組み合わせることで、デプロイ順の制御などが可能です。

Sync Phases and Waves - Argo CD - Declarative GitOps CD for Kubernetes

その他: 手動同期の運用

App of apps patternでは手動同期時に、親アプリケーションを同期すれば子アプリケーションも同期されます。

そのため、手動同期の運用を行っている場合、App of apps patternの方が楽ではと思うかもしれません。

似たようなことをApplication Setでやる場合、作成時にApplicationにLabelを付与して手動同期時にLabelを指定するといった方法があります。(手動同期したい単位で同じProjectに所属させて、Projectで絞り込んで手動同期でもOKです。)

application-set.yaml

apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: guestbook
spec:
  generators:
  - list:
      elements:
      - cluster: app1
        url: https://kubernetes.default.svc
      - cluster: app2
        url: https://kubernetes.default.svc
  template:
    metadata:
      name: '{{cluster}}-guestbook'
      labels:
        name: guestbook # labelの付与
    spec:
      project: default
      source:
        repoURL: https://github.com/argoproj/argocd-example-apps.git
        targetRevision: HEAD
        path: guestbook
      destination:
        server: '{{url}}'
        namespace: default

GUI上では特定のLabelだけが付与されているApplicationを絞り込むことができます。

絞り込んだ上で、手動同期を実行すれば複数Applicationへのデプロイも簡単な操作でできます。

CLIで実行する場合は、以下のように指定すればOKです。

$ argocd app sync -l name=guestbook

おわりに

Argo CDのApplication SetとApp of appsの違いや使い分けについてでした。

  • 同一構成のApplicationを複数環境にデプロイしたい -> Application Set
  • Application間の依存関係やデプロイ順を制御したい -> App of apps pattern

どう違うのか最初はイメージできなかったため、ブログにしてみました。

以上、AWS事業本部の佐藤(@chari7311)でした。

参考