先看现象。定时任务写的是 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,调度记录与预期一致。
时区问题会连着出现两次,一次在调度一次在日志展示,先把容器时区统一再谈表达式。报错文案容易误导,真正的原因往往在相邻那一层的日志里。
