K8S
有时候调度一个应用程序进程、一些重复的操作(如发送邮件、告警、验证等)是极为必要的。在server上,通常使用一个cron,它极易设置和维护。
在使用Docker的时候,可以运行crontab来完成以上操作,但当使用Kubernetes应该使用什么组件来进行上述操作呢?
实际上,Kubernetes的运行方式有所不同,因为在负载均衡的情况下可能有一个或多个相同服务的实例,而不管启动多少个实例crontab仅运行一次。另一方面,需要crontab为一个或多个pod的每个进程都运行一次。在Kubernetes中有一个称为CronJob的特性解决了这一问题。
以下示例均基于kind。

创建CronJob

  1. apiVersion: batch/v1beta1
  2. kind: CronJob
  3. metadata:
  4. name: my-cron-job
  5. spec:
  6. schedule: "*/1 * * * *"
  7. jobTemplate:
  8. spec:
  9. template:
  10. spec:
  11. containers:
  12. - name: my-cron-job
  13. image: curlimages/curl
  14. resources:
  15. limits:
  16. cpu: "1"
  17. memory: "300Mi"
  18. requests:
  19. cpu: "1"
  20. memory: "300Mi"
  21. args:
  22. - /bin/sh
  23. - -c
  24. - date; echo "Starting an example of CronJob"; resp=$(curl -I --http2 https://www.google.com) ; echo $resp; exit 0
  25. restartPolicy: Never
  26. successfulJobsHistoryLimit: 3
  27. failedJobsHistoryLimit: 3

CronJob已经创建,它每分钟运行一个curl镜像。
同时,需要设置资源限制(如CPU和内存),如果将AWS、Azure或GCP实例作为args,最好的可视化方式是在Google上进行简单的curl即可。
这一实例永远不会重启,而且成功和失败的历史job都有一个限制,在本例中这一次数设置为3。

  • spec.successfulJobsHistoryLimit:要保留的成功完成的cronjob的数量
  • spec.failedJobsHistoryLimit:要保留的失败的cronjob的数量

如果想了解更多关于CronJob API的信息,强烈建议阅读以下链接中的内容:
https://docs.koki.io/short/resources/cron-job
现在,运行以下命令以在Kubernetes中应用CronJob。

  1. $ kubectl apply -f cronjob.yml

如果没有错误发生,使用以下命令看到最近配置的cronjob:

  1. $ kubectl get cronjob

使用Lens来可视化所有可用的cronjob,它对Kubernetes中的跟踪和监控都非常有用。
2021-05-03-13-48-25-753390.png
查看日志:
2021-05-03-13-48-26-271006.png
运行以下命令即可删除这一条目:

  1. $ kubectl delete cronjob my-cron-job

在本例中运行了一个简单的Cron以及一个实例。
CronJob有一个局限性是需要通过在每个进程中添加一行来为同一进程调度多个CronJob。但是,Kubernetes 1.8 beta中不提供CronJob,必须使用并行机制(parallelism)复制相同的CronJob。对于另一个调度,需要创建另一个cron条目。期待着将来有机会为同一进程调度多个模式。

结 论

Kubernetes CronJob非常有用并且易于学习,可访问以下链接阅读和了解有关API参数的更多信息,并运行一些测试以更好地了解其工作原理:
https://docs.koki.io/short/resources/cron-job/