先看现象。定时任务写的是 0 0 * * *,日志里每天 08:00 才执行,容器里 TZ 是 UTC,业务要的是北京时间零点出报表。

真正麻烦的地方在于,几个原因的现象几乎一样。容器时区是 UTC,cron 按系统时区解释。也可能是cron 进程不读外部 TZ 变量。

还有一种情况,K8s 的 schedule 按 kubelet 所在时区走。

另外,日志时间戳按本地渲染,看起来又差一次。

先确认运行环境时区

date; cat /etc/timezone

给容器显式挂时区

kubectl set env deploy/report TZ=Asia/Shanghai

然后把表达式改成对应 UTC 的时间

kubectl patch cronjob report --type merge -p '{"spec":{"schedule":"0 16 * * *"}}'

手动触发一次核对执行时间

kubectl create job --from=cronjob/report report-manual

命令输出我都留了记录,免得改完记不清原来的值。

改之前先确认了最近有没有人动过配置,避免白查一遍。

这次没动代码,只在配置和运行环境上找原因。

改完先别撤,确认这几项。报表在北京时间零点前后五分钟内生成,Pod 内 date 显示 +0800,调度记录与预期一致。

时区问题会连着出现两次,一次在调度一次在日志展示,先把容器时区统一再谈表达式。报错文案容易误导,真正的原因往往在相邻那一层的日志里。

作者 9823189