ArgoCD の App Of Apps Pattern や Application の Overlays 構成について

ArgoCD の App Of Apps Pattern や Application のディレクトリと Overlays の構成について考えてみました。現在運用している構成が柔軟で汎用性が高かったので紹介します。

モチベーション

production 環境では 7台の Raspberry Pi でクラスターを構成していて、staging 環境では Oracle Cloud の3台の仮想サーバでクラスターを構成しています。Raspberry PI 環境では動作できても OCI 環境で全てのツールを動作させるのはリソース的に難しいところがありました。
そのため環境毎に deploy するツールを調整できるようにするのと、環境毎に設定を変更できるようにする必要がありました。
また、app-of-apps は Application が多くなると見通しが悪くなるので app-of-apps をカテゴリー毎に分けて、まとめる Application の数を少なくしたかったというのがありました。

各ディレクトリの役割の要約

  • app-of-apps-root
    • 環境毎にデプロイする root となる Application
  • app-of-apps
    • 環境毎にどのカテゴリーの app-of-apps をデプロイするか調節する
  • application
    • 環境毎にどの application をデプロイするか調節する
    • 環境毎に設定を変更する

ディレクトリ構成全体

.
├── app-of-apps
│   ├── base
│   │   ├── ci-cd
│   │   ├── management
│   │   ├── observability
│   │   ├── registry
│   │   ├── repo
│   │   ├── security
│   │   ├── server
│   │   ├── service-mesh
│   │   ├── service-proxy
│   │   ├── storage
│   │   ├── webapp
│   │   └── workflow
│   ├── production
│   ├── staging
│   └── testing
├── app-of-apps-root
│   ├── production
│   ├── staging
│   └── testing
├── application
│   ├── base
│   │   ├── ci-cd
│   │   │   └── argo-rollouts
│   │   ├── management
│   │   │   ├── namespace
│   │   │   ├── rbac
│   │   │   ├── registry
│   │   │   └── repository
│   │   ├── observability
│   │   │   ├── exchangerate-exporter
│   │   │   ├── kube-state-metrics
│   │   │   ├── kubernetes-dashboard
│   │   │   ├── monitoring
│   │   │   └── temperature-exporter
│   │   ├── security
│   │   │   ├── cert-manager
│   │   │   └── vault
│   │   ├── server
│   │   │   ├── jypyterlab
│   │   │   ├── minecraft-bedrock-arm64
│   │   │   ├── nextcloud
│   │   │   └── redmine
│   │   ├── service-mesh
│   │   │   └── consul
│   │   ├── service-proxy
│   │   │   ├── ingress-aggregator
│   │   │   ├── ingress-aggregator-private
│   │   │   ├── ingress-nginx
│   │   │   ├── metallb
│   │   │   └── metallb-config
│   │   ├── storage
│   │   │   ├── longhorn
│   │   │   ├── nfs-provisioner
│   │   │   └── storageclass
│   │   ├── webapp
│   │   │   └── aimhighergg-com
│   │   └── workflow
│   │       ├── airflow
│   │       └── argo-workflow
│   ├── production
│   │   ├── ci-cd
│   │   ├── management
│   │   ├── observability
│   │   ├── security
│   │   ├── server
│   │   ├── service-mesh
│   │   ├── service-proxy
│   │   ├── storage
│   │   ├── webapp
│   │   └── workflow
│   ├── staging
│   │   ├── ci-cd
│   │   ├── management
│   │   ├── observability
│   │   ├── security
│   │   ├── server
│   │   ├── service-mesh
│   │   ├── service-proxy
│   │   ├── storage
│   │   ├── webapp
│   │   └── workflow
│   └── testing
│       ├── ci-cd
│       ├── management
│       ├── observability
│       ├── security
│       ├── server
│       ├── service-mesh
│       ├── service-proxy
│       ├── storage
│       ├── webapp
│       └── workflow
└── secret
    ├── registry
    └── repo

ディレクトリ構成の解説

production 環境の場合クラスターにデプロイするディレクトリは app-of-apps-root/production のみです。

  • app-of-apps-root directory
    • app-of-apps の root で環境毎の app-of-apps がある
  • app-of-apps directory
    • app-of-apps(Application) をカテゴリー毎に作成し Application をまとめている
    • Application が増えすぎないようにカテゴリーの言葉は調節する
  • application directory
    • base では1つの Application に対して 1つの Kustomization.yaml を作成する
      • 柔軟に resouces をハンドリングできるようしている
├── app-of-apps-root
│   ├── production
│   ├── staging
│   └── testing
├── app-of-apps
│   ├── base
│   │   ├── ci-cd
│   │   ├── management
│   │   ├── observability
│   │   ├── registry
│   │   ├── repo
│   │   ├── security
│   │   ├── server
│   │   ├── service-mesh
│   │   ├── service-proxy
│   │   ├── storage
│   │   ├── webapp
│   │   └── workflow
├── application
│   ├── base
│   │   ├── ci-cd
│   │   │   └── argo-rollouts
│   │   │       ├── argo-rollouts.yaml
│   │   │       └── kustomization.yaml
│   │   ├── management
│   │   │   ├── namespace
│   │   │   │   ├── kustomization.yaml
│   │   │   │   └── namespace.yaml
│   │   │   ├── rbac
│   │   │   │   ├── kustomization.yaml
│   │   │   │   └── rbac.yaml
│   │   │   ├── registry
│   │   │   │   ├── convert-dockerconfigjson-avp.yaml
│   │   │   │   ├── kustomization.yaml
│   │   │   │   └── private-registry.yaml
│   │   │   └── repository
│   │   │       ├── argocd-repo-secret.yaml
│   │   │       └── kustomization.yaml
│   │   ├── observability
│   │   │   ├── exchangerate-exporter
│   │   │   │   ├── exchangerate-exporter.yaml
│   │   │   │   └── kustomization.yaml
│   │   │   ├── kube-state-metrics
│   │   │   │   ├── kube-state-metrics.yaml
│   │   │   │   └── kustomization.yaml
│   │   │   ├── kubernetes-dashboard
│   │   │   │   ├── kubernetes-dashboard.yaml
│   │   │   │   └── kustomization.yaml
│   │   │   ├── monitoring
│   │   │   │   ├── kustomization.yaml
│   │   │   │   └── monitoring.yaml
│   │   │   └── temperature-exporter
│   │   │       ├── kustomization.yaml
│   │   │       └── temperature-exporter.yaml
│   │   ├── security
│   │   │   ├── cert-manager
│   │   │   │   ├── cert-manager.yaml
│   │   │   │   └── kustomization.yaml
│   │   │   └── vault
│   │   │       ├── kustomization.yaml
│   │   │       └── vault.yaml
│   │   ├── server
│   │   │   ├── jypyterlab
│   │   │   │   ├── jypyterlab.yaml
│   │   │   │   └── kustomization.yaml
│   │   │   ├── minecraft-bedrock-arm64
│   │   │   │   ├── kustomization.yaml
│   │   │   │   └── minecraft-bedrock-arm64.yaml
│   │   │   ├── nextcloud
│   │   │   │   ├── kustomization.yaml
│   │   │   │   └── nextcloud.yaml
│   │   │   └── redmine
│   │   │       ├── kustomization.yaml
│   │   │       └── redmine.yaml
│   │   ├── service-mesh
│   │   │   └── consul
│   │   │       ├── consul.yaml
│   │   │       └── kustomization.yaml
│   │   ├── service-proxy
│   │   │   ├── ingress-aggregator
│   │   │   │   ├── ingress-aggregator.yaml
│   │   │   │   └── kustomization.yaml
│   │   │   ├── ingress-aggregator-private
│   │   │   │   ├── ingress-aggregator-private.yaml
│   │   │   │   └── kustomization.yaml
│   │   │   ├── ingress-nginx
│   │   │   │   ├── ingress-nginx.yaml
│   │   │   │   └── kustomization.yaml
│   │   │   ├── metallb
│   │   │   │   ├── kustomization.yaml
│   │   │   │   └── metallb.yaml
│   │   │   └── metallb-config
│   │   │       ├── kustomization.yaml
│   │   │       └── metallb-config.yaml
│   │   ├── storage
│   │   │   ├── longhorn
│   │   │   │   ├── kustomization.yaml
│   │   │   │   └── longhorn.yaml
│   │   │   ├── nfs-provisioner
│   │   │   │   ├── kustomization.yaml
│   │   │   │   └── nfs-provisioner.yaml
│   │   │   └── storageclass
│   │   │       ├── kustomization.yaml
│   │   │       └── storageclass.yaml
│   │   ├── webapp
│   │   │   └── aimhighergg-com
│   │   │       ├── aimhighergg-com.yaml
│   │   │       └── kustomization.yaml
│   │   └── workflow
│   │       ├── airflow
│   │       │   ├── airflow.yaml
│   │       │   └── kustomization.yaml
│   │       └── argo-workflow
│   │           ├── argo-workflow.yaml
│   │           └── kustomization.yaml
│   ├── production

Overlay の解説

  • app-of-apps-root directory
    • overlay なし
    • app-of-apps の overlay を指定
  • app-of-apps directory
    • デプロイする app-of-apps 自体を resouces で調整できる
    • patches で Appliction の path を変更することによって、kustomize の デプロイする環境を指定している
  • application directory
    • カテゴリーのなかでどのリソースをデプロイするか調節している
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: app-of-apps-root
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/AbeYuki/argocd
    path: app-of-apps/production
    targetRevision: HEAD
  destination:
    server: 'https://kubernetes.default.svc'
    namespace: argocd
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

resources: ### 環境毎にどの app-of-apps デプロイするか調節できる
- ../base/workflow
#- ../base/ci-cd
- ../base/management
- ../base/observability
- ../base/security
#- ../base/server
#- ../base/service-mesh
- ../base/service-proxy
- ../base/storage
#- ../base/webapp

patches: ### デプロイする環境ごとの Application のパスに書き換える 
- target:
    kind: Application
    group: argoproj.io
    version: v1alpha1
    namespace: argocd
    name: app-of-apps-workflow
  patch: |-
    - op: replace
      path: /spec/source/path
      value: "application/staging/workflow"
    - op: replace
      path: /spec/source/targetRevision
      value: "HEAD"
~~~ 抜粋 ~~~
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

resources: ### app-of-apps の中でどの Application をデプロイするか調節できる
- ../../base/service-proxy/ingress-aggregator
#- ../../base/service-proxy/ingress-aggregator-private
- ../../base/service-proxy/ingress-nginx
- ../../base/service-proxy/metallb
- ../../base/service-proxy/metallb-config

patches: ### Application でデプロイする kustomize のパスや Helm の設定変更を行う
- target:
    kind: Application
    group: argoproj.io
    version: v1alpha1
    namespace: argocd
    name: metallb-config
  path: metallb-config-patch.yaml
- target:
    kind: Application
    group: argoproj.io
    version: v1alpha1
    namespace: argocd
    name: ingress-aggregator
  path: ingress-aggregator.yaml

kustomize の場合の patches

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: metallb-config
  namespace: argocd
spec:
  source:
    targetRevision: HEAD
    path: overlay/staging

helm の場合の patches(values.yaml を直接 Application に記載している場合)

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: longhorn
  namespace: argocd
spec:
  source:
    targetRevision: 1.6.0
    helm:
      releaseName: v1-6-0
      values: |
        persistence:
          defaultClass: true
        preUpgradeChecker:
          jobEnabled: false
        defaultSettings:
          defaultLonghornStaticStorageClass: "longhorn"

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です