ArgoCDのWaves機能を使ってPhaseの中でSync順序を定義する

Posted on
Argo CD

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番めのsyncPhaseです。 pre-syncpost-syncはSyncする直前あるいは直後に何らかの処理を実行する時に利用します。 たとえばpre-syncPhaseでDBスキーマをマイグレーションするJobリソースをトリガすることで、アプリケーションをデプロイする前にDBマイグレーションを走らせることができます。 以下がPreSyncPhaseで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を実行することができます。