GKE上でCronJobを構築する

前回の続き




Hello GKE(k8s) Cronjob



https://kubernetes.io/docs/tasks/job/automated-tasks-with-cron-jobs/

cronjob.yaml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            args:
            - /bin/sh
            - -c
            - date; echo Hello from the Kubernetes cluster
          restartPolicy: Never

1分毎にシェルスクリプトで日付と文字列を出力する。
デフォルトUTCなので時間指定だと-9時間ずれる。

restartPolicy: OnFailure で失敗した時のみ再実行
restartPolicy: Never でCronに従って無限実行
1回以上実行される可能性があるらしくソースコードで制御が必要。

kubectl apply -f cronjob.yaml
kubectl get pods
kubectl logs ポッド名

GCPのログビューワでも確認可能
https://console.cloud.google.com/logs/viewer

(base) MacBook-Pro:xxx xxxxx$ kubectl get pods
NAME READY STATUS RESTARTS AGE
hello-1596432060-ld2lh 0/1 Completed 0 2m36s
hello-1596432120-hfrxk 0/1 Completed 0 96s
hello-1596432180-dmhq6 0/1 Completed 0 36s

kubectl logs hello-dmhq6

ポッドごとに実行されているのかと思いきやどんどん作られて破棄されているらしい。
しばらくするとポッド単位のログが確認できなくなる。
以下数分後のポッドの状態(hello-1596432180-dmhq6のみ残っている)

(base) MacBook-Pro:xxx xxxxx$ kubectl get pods
NAME READY STATUS RESTARTS AGE
hello-1596432180-dmhq6 0/1 Completed 0 2m42s
hello-1596432240-gfp55 0/1 Completed 0 101s
hello-1596432300-g7m5j 0/1 Completed 0 41s




GKE(k8s)のCronjobでNode.jsを動かす



cronjob-example.yaml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: example-job
spec:
  concurrencyPolicy: Replace
  schedule: "*/1 * * * * "
  jobTemplate:
    spec:
      template:
        spec:
          containers:
            -
              name: example-job
              image: gcr.io/[プロジェクトID]/example-job
              env:
                - name: TZ
                  value: Asia/Tokyo
          restartPolicy: Never
      backoffLimit: 1

envでライムゾーンを設定している。ただし注意事項がある(後述)
backoffLimitは失敗時のリトライ回数。
imageは後ほどビルドするイメージの場所を指定する。

Node.jsのDockerイメージを作成


job/test.js
console.log("crontest")


Dockerfile-job

FROM node:12
COPY job /job
CMD node job/test.js

ビルドはCloud buildsを使用しているがイメージさえ用意できればなんでもいい
cloudbuild-job.yaml
steps:
# docker build
- name: 'gcr.io/cloud-builders/docker'
  args: ['build', "-f", "Dockerfile-job", '-t', 'gcr.io/$PROJECT_ID/example-job', '.']

# push built images to Container Registry
images: ['gcr.io/$PROJECT_ID/example-job']

ビルド
gcloud builds submit --config=cloudbuild-job.yaml . 

Cronjobを動かす


kubectl apply -f cronjob-example.yaml 

動作確認

kubectl get pods
kubectl logs exaple-job-xxxx



バッチ起動時間についての注意事項



デフォルトだとUTC。日本時間だと-9時間ずれる。12時に設定していた場合は3時に起動する。
https://kubernetes.io/ja/docs/concepts/workloads/controllers/cron-jobs/
kube-controller-managerのタイムゾーンに基づいています

俺関係ねーしサポートしねーよ的な感じになってる?
https://github.com/kubernetes/kubernetes/issues/47202

どうも不備を抱えたまま放置されているように見える。
マスターのタイムゾーンを参照するとドキュメントに書いてあるが参照していないらしい。
https://github.com/kubernetes/kubernetes/issues/78795


タイムゾーンが適用されないのはジョブの実行時間のみで例えばスクリプト上で日付を取得した場合は設定したタイムゾーンで取得可能。

2020年9月7日月曜日