
Job・CronJobの実装方法をメモ。
kubernetes環境上で実行するjobは並列起動してもエラーとならない様な設計にすると良いそうです。
後はdockerイメージ更新はタグをベースに行う事により、imagePullPolicy: IfNotPresent
で更新の必要がない時はpullをskipさせる事ができます。
タグがlatest
だと更新漏れ等事故の元となる為、お勧めしません。
Jobの定義
マニフェストに定義してkubectl apply -f job.yaml
で実行できます。
jobの確認方法はkubectl get job
など、他のリソースと同じです。
apiVersion: batch/v1 kind: Job metadata: name: test-job spec: completions: 5 parallelism: 3 backoffLimit: 1 activeDeadlineSeconds: 3600 # この秒数を超える処理はエラーとなるので注意 template: spec: restartPolicy: Never containers: - name: test-job-container image: test-image:0.0.1 imagePullPolicy: IfNotPresent command: - sh - -c - "python3 main.py" env: - name: MYSQL_PASSWORD #jsonをsecretに格納した場合 valueFrom: secretKeyRef: name: test.secret.mysql key: passwd
CronJobの定義
実行環境によりますが毎時起動などで0分もしくは5の倍数分を指定するPJが多い為、若干ずらして指定すると環境に優しいです。
実行後のPOD保管数をsuccessfulJobsHistoryLimit
とfailedJobsHistoryLimit
で指定できます。
もしPOD内にクレデンシャル情報などが生成される場合、不要になった時点で削除しておくと安全かもしれません。
apiVersion: batch/v1beta1 kind: CronJob metadata: name: test-cronjob spec: schedule: "02 * * * *" concurrencyPolicy: Allow startingDeadlineSeconds: 2000 # 開始時刻 + startingDeadlineSeconds までの間に起動可能 successfulJobsHistoryLimit: 3 # 成功したジョブのPOD保管数 failedJobsHistoryLimit: 3 # 失敗したジョブのPOD保管数 jobTemplate: spec: backoffLimit: 1 activeDeadlineSeconds: 3600 # この秒数を超える処理はエラーとなるので注意 template: spec: containers: - name: test-cronjob-container image: test-image:0.0.1 imagePullPolicy: IfNotPresent command: - sh - -c - "python3 main.py" env: - name: MYSQL_PASSWORD valueFrom: secretKeyRef: name: test.secret.mysql key: passwd