k8s 定时任务 cronjob 执行时间相差八小时
我想要每天十点执行一个定时任务,就编写了这个 cronjob。十点钟时没有执行,查看日志发现在两点已经执行过了。
apiVersion: batch/v1
kind: CronJob
metadata:
name: test-cronjob
spec:
schedule: "00 10 * * *"
successfulJobsHistoryLimit: 20 # 保留最近 20 次成功的任务
failedJobsHistoryLimit: 0 # 保留所有失败的任务
jobTemplate:
spec:
template:
spec:
containers:
- name: alpine
image: alpine:latest
imagePullPolicy: IfNotPresent
command: ["/bin/sh", "-c"]
args:
- |
date
TZ=Asia/Shanghai date
date "+%Y%m%d%H00"
TZ=Asia/Shanghai date "+%Y%m%d%H00"
restartPolicy: Never
查看文档发现如果不指定 .spec.timeZone
将会根据 kube-controller-manager
基于本地时区进行调度执行。
而 kube-controller-manager
默认是 UTC
时区,所以会早八小时。
解决方式:
如果 k8s 版本大于 1.27,可以在 spec
中添加 timeZone
字段,指定时区。
apiVersion: batch/v1
kind: CronJob
metadata:
name: test-cronjob
spec:
schedule: "00 10 * * *"
successfulJobsHistoryLimit: 20 # 保留最近 20 次成功的任务
failedJobsHistoryLimit: 0 # 保留所有失败的任务
timeZone: Asia/Shanghai
jobTemplate:
...
如果 k8s 版本小于 1.27
方法 1:修改 kube-controller-manager
的时区配置
修改 所有 master 物理机 /etc/kubernetes/manifests/kube-controller-manager.yaml
的文件
volumeMounts:
- mountPath: /etc/localtime
name: shanghai-timezone
readOnly: true
...
volumes:
- hostPath:
path: /usr/share/zoneinfo/Asia/Shanghai
type: File
name: shanghai-timezone
方法 2:把任务执行时间提前 8 小时