サイドカー (istio-proxy) 付きの cronjob を終了させる

2024/04/24に公開

はじめに

Pod にサイドカーが挿入されている場合、本 AP が終了してもサイドカーが終了してくれず、結果として Job が終了しないという問題があります。この問題を解決する方法はたくさんありますが、今回は wget を起動コマンドで用いた例を紹介します。

セキュリティや煩雑さの観点から curl をイメージに含めたくないという場合に参考になればと思います。(例えば, distroless を用いて busybox 等からマルチステージビルドを行うような場合は、 wget は 初期コマンドに含まれており, apt 等パッケージマネジャーからダウンロードする必要ないなど、シンプルかつ無駄なステージを挟むことなく利用できるので個人的には wget で実現できるならその方が嬉しいです。)

また、以下は cronjob マニフェスト内で利用することを想定しています。

実装例

wget
command: ["/bin/bash", "-c"]
args:
  - |
    trap 'wget --timeout=2 -q --post-data='' http://127.0.0.1:15020/quitquitquit 2>/dev/null' EXIT
    while ! wget -q --spider http://127.0.0.1:15020/healthz/ready 2>/dev/null; do
        sleep 1
    done
    <実行したいコマンド>

2>/dev/null については envoy がまだ立ち上がっていない時に 503 が吐かれてしまい、こちらは既知の不要なエラーなのでそれをログに流さないためのものです。
参考: https://github.com/istio/istio/issues/11659#issuecomment-479547294

おわりに

もし、コンテナセキュリティの観点から curl をインストールできないという方は代替として wget を使った実装を参考にしていただければと思います。

Discussion