【Kubernetes】Job・CronJobの設定方法

f:id:tm200:20210611174228p:plain

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保管数をsuccessfulJobsHistoryLimitfailedJobsHistoryLimitで指定できます。
もし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