kubectl version --short
kubectl get cronjob report -o jsonpath='{.spec.timeZone}'
kubectl get cronjob report -o jsonpath='{.status.lastScheduleTime}'
CronJob 配了 schedule: '0 9 * * *' 和 timeZone: Asia/Shanghai,实际每天 17 点才触发,Pod 日志里的时间戳是 09:00Z。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。
原因不复杂,CronJob 的 timeZone 字段从 1.27 才进入稳定版,更早的版本会忽略这个字段,按 kube-controller-manager 所在时区解释。字段写了不报错,行为还是老样子。
这次卡住的地方就在「CronJob 时区」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。
一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。
别只看报错的最后一行,往上看几行,真正的起因通常在上面。
处理上按这个顺序:确认集群版本 低于 1.27 就把时间换算成 UTC 再写;升级后补上 timeZone 并重建对象;启动命令里加 date 打印 确认 Pod 内部时区;用 kubectl describe 看 lastScheduleTime 核对。
改完只确认一件事:第二天 9 点整任务触发 lastScheduleTime 显示 01:00Z 与预期一致。
