先前的博客: Kubernetes中Cron任务的一些使用中介绍了cron任务的基本使用. 但是在使用过程中发现, 定时在早晨八点的任务, 会在下午被执行, 因为相差正好8个小时, 猜想很可能是时区问题

文档

遇到这个问题我直接去找文档来看了: CronJob.

这个文档的更新来来回回持续了很久, 文档总在纠结定时任务的执行以什么为参照, 下面的内容是2020-3月份以后更新的一版, 我不贴之前的错误版本了, 只贴一个正确的版本:

1
2
3
4
Caution:
All CronJob schedule: times are based on the timezone of the kube-controller-manager.

If your control plane runs the kube-controller-manager in Pods or bare containers, the timezone set for the kube-controller-manager container determines the timezone that the cron job controller uses.

中文翻译的版本一直没人更新, 我也帮忙更新了一下:

1
2
3
4
警告:
所有 CronJob 的 schedule: 时间都是基于初始 Job 的主控节点的时区。

如果你的控制平面在 Pod 或是裸容器中运行了主控程序 (kube-controller-manager), 那么为该容器设置的时区将会决定定时任务的控制器所使用的时区。

解决方案

既然得知了定时任务的调度与control-manager的容器时区相关, 那么, 考虑修改该容器的时区就可以了. 涉及到维护性的问题, 直接基于原始镜像构建新的镜像.

1
2
3
4
5
6
FROM <dockerhub>/fengyuhao/kube-controller-manager:v1.17.0

ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update && apt-get install -y tzdata
RUN ln -fs /usr/share/zoneinfo/Asia/Hong_Kong /etc/localtime
RUN dpkg-reconfigure -f noninteractive tzdata
1
docker build . -t <dockerhub>/fengyuhao/kube-controller-manager:hk-v1.17.0

而后针对kuberetes的master机器, 更改control-manager配置, kubernetes会自动应用新的配置

1
2
#  文件位置:/etc/kubernetes/manifests/kube-controller-manager.yaml
image: <dockerhub>/fengyuhao/kube-controller-manager:hk-v1.17.0

请各位自己替换对应的dockerhub以及镜像地址.

可以用kubectl -n kube-system get pods进行确认控制器的更新.