🐙

Argo CD + HelmでApp of Apps Patternを構築してみた

2022/09/04に公開

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. デプロイフロー

デプロイフローは以下の通りです。

  1. argocd/bootstrap/init.shを実行してArgo CDをEKSクラスターへインストールする。
  2. argocd/bootstrap/init.shの中でargocd/bootstrap/manifests/配下のファイルを適用する。
  3. argocd/bootstrap/manifests/application.yamlargocd/appsで定義されたRoot Appをデプロイする。
  4. Root Appがmainsecretsmanagerそれぞれで定義されたアプリケーションをデプロイする。

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定義は以下の通りです。

argocd/bootstrap/manifests/application.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.yamlargocd/apps/templates/secretsmanager.yamlargocd/apps/values.yamlについては、特段の注意事項がないので実装内容を示すに留めます。

argocd/apps/templates/main.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
argocd/apps/templates/secretsmanager.yaml
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
argocd/apps/values.yaml
helmVersion: v3
targetRevision: main
namespace: main

3. まとめ

Argo CD + HelmでのApp of Apps Patternを構築してみたので、実装例として記事にまとめてみました。文章での説明は少ないですが、実装例から得る気づきも多いと思うので、誰かの何かのお役に立てれば幸いです^^

脚注
  1. App of Apps Patternのイメージ図(Turbocharge ArgoCD with App of Apps Pattern and Kustomized Helmより) ↩︎

Discussion