我想要每天十点执行一个定时任务,就编写了这个 cronjob。十点钟时没有执行,查看日志发现在两点已经执行过了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
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 字段,指定时区。
1
2
3
4
5
6
7
8
9
10
11
|
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 的文件
1
2
3
4
5
6
7
8
9
10
|
volumeMounts:
- mountPath: /etc/localtime
name: shanghai-timezone
readOnly: true
...
volumes:
- hostPath:
path: /usr/share/zoneinfo/Asia/Shanghai
type: File
name: shanghai-timezone
|
方法 2:把任务执行时间提前 8 小时