「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.yaml
とapp2.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)でした。