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