Argo CDのApplication Setで複数Applicationを作成してみる

2023.05.08

「ArgoCDで複数のクラスターに同じApplicationをデプロイしたいな」

こんな時にはApplication Setが便利です。

概要と試してみたことをブログにします。

Application Setとは

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

同一の構成のApplicationを複数のClusterに展開したいことがあると思います。 (例えば、DEV/STG/PRDのように環境ごとにや、Saasを提供していて利用者ごとにKubernetes Clusterを用意するなど)

Application Setを使用することで記述量を抑えつつ、同一構成の複数のApplicationを設定することができます。

デプロイ先のクラスターだけ変えて、他の設定は同じ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)でした。

参考