Argo CD + HelmでApp of Apps Patternを構築してみた
1. はじめに
1-1. 目的
App of Apps Patternの公式ドキュメントで説明されている内容を実践してみたので、実装例として紹介します。
1-2. そもそもApp of Apps Patternとは
クラスター内の複数のアプリケーションをArgo CDでデプロイ管理するための実装パターンです。下図[1]の通り、一つのルートArgo CDアプリケーション(Root App)が複数のArgo CDアプリケーションを束ねる構成となっています。
2. 実装例
2-1. ディレクトリ構成
ディレクトリ構成は以下の通りです。argocd/apps
ディレクトリがRoot Appであり、これが/main
と/secretsmanager
で定義されたArgo CDアプリケーションを束ねています。
$ tree .
.
├── README.md
├── argocd
│ ├── apps # Argo CDでデプロイ管理するアプリケーション群を定義したHelmチャート(Root App)
│ │ ├── Chart.yaml
│ │ ├── templates
│ │ │ ├── main.yaml
│ │ │ └── secretsmanager.yaml
│ │ └── values.yaml
│ └── bootstrap # Argo CDを最初にEKSクラスターへインストールするためのファイル群
│ ├── init.sh
│ └── manifests
│ ├── application.yaml
│ └── project.yaml
├── main # メインアプリケーションのHelmチャート
│ ├── Chart.yaml
│ ├── templates
│ │ ├── _helpers.tpl
│ │ ├── clusterrole.yaml
│ │ ├── clusterrolebinding.yaml
│ │ ├── deployment.yaml
│ │ ├── ingress.yaml
│ │ ├── ingressclass.yaml
│ │ ├── job.yaml
│ │ ├── service.yaml
│ │ └── serviceaccount.yaml
│ └── values.yaml
└── secretsmanager # SecretsManagerに格納されたDB接続情報をSecretリソース化するHelmチャート
├── Chart.lock
├── Chart.yaml
├── charts
│ └── external-secrets-0.5.9.tgz
├── templates
│ ├── _helpers.tpl
│ ├── externalsecret.yaml
│ ├── secretstore.yaml
│ └── serviceaccount.yaml
└── values.yaml
10 directories, 27 files
2-2. デプロイフロー
デプロイフローは以下の通りです。
-
argocd/bootstrap/init.sh
を実行してArgo CDをEKSクラスターへインストールする。 -
argocd/bootstrap/init.sh
の中でargocd/bootstrap/manifests/
配下のファイルを適用する。 -
argocd/bootstrap/manifests/application.yaml
がargocd/apps
で定義されたRoot Appをデプロイする。 - Root Appが
main
とsecretsmanager
それぞれで定義されたアプリケーションをデプロイする。
2-3. Argo CDのインストール
Argo CDのインストールは公式チュートリアルのGetting Startedの内容をargocd/bootstrap/init.sh
としてスクリプト化しています。詳しくはArgo CDのGetting Startedをシェルスクリプト化したをご参照ください。
2-4. Root Appを指すYAMLファイル
Root Appを指し示すargocd/bootstrap/manifests/application.yaml
のYAML定義は以下の通りです。
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: myapplication
namespace: argocd
finalizers:
- resources-finalizer.argocd.argoproj.io
spec:
project: myproject # argocd/bootstrap/manifests/project.yamlで定義されたプロジェクト
source:
repoURL: https://github.com/アカウント名/リポジトリ名.git
path: argocd/apps/
targetRevision: main
helm:
releaseName: リリース名
version: v3
valueFiles:
- values.yaml
destination:
server: https://kubernetes.default.svc
namespace: argocd
syncPolicy:
syncOptions:
- CreateNamespace=false
automated:
selfHeal: false
.spec.source.repoURL
と.spec.source.path
でGitリポジトリの特定ディレクトリを指しており、.spec.source.helm
によってそのディレクトリで定義されたHelmチャートからマニフェストを生成する際の設定値を指定しています。
2-5. Root Appの実装
Root Appを定義しているディレクトリを再掲します。
.
└─── argocd
└─── apps
├── Chart.yaml
├── templates
│ ├── main.yaml
│ └── secretsmanager.yaml
└── values.yaml
argocd/apps/templates/main.yaml
とargocd/apps/templates/secretsmanager.yaml
とargocd/apps/values.yaml
については、特段の注意事項がないので実装内容を示すに留めます。
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: main
namespace: argocd
finalizers:
- resources-finalizer.argocd.argoproj.io
labels:
app.kubernetes.io/name: main
spec:
project: myproject
source:
repoURL: https://github.com/アカウント名/リポジトリ名.git
path: main/
targetRevision: {{ .Values.targetRevision }}
helm:
releaseName: リリース名
version: {{ .Values.helmVersion }}
valueFiles:
- values.yaml
destination:
server: https://kubernetes.default.svc
namespace: {{ .Values.namespace }}
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: secretsmanager
namespace: argocd
finalizers:
- resources-finalizer.argocd.argoproj.io
labels:
app.kubernetes.io/name: secretsmanager
annotations:
argocd.argoproj.io/hook: PreSync
argocd.argoproj.io/sync-wave: "-10"
spec:
project: myproject
source:
repoURL: https://github.com/アカウント名/リポジトリ名.git
path: secretsmanager/
targetRevision: {{ .Values.targetRevision }}
helm:
releaseName: リリース名
version: {{ .Values.helmVersion }}
valueFiles:
- values.yaml
destination:
server: https://kubernetes.default.svc
namespace: {{ .Values.namespace }}
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true
helmVersion: v3
targetRevision: main
namespace: main
3. まとめ
Argo CD + HelmでのApp of Apps Patternを構築してみたので、実装例として記事にまとめてみました。文章での説明は少ないですが、実装例から得る気づきも多いと思うので、誰かの何かのお役に立てれば幸いです^^
-
App of Apps Patternのイメージ図(Turbocharge ArgoCD with App of Apps Pattern and Kustomized Helmより) ↩︎
Discussion