新年あけましておめでとうございます。
新年一発目として、今回は、Argo CD Application の Multi-Repo 機能 について紹介します。
Argo CD の Application は、通常以下のように定義します。
1 Application = 1 Git Repository
しかし Argo CD では、
1つの Application で複数の Git Repository を参照することが可能です。
これを一般的に multi-repo 構成と呼びます。
実務では、以下のようなリポジトリ分割をしたくなるケースが多いです。
・よくあるリポジトリ分割例
| 種類 | 内容 |
| infra repo | 共通基盤(Ingress, Monitoring, CRD など) |
| app repo | アプリケーション固有のマニフェスト |
| env repo | 環境差分(dev / stg / prod) |
このとき、
・infra は共通で使い回したい
・app チームは app repo だけ触ってほしい
・環境差分は別管理したい
といった要求が出てきます。
multi-repo を使うと、これを 1 Application にまとめられます
・パターン①:Helm Chart + values を別 Repo で管理
一番よく使われるパターンです。
repo A: Helm Chart
repo B: values.yaml(環境ごと)
“`yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
spec:
sources:
– repoURL: https://github.com/example/helm-charts
path: my-app
targetRevision: main
helm:
valueFiles:
– $values/values-prod.yaml
– repoURL: https://github.com/example/env-config
targetRevision: main
ref: values
“`
メリットは、
・Chart と values を完全分離できる
・環境差分を安全に管理できる
・GitOps 的にとても相性が良い
あたりになります。
・パターン②:共通マニフェスト + アプリ固有マニフェスト
repo A: common(namespace, network policy など)
repo B: app-specific
“`
spec:
sources:
– repoURL: https://github.com/example/common-manifests
path: base
– repoURL: https://github.com/example/app-manifests
path: overlays/prod
“`
メリットは、
・infra 共通化がしやすい
・app チームと infra チームの責務分離が明確
あたりになります。
・責務分離がしやすい
infra チーム:共通 repo
app チーム:アプリ repo
・レビューしやすい
環境差分だけの PR
values.yaml だけの変更が明確
・スケールしやすい
アプリが増えても infra は共通
マルチクラスタ構成とも相性が良い
・同期失敗時の切り分けが少し難しい
どの repo が原因か分かりにくい
Argo CD UI の Sources タブを見る習慣が必要
・ repo 間の依存関係に注意
common 側の変更で全 Application が影響を受ける可能性
バージョン固定(tag / branch)を推奨
・過剰に分けすぎない
「なんでも multi-repo」は逆に複雑
最初は Helm + values 分離から始めるのがおすすめになります。
・GitOps を本格運用したい
・環境(dev / stg / prod)が複数ある
・infra / app のチームが分かれている
・マルチクラスタ運用をしている
→ 1つでも当てはまれば、multi-repo はかなり有効です
Argo CD の multi-repo 機能は 実務でかなり使えます。
特に Helm Chart + values 分離は鉄板構成です。
責務分離・スケーラビリティ・レビュー性が向上しますので。
ただし、依存関係と運用ルールは要設計ですね。
GitOps を一段レベルアップさせたいなら、
ぜひ一度 multi-repo 構成を検討してみてください 🚀