「ArgoCDで複数のクラスターに同じApplicationをデプロイしたいな」
こんな時にはApplication Setが便利です。
概要と試してみたことをブログにします。
Application Setとは
Argo CDのApplication Setは、同じ構成を持つ複数のApplicationを自動的に展開するためのカスタムコントローラーです。
同一の構成のApplicationを複数のClusterに展開したいことがあると思います。 (例えば、DEV/STG/PRDのように環境ごとにや、Saasを提供していて利用者ごとにKubernetes Clusterを用意するなど)
Application Setを使用することで記述量を抑えつつ、同一構成の複数のApplicationを設定することができます。
- Introduction - Argo CD - Declarative GitOps CD for Kubernetes
- Use Cases - Argo CD - Declarative GitOps CD for Kubernetes
デプロイ先のクラスターだけ変えて、他の設定は同じApplicationをデプロイする場合を例に具体的な設定を見てましょう。
Application Setを使わない場合
通常であれば、以下のように1つ1つArgo CDのApplicationを定義する必要があります。
今回はApplicationのnameとデプロイ先のClusterのみを変えて、app1とapp2を設定します。
app1.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: app1-guestbook
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-guestbook
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の数だけファイルが増えるため、数が多くなると運用が大変そうです。
Application Setを使う場合
Application Setを使えば、以下のように記述をシンプルにできます。
app.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
templateを定義して、Applicationごとに変更したい部分をパラメータ化することが可能です。
Application Setを使わない場合と比べて、重複箇所がかなり減ったことがわかります。
generators
の部分ですが、上記ではList generator
(静的にリストを定義)を使用しました。
他にも定義できるgenerator
は色々あります。
例えば、Cluster generator
はArgo CD内で管理されているクラスターのリストに基づいてパラメータを作成することができます。
詳細は以下の公式ドキュメントをご確認ください。
Generators - Argo CD - Declarative GitOps CD for Kubernetes
やってみた
ローカルのkind上にArgo CDをインストール
以下の手順で、kind上にArgo CDをインストールします。
Argo CDへのログインの確認までを行います。
CLIでもログインしておきます。
argocd login localhost:8080
Application Setの用意・デプロイ
Argo CD v2.3 以降、ApplicationSet コントローラーは Argo CD にバンドルされています。 (現時点では、v2.6.7)
そのため、ApplicationSet コントローラーを個別にインストールする必要はありません。
以下のファイルを用意します。
本来ならurlの部分を別のClusterのurlに変更したいところですが、ローカルで試す関係でArgo CD用のクラスターを指定しています。
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'
spec:
project: default
source:
repoURL: https://github.com/argoproj/argocd-example-apps.git
targetRevision: HEAD
path: guestbook
destination:
server: '{{url}}'
namespace: default
以下のコマンドでApplication Setを作成すると、2つのApplicationが作成されることを確認できます。
$ argocd appset create application-set.yaml
もし上記で上手くいかない場合は、argocd-applicationset-controller
のログをご確認ください。
$ kubectl logs -f -l app.kubernetes.io/name=argocd-applicationset-controller -c argocd-applicationset-controller -n <argocd namespace>
おわりに
ArgoCD Application Setについてでした。
簡単に同一構成のApplicationを作成することができました。
Argo CD v2.3 以降はArgo CDにバンドルされているため、すぐに使うことができます。 同一Applicationを複数のクラスターにデプロイしたい場合に便利かと思います。ぜひ試してみてください。
以上、AWS事業本部の佐藤(@chari7311)でした。