はじめに
CronJob で Ephemeral Volume を使ったとき、「一時的なボリューム」なのに Job の履歴が生きてる間は PVC が消えないという、個人的にはちょっと意外な動作をすることに気付きました。
検証環境:Windows 11 + kind
やってみたこと
こんな CronJob を作って試してみました:
apiVersion: batch/v1
kind: CronJob
metadata:
name: test-cronjob
spec:
timeZone: "Asia/Tokyo"
schedule: "0 0 * * *" # 毎日午前0時に実行
successfulJobsHistoryLimit: 3 # 成功したジョブの履歴を残す
jobTemplate:
spec:
template:
spec:
containers:
- name: sample-app
image: busybox
command:
[
"sh",
"-c",
'echo "this is log file" > /local-cache/logs.txt && sleep 60',
]
volumeMounts:
- name: ephemeral-vol
mountPath: /local-cache
restartPolicy: Never
volumes:
- name: ephemeral-vol
ephemeral:
volumeClaimTemplate:
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: standard
resources:
requests:
storage: 100Mi
ポイントは下記です:
- Job の履歴を 3 件残す設定(successfulJobsHistoryLimit: 3)
- Ephemeral Volume で一時的なストレージを用意
実際に動かしてみた
最初に 3 つの Job を作成
> kubectl create job job1 --from=cronjob/test-cronjob
> kubectl create job job2 --from=cronjob/test-cronjob
> kubectl create job job3 --from=cronjob/test-cronjob
完了後の状態チェック:
> kubectl get po
NAME READY STATUS RESTARTS AGE
job1-gtbhp 0/1 Completed 0 3m49s
job2-6t9vd 0/1 Completed 0 71s
job3-kw97p 0/1 Completed 0 67s
> kubectl get job
NAME STATUS COMPLETIONS DURATION AGE
job1 Complete 1/1 72s 3m56s
job2 Complete 1/1 68s 78s
job3 Complete 1/1 68s 74s
> kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE
job1-gtbhp-ephemeral-vol Bound pvc-ef241f24-56d8-476e-9fc8-8dc8754a0a44 100Mi RWO standard <unset> 4m17s
job2-6t9vd-ephemeral-vol Bound pvc-43ce0357-ea58-4248-8a35-297163060b91 100Mi RWO standard <unset> 99s
job3-kw97p-ephemeral-vol Bound pvc-9d54c045-ef9a-4a1b-9c68-ccc72fa7fc9b 100Mi RWO standard <unset> 95s
Job が完了したにも関わらず、一時的であるはず (?) の volume が残ってます。
4 つ目の Job を実行してみる
履歴制限の 3 を超える 4 つ目の Job を作ってみました:
> kubectl create job job4 --from=cronjob/test-cronjob
Job 実行中の状態を確認すると、4 つの PVC が存在してることが分かります。
> kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE
job1-gtbhp-ephemeral-vol Bound pvc-ef241f24-56d8-476e-9fc8-8dc8754a0a44 100Mi RWO standard <unset> 6m22s
job2-6t9vd-ephemeral-vol Bound pvc-43ce0357-ea58-4248-8a35-297163060b91 100Mi RWO standard <unset> 3m44s
job3-kw97p-ephemeral-vol Bound pvc-9d54c045-ef9a-4a1b-9c68-ccc72fa7fc9b 100Mi RWO standard <unset> 3m40s
job4-wkk4b-ephemeral-vol Bound pvc-a22c6323-e8a9-4b6b-a6f1-56a617d8ddf2 100Mi RWO standard <unset> 10s
> kubectl get job
NAME STATUS COMPLETIONS DURATION AGE
job1 Complete 1/1 72s 6m27s
job2 Complete 1/1 68s 3m49s
job3 Complete 1/1 68s 3m45s
job4 Running 0/1 15s 15s
Job 完了後にどうなる?
job4 が完了した後、job4 が完了したタイミングで、最古の job1 とその PVC がきれいに消えました。
> kubectl get job
NAME STATUS COMPLETIONS DURATION AGE
job2 Complete 1/1 68s 4m45s
job3 Complete 1/1 68s 4m41s
job4 Complete 1/1 68s 71s
> kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE
job2-6t9vd-ephemeral-vol Bound pvc-43ce0357-ea58-4248-8a35-297163060b91 100Mi RWO standard <unset> 4m48s
job3-kw97p-ephemeral-vol Bound pvc-9d54c045-ef9a-4a1b-9c68-ccc72fa7fc9b 100Mi RWO standard <unset> 4m44s
job4-wkk4b-ephemeral-vol Bound pvc-a22c6323-e8a9-4b6b-a6f1-56a617d8ddf2 100Mi RWO standard <unset> 74s
まとめ
- Ephemeral Volume の PVC は、対応する Job の履歴が残ってる間は消えない
- successfulJobsHistoryLimit で設定した制限に引っかかると、古い Job と一緒に PVC も削除される
- 新しい Job が作られてから古いのが削除されるまでの間、一時的に制限を超える数の PVC が存在することがある