Argo CDのWaves機能を使ってPhaseの中でSync順序を定義する方法について解説します。
モチベーション
- RailsアプリケーションをKubernetesに乗せてArgo CDでデプロイする時に、
rails db:migrate
をいつ実行するのか? PreSync
を使ってSyncの度に実行するのがベターだが、PreSync時には他のリソースが存在していないという問題がある- 例えばDBへの接続情報を環境変数で設定し、その設定をConfigMapで管理している場合に、PreSyncのJobが起動できない
- Argo CDのWaves機能を使って解決した
Phases/Wavesとは
ArgoCDにある3つのPhase
そもそもの話をすると、ArgoCDには3つのPhaseがあります。
- pre-sync
- sync
- post-sync
普通にArgoCDを使ってマニフェストをapplyするのが、2番めのsync
Phaseです。
pre-sync
とpost-sync
はSyncする直前あるいは直後に何らかの処理を実行する時に利用します。
たとえばpre-sync
PhaseでDBスキーマをマイグレーションするJobリソースをトリガすることで、アプリケーションをデプロイする前にDBマイグレーションを走らせることができます。
以下がPreSync
Phaseでsleep 5
するJobリソースを定義したマニフェストです。
apiVersion: batch/v1
kind: Job
metadata:
annotations:
argocd.argoproj.io/hook: PreSync
argocd.argoproj.io/hook-delete-policy: BeforeHookCreation
name: pre-sync-job
spec:
template:
spec:
containers:
- command:
- sleep
- "5"
image: XXX
imagePullPolicy: Always
name: pre-sync-job
ではWaveとは?
Waveとは特定のPhaseの中で更にリソースのapply順序を定義するための機能です。 「Aというリソースが正しくapplyされてからBというリソースをapplyする」というSyncの順序を定義できます。
使い方
非常に簡単でargocd.argoproj.io/sync-wave: "5"
というannotationを付与するだけです。
指定したPhaseの中でバリューの番号が若い順にapplyが実行されます。
概要の例で書いたようにPreSync
の中でConfigMap
-> Job
の順にリソースをapplyしたい場合、以下のようにマニフェストを作成します。
- ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
annotations:
argocd.argoproj.io/hook: PreSync
argocd.argoproj.io/hook-delete-policy: BeforeHookCreation
argocd.argoproj.io/sync-wave: "1"
labels:
env: stg
name: pre-sync-env-configmap
data:
・・・
- Job
apiVersion: batch/v1
kind: Job
metadata:
annotations:
argocd.argoproj.io/hook: PreSync
argocd.argoproj.io/hook-delete-policy: BeforeHookCreation
argocd.argoproj.io/sync-wave: "2"
name: pre-sync-job
spec:
template:
spec:
containers:
- command:
- sleep
- "5"
image: XXX
imagePullPolicy: Always
name: pre-sync-job
ConfigMapにはargocd.argoproj.io/sync-wave: "1"
というannotationを付与し、Jobにはargocd.argoproj.io/sync-wave: "2"
というannotationを付与しています。
これでPreSync
というPhaseの中でConfigMap
-> Job
という順にリソースが作成されるため、ConfigMapを使うJobを実行することができます。