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 に設定 -
successfulJobsHistoryLimit
、failedJobsHistoryLimit
を設定した 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"
としておいた方が無難です。