ArgoCD で DB マイグレーションする
ArgoCDを使ってGitOpsで DB Migration をする ArgoCDには Resource Hooks という概念があり、これを使ってデプロイのワークフローを構築する PreSync, Sync, PostSync, SyncFail の4種類hookが存在し、DBマイグレーションなどSyncの前に実行したいものはPreSynchookを利用する
hookの中で順序を指定したい場合、waveに数字で順序を指定
https://www.youtube.com/watch?v=zIHe3EVp528
使い方
k8s の Job リソースを使ってジョブを作成する
argocd.argoproj.io/hook annotation を付けてArgoCDによるapplyを実行させる
いい感じに実行順序を制御してくれる
PreSyncが成功するまでSyncは実行されない
PreSyncに失敗する(ImagePullBackOffなど)とSyncは実行されない
ebiken.icon v1.8.1時点でPreSyncの結果を待たずにSyncが動いてしまうバグがあるので注意
サンプル
code:kustomization.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: api
labels:
app: api
annotations:
argocd.argoproj.io/sync-wave: "1" # should be specified and not be 0
spec:
selector:
matchLabels:
app: api
template:
metadata:
labels:
app: api
spec:
containers:
- image: xxx
imagePullPolicy: Always
name: api
ports:
- containerPort: 8080
---
apiVersion: batch/v1
kind: Job
metadata:
name: db-apply
annotations:
argocd.argoproj.io/hook: PreSync
argocd.argoproj.io/hook-delete-policy: BeforeHookCreation
argocd.argoproj.io/sync-wave: "1"
spec:
activeDeadlineSeconds: 120
backoffLimit: 2
template:
spec:
restartPolicy: Never
containers:
- image: xxxx
imagePullPolicy: Always
name: api
---
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: hook-test
resources:
- api.yaml
- job.yaml