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 をハンドリングできるようしている
- base では1つの Application に対して 1つの Kustomization.yaml を作成する
├── 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"