k8s cron

1、概述

关于定时任务,有多种不同方案,比如第三方包、服务器 cron、k8s cronjob,这里只讲解 k8s cronjob,其他的可以去看相关第三方包资料自行学习

2、项目地址

项目地址:https://github.com/Mikaelemmmm/zerok8scron

我们在项目中集成了 cobra,k8s cronjob 在每次调度的时候直接执行对应 job name 即可

3、关键代码分析

main.go

  1. package main
  2. import (
  3. "zerok8scron/internal/cmd"
  4. )
  5. func main() {
  6. cmd.Execute()
  7. }

internal/cmd/root.go

  1. package cmd
  2. import (
  3. "github.com/spf13/cobra"
  4. "github.com/zeromicro/go-zero/core/conf"
  5. "os"
  6. "zerok8scron/internal/config"
  7. "zerok8scron/internal/logic"
  8. "zerok8scron/internal/svc"
  9. )
  10. const (
  11. codeFailure = 1
  12. )
  13. var (
  14. confPath string
  15. rootCmd = &cobra.Command{
  16. Use: "cron",
  17. Short: "exec cron job",
  18. Long: "exec cron job",
  19. }
  20. // all job ...
  21. helloJob = &cobra.Command{
  22. Use: "hello",
  23. Short: "print 'hello SvcName' once per minute",
  24. RunE: logic.Hello,
  25. }
  26. // add more job , wait for you.....
  27. )
  28. // Execute executes the given command
  29. func Execute() {
  30. if err := rootCmd.Execute(); err != nil {
  31. os.Exit(codeFailure)
  32. }
  33. }
  34. func init() {
  35. // init config
  36. cobra.OnInitialize(initConfig)
  37. rootCmd.PersistentFlags().StringVar(&confPath, "config", "etc/cron.yaml", "config file (default is $HOME/.cobra.yaml)")
  38. // add subcommand
  39. rootCmd.AddCommand(helloJob)
  40. }
  41. func initConfig() {
  42. var c config.Config
  43. conf.MustLoad(confPath, &c)
  44. svc.InitSvcCtx(c)
  45. }

internal/logic/hello.go

  1. package logic
  2. import (
  3. "fmt"
  4. "github.com/spf13/cobra"
  5. "zerok8scron/internal/svc"
  6. )
  7. // Hello print "hello SvcName" once per minute
  8. func Hello(_ *cobra.Command, _ []string) error {
  9. fmt.Printf("srvName : %s , hello \n", svc.GetSvcCtx().Config.Name)
  10. return nil
  11. }

2.1 如何执行调度

可以看到 rootCmd 是主命令 , helloJob 就是我们自己的一个要调度的任务,调度之后要执行的方法就是 logic 下 hello.go 中的方法。

如果需要添加更多的任务,我们直接在下方继续添加,在 logic 中添加对应的实现即可。

2.2 如何初始化配置

我们在执行之前先初始化了配置,看到这里你可能会很眼熟,我们把 go-zero 默认在 main 中的初始化配置放在了此处 initConfig

我们使用默认的配置文件是 etc/cron.yaml

4、运行调度

4.1 本地执行一次

  1. $ go run main.go hello

4.2 docker 中执行一次

  1. $ goctl docker -go main.go #创建dockerfile,如果你用上面的项目,项目中已经创建好可以省略
  2. $ docker build -t zerok8scron:v1 . # 构建镜像,如果你用上面的项目,项目中已经创建好可以省略
  3. $ docker run zerok8scron:v1 hello #运行即可

4.3 k8s 中使用 cronjob 调度一分钟一次

cronjob.yaml

  1. apiVersion: batch/v1
  2. kind: CronJob
  3. metadata:
  4. name: hello
  5. spec:
  6. schedule: "*/1 * * * *"
  7. jobTemplate:
  8. spec:
  9. template:
  10. spec:
  11. containers:
  12. - name: hello
  13. image: zerok8scron:v1
  14. args:
  15. - hello
  16. restartPolicy: OnFailure

执行

  1. $ kubectl apply -f cronjob.yaml

然后可以查看 cronjob 运行状态以及输出