AnyRobot作为一款强大的日志收集分析系统,某些关键配置文件需要定期备份,比如备份到本地、备份到存储,那AnyRobot是如何实现关键配置文件定期备份的呢,大家都知道,AnyRobot采用K8S云原生架构,通过K8s丰富的controller之CronJob来实现关键配置文件的定期备份,接下来我们重点来了解CronJob,了解CronJob,我们必须得了解Job。
一、CronJob
在 Kubernetes 中,CronJob 控制器是一种非常有用的资源,它可以用来定期执行任务,例如备份数据、清理日志、定时拉取数据等,基于 Cron 定时任务的机制,CronJob主要有以下场景:
- 定期备份数据库或文件系统;
- 定时发送通知或警报;
- 定期清理过期的日志或缓存数据;
- 定时拉取或更新数据,例如镜像、代码库等。
Cron 表达式包含 5 个或 6 个字段,分别表示分钟、小时、日期、月份、星期几以及可选的年份。每个字段的取值范围不同,可以使用通配符、逗号、连字符等方式进行配置。 以下是几个 Cron 表达式的示例:
- 每分钟执行一次任务: * * *
- 每小时执行一次任务:0 * *
- 每天凌晨 1 点执行任务:0 1 * * *
- 每周一凌晨 1 点执行任务:0 1 * * 1
- 每月 1 号凌晨 1 点执行任务:0 1 1 * *
- 每年 1 月 1 号凌晨 1 点执行任务:0 1 1 1 *
- 星号(*)表示匹配任意值,逗号(,)表示列举多个取值,连字符(-)表示指定一个取值范围。需要注意的是,CronJob 控制器只支持最小粒度为分钟,不能配置秒级别的定时任务。
二、Job
Job主要用于负责批量处理短暂的一次性任务,它具备以下特点:
- 当Job创建的Pod执行成功结束时,Job将记录成功结束的Pod数量;
- 当成功结束的Pod达到指定的数量时,Job将完成执行。
Job有几个场景化的关键参数
- restartPolicy:Never,表示永不重试;
- restartPolicy:Never, backoffLimit: 4,表示如果失败,最大重试次数是4;
- activeDeadlineSeconds:100, 表示pod最多可运行100秒;
- completions:8,parallelism:2,表示完成8次,同时只能有2个job并行运行。
三、CronJob和Job关系
CronJob控制器以Job控制器为其管控对象,并借助它管理Pod资源对象。Job控制器定义的作业任务在其控制器资源创建之后便会立即执行,但是CronJob以类似Linux操作系统的周期性任务作业计划的方式,控制器运行时间点及重复运行的方式。

CronJob资源清单模版如下:
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: jon-controller # CronJob名称
namespace: dev # CronJob所属的命名空间
labels: # 给CronJob打标签
controller: cronjob
spec:
schedule: "*/5 * * * * " # cron格式的Job调度运行时间点,用于控制Job定时运行时间
concurrencyPolicy: Forbid # Job并发执行策略
failedJobsHistoryLimit: 4 # 为失败的Job保留的历史记录数,默认为1
successfulJobsHistoryLimit: 4 # 为成功的Job保留的历史记录数,默认为3
jobTemplate: # job控制器模板,用于为cronjob控制器生成job对象
metadata: {}
spec:
completions: 5 # 指定Job需要成功运行Pod的总次数,默认为1
parallelism: 23 # 指定Job在任一时刻能够并发运行Pod的数量,默认为1
activeDeadlineSeconds: 120 # 指定Job可以运行的时间期限,超过时间还没结束,系统将会尝试进行终止
backoffLimit: 5 # 指定Job失败后进行重试的次数,默认为6
template: # pod副本创建模板。属性和Pod的属性一样
spec:
restartPolicy: Never # 重启策略只能设置为Never或OnFailure
containers:
- name: busybox
image: busybox:latest
command: [ "/bin/sh", "-c", "for i in 1 2 3 ; do echo $i; sleep 3; done" ]
schedule属性说明:Cronjob表达式,用于指定Job的执行时间
concurrencyPolicy属性说明:Job并发执行策略
- Allow:允许Job并发运行(默认)
- Forbid:禁止并发运行,如果上一次运行尚未完成,则跳过下一次运行
- Replace:替换,取消当前正在运行的作业并使用新作业替换它
四、具体应用示例
以AnyRobot中kubernetes关键文件进行定期备份为例,可以看到在proton命名空间里面有一个名为proton-cs-backup-arnode的定期Cronjob,并且周期在运行。
1、查看proton-cs-backup-arnode Cronjob任务
[root@arnode ~]# kubectl get cj -n proton
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
proton-cs-backup-arnode 30 18 * * * False 0 13h 38d
2、查看proton-cs-backup-arnode详细配置文件
apiVersion: batch/v1
kind: CronJob
metadata:
generation: 1
name: proton-cs-backup-arnode
namespace: proton
spec:
concurrencyPolicy: Forbid
failedJobsHistoryLimit: 1
jobTemplate:
metadata:
creationTimestamp: null
spec:
template:
metadata:
creationTimestamp: null
spec:
containers:
- command:
- proton-cs-backup
- backup
- --limit=7
- --directory=/var/lib/proton-cs/backup
- --prefix=
image: registry.aishu.cn:15000/proton/proton-cs-backup:v1.1.3
imagePullPolicy: IfNotPresent
name: backup
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /var/lib/proton-cs/backup
name: backup-directory
- mountPath: /etc/kubernetes
name: k8s-dir
- mountPath: /var/lib/kubelet
name: kubelet-run-directory
- mountPath: /usr/share/zoneinfo
name: zoneinfo
- mountPath: /etc/localtime
name: localtime
dnsPolicy: ClusterFirst
hostNetwork: true
nodeName: arnode
restartPolicy: OnFailure
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
volumes:
- hostPath:
path: /var/lib/proton-cs/backup
type: ""
name: backup-directory
- hostPath:
path: /etc/kubernetes
type: ""
name: k8s-dir
- hostPath:
path: /var/lib/kubelet
type: ""
name: kubelet-run-directory
- hostPath:
path: /usr/share/zoneinfo
type: ""
name: zoneinfo
- hostPath:
path: /etc/localtime
type: ""
name: localtime
schedule: 30 18 * * *
startingDeadlineSeconds: 3600
successfulJobsHistoryLimit: 3
suspend: false
3、查看对应的job
[root@arnode ~]# kubectl get job -n proton
NAME COMPLETIONS DURATION AGE
proton-cs-backup-arnode-28377750 1/1 6s 2d14h
proton-cs-backup-arnode-28379190 1/1 7s 38h
proton-cs-backup-arnode-28380630 1/1 7s 14h
4、目录定期生成配置文件备份
[root@arnode ~]# ls /var/lib/proton-cs/backup
2023-12-12-02-30-01.tar.gz 2023-12-13-02-30-01.tar.gz 2023-12-14-02-30-01.tar.gz 2023-12-15-02-30-01.tar.gz 2023-12-16-02-30-01.tar.gz 2023-12-17-02-30-01.tar.gz 2023-12-18-02-30-01.tar.gz
5、解压其中一个配置文件,发现均为kubernetes相关配置文件备份
etcd-snapshot.db
rootfs/
rootfs/etc/
rootfs/etc/kubernetes/
rootfs/etc/kubernetes/admin.conf
rootfs/etc/kubernetes/controller-manager.conf
rootfs/etc/kubernetes/kubelet.conf
rootfs/etc/kubernetes/manifests/
rootfs/etc/kubernetes/manifests/etcd.yaml
rootfs/etc/kubernetes/manifests/kube-apiserver.yaml
rootfs/etc/kubernetes/manifests/kube-controller-manager.yaml
rootfs/etc/kubernetes/manifests/kube-scheduler.yaml
rootfs/etc/kubernetes/pki/
rootfs/etc/kubernetes/pki/apiserver-etcd-client.crt
rootfs/etc/kubernetes/pki/apiserver-etcd-client.key
rootfs/etc/kubernetes/pki/apiserver-kubelet-client.crt
rootfs/etc/kubernetes/pki/apiserver-kubelet-client.key
rootfs/etc/kubernetes/pki/apiserver.crt
rootfs/etc/kubernetes/pki/apiserver.key
rootfs/etc/kubernetes/pki/ca.crt
rootfs/etc/kubernetes/pki/ca.key
rootfs/etc/kubernetes/pki/etcd/
rootfs/etc/kubernetes/pki/etcd/ca.crt
rootfs/etc/kubernetes/pki/etcd/ca.key
rootfs/etc/kubernetes/pki/etcd/healthcheck-client.crt
rootfs/etc/kubernetes/pki/etcd/healthcheck-client.key
rootfs/etc/kubernetes/pki/etcd/peer.crt
rootfs/etc/kubernetes/pki/etcd/peer.key
rootfs/etc/kubernetes/pki/etcd/server.crt
rootfs/etc/kubernetes/pki/etcd/server.key
rootfs/etc/kubernetes/pki/front-proxy-ca.crt
rootfs/etc/kubernetes/pki/front-proxy-ca.key
rootfs/etc/kubernetes/pki/front-proxy-client.crt
rootfs/etc/kubernetes/pki/front-proxy-client.key
rootfs/etc/kubernetes/pki/sa.key
rootfs/etc/kubernetes/pki/sa.pub
rootfs/etc/kubernetes/scheduler.conf
rootfs/var/
rootfs/var/lib/
rootfs/var/lib/kubelet/
rootfs/var/lib/kubelet/config.yaml
rootfs/var/lib/kubelet/kubeadm-flags.env
rootfs/var/lib/kubelet/pki/
rootfs/var/lib/kubelet/pki/kubelet-client-2023-11-09-19-14-34.pem
rootfs/var/lib/kubelet/pki/kubelet-client-current.pem
rootfs/var/lib/kubelet/pki/kubelet.crt
rootfs/var/lib/kubelet/pki/kubelet.key
metadata.yaml
正如上述文章说述,AnyRobot通过K8S Cronjob和Job相结合,实现关键数据文件的自动周期性备份。