Kubernetes Job のハマリポイント6つ


Kubernetes Job を業務で使用した後の反省点、注意点。

実行環境
version
kubectl 1.16+
gke cluster 1.14.10-gke.42
gke node 1.14.10-gke.36

Kubertes Job とは


以下公式ドキュメントより。

Jobは1つ以上のPodを作成し、指定された数のPodが正常に終了することを保証します。 JobはPodの正常終了を追跡します。正常終了が指定された回数に達すると、そのタスク(つまりJob)は完了します。

Job の単位を小さくする

Job は1つのタスク

  • Cloud Storage (S3) へのファイルのアップロード

  • メールの送信など

を管理するためのコントローラーオブジェクトです。1つの Job に複数のタスクを含まないようにしましょう。開発が進み、必要機能が増えていくと意外とやってしまいがちです。

Job は Node に残り続ける

Jobオブジェクトは完了後も残るため、ステータスを表示できます。ステータスを確認した後、古いJobを削除するのはユーザーの責任です。

Job を残したままにしておくとリソースを消費してしまうので削除する必要があります。一般には

  • spec.ttlSecondsAfterFinishedを Job に設定

  • successfulJobsHistoryLimitfailedJobsHistoryLimit を設定した Cron Job1 の利用

といった方法があるのですが...

アルファ/ベータ版機能

spec.ttlSecondsAfterFinishedはアルファ版機能、Cron Jobはそれ自体がベータ版機能で未解決のバグもある模様。筆者環境では思い通りに動いてくれませんでした。結局 Kubernetes Job のクライアントライブラリを利用した独自の削除機能を実装しました

Job 実行には cluster-admin 権限が必要

Job の操作には cluster-admin 権限を実行アカウント(KSA2)に付与する必要があります。

$ kubectl create clusterrolebinding cluster-admin-permission-binding \
  --clusterrole=cluster-admin \
  --user=system:serviceaccount:default:default \
  --namespace=default

Job 起動リクエストは時折タイムアウトする

"Failed to runJob: The POST operation against Job.batch could not be completed at this time, please try again."

筆者環境だと1000回に1回くらいタイムアウトが発生します。Job は「タスクが完了するまでのリトライ機能を備えたもの」とも言えますが、Job 自体が起動しないとどうしようもないので、Job 起動リクエストのタイムアウトは検知し、再度起動リクエストを行うような実装にしましょう。

restartPolicy

備考: JobにrestartPolicy = "OnFailure"がある場合、Jobのバックオフ制限に達すると、Jobを実行しているコンテナが終了することに注意してください。

特に理由がない限りは、.spec.template.spec.restartPolicy = "Never"としておいた方が無難です。


  1. 時刻ベースのスケジュールによって Job を実行する Kubernetes のオブジェクト  

  2. Kuberetes Service Account (詳細はこちらの記事