
我想要每天十点执行一个定时任务，就编写了这个 cronjob。十点钟时没有执行，查看日志发现在两点已经执行过了。

```yaml
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` 字段，指定时区。

```yaml
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` 的文件

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

