背景
基于k8s 部署crontab任务,同时支持热加载crontab配置,避免更新crontab配置而导致的更新代码与更新docker 镜像。
执行
公司环境,直接在web页面操作的,删除部分敏感信息且不展示操作命令
1、增加configmap:
metadata:
name: cron-task
data:
crontab-config: >+
0 6 * * * root /usr/local/bin/python3 /opt/work/run.py beg="$(date -d '31 days ago' +"\%Y-\%m-\%d
00:00:00")" >> /var/log/opt_work_run.log 2>&1
2、配置deployment pod,挂载cron-task
kind: Pod
apiVersion: v1
metadata:
spec:
volumes:
- name: task-crontab
configMap:
name: cron-task
items:
- key: crontab-config
path: cronjobs
containers:
volumeMounts:
- name: task-crontab
mountPath: /etc/cron.d/
3、发布pod
一些疑问
1、为什么不用k8s的cronjob?
只能配置一个job,不方便。pod+crontab可以运行多个任务。
2、为什么选择configmap?
操作简单,且比较适合配置内容的文件。除了crontab配置文件,nginx配置文件也是不错的应用。
3、为什么挂载到/etc/cron.d/?
crontab有两个路径
1、/var/spool/cron/crontabs/{username}
- 用户级别任务,crontab指令操作的就是这个文件,文件名等于用户名。
- 权限要求高,可读可写,configmap挂载只有可读权限。
2、/etc/cron.d/
- 系统级任务,文件名任意。
- 权限要求低,只读权限就可以。
4、crontab配置中为什么有转义?
%在crontab配置文件中会换行,导致后面的配置被截断
浙公网安备 33010602011771号