koukiblog

たぶんweb系の話題

Sidecarを利用しているとk8sのjobが終了しない

問題

Sidecarを使っているとkubernetesのJobが正しく終了できない問題がありました。SIdecarコンテナの仕様によっても変わるのですが、cloudsql-proxy, istio-proxyなどよく使われるSidecarではこの問題が発生します。

これはJobを実行するメインのコンテナが処理を完了して終了しても、Sidecarは変わらず動作を続けているからです。

状況

kubernetesにもIstioにもIssueがあがっており、回避策は挙げられているものの、それが利用できるかどうかは状況次第で、解決には至っていないようです。

Better support for sidecar containers in batch jobs · Issue #25908 · kubernetes/kubernetes · GitHub

github.com

現状の解決策

現状の解決策は、

  • Sidecarコンテナを自分でコントロールして自死する仕組みを作る(emptyDirをmountしておいて、そこに特定のファイルがあったら終了コード0で終わるとか)
  • Jobが長引かないことを祈ってconcurrencyPolicy: Replace

の2択のようです。

前者の方法はistio-proxyのように自動で注入されるsidecarには適用しづらいので、後者が適用できるように実行間隔や処理内容を調整する必要があります。。

また、自分でSidecarコンテナを作成する場合は、別コンテナから安全に終了させることができる仕組みを用意しておくとよさそうです。

追記

CronJobの場合は、concurrencyPolicyで対応できるが、Jobの場合はそれがない。

Jobの場合は、activeDeadlineSeconds を設定することで、指定した時間が来たらPodが終了することを保証することができる。