#これを設定した背景
- 元々はDB BackupをS3にコピーするCronjobではhttps://github.com/benjamin-maynard/kubernetes-s3-mysql-backup を参考にSlack notifyできるようにしてた。
- 他のCronjobを設定したはいいがFail/Successしたか一々確認するのは面倒なので、Fail/Success結果をSlackで通知する方法を模索した。
##参考にした記事
- https://kubernetes.io/docs/tasks/configure-pod-container/attach-handler-lifecycle-event/
- https://kubernetes.io/docs/concepts/workloads/pods/pod/#termination-of-pods
- https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#hook-details
- https://www.cyberciti.biz/faq/linux-bash-exit-status-set-exit-statusin-bash/
- https://stackoverflow.com/questions/8903239/how-to-calculate-time-elapsed-in-bash-script/8903280
##最初に考えていた方法
lifecycleのPostStartとPreStopを使って
- PostStart > JobA has started messageをslack
- JobA
- PreStop > JobA has completed messageをslack
これだとCronjobがFail/Successしたか確実ではない
##PreStopはこの用途に適していなかった
lifecycleのPreStop
A call to the preStop hook fails if the container is already in terminated or completed state.
##次に考えた方法
- slack_start.sh > JobA has started messageをslack
- JobA
- slack_stop.sh > JobA has completed messageをslack
これだとCronjobがFail/Successしたか確実ではない
##最終的に使った方法
ConfigMapでwrapper.shをpodにつけてJobAをinputStream $1とする。
これだとCronjobがFail/Successしたか確実。
wrapper.sh JobA
wrapper.shはシンプルなもので
$cmd1
status=$?
- $1 JobAがSuccess($status -eq 0)したらMSG_SUCCESSをslack
- $1 JobAがFail(else)したらMSG_FAILをslack
ついでに各Cronjobが何秒かかったかもわかるようにした。
duration=$SECONDS
MSG_DURATION=$(echo "($(($duration / 60))m$(($duration % 60))s)")
##ハマったこと
- JobA内にvariableやmkdir -p /tmp/reportなどがある時
wrapper.sh "yesterday=`date -d 'yesterday' '+%F'` python_path=/usr/local/bin/python $python_path app.py mkdir -p /tmp/report"
- JobAがマルチラインの時 > &&を使うことで走るように
- defaultModeのjsonnetでの使い方
jsonnet | yaml (decimal) |
---|---|
defaultMode: std.parseOctal('0755') | defaultMode: 493 |
##学んだこと
- wrapper.sh
- configMap defaultMode
- lifecycleのPostStartとPreStop
- slack notification