ᕕ( ᐛ )ᕗ Jimyag's Blog

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 小时

#k8s