• Kubernetes的Cron Job


    Kubernetes集群使用Cron Job管理基于时间的作业,可以在指定的时间点执行一次或在指定时间点执行多次任务。 一个Cron Job就好像Linux crontab中的一行,可以按照Cron定时运行任务。

    定时任务对我们并不陌生,例如Linux的crontab,各种编程语言都内置了定时任务支持,这在我们应用开发中比较常见,但这种定时任务在分布式系统中使用会有限制,因此需要分布式计划任务。 Kubernetes的CronJob可以理解为Kubernetes对分布式计划任务的支持。

    在使用Cron Job之前需要确认Kubernetes集群的版本>=1.5,因为它还处于alpha,所以还需要对kube-apiserver加入启动参数--runtime-config=batch/v2alpha1=true,开启batch/v2alpha1。 下面我们来试验一下,试验的Kubernetes集群的版本为1.6.8。

    在加入启动参数--runtime-config=batch/v2alpha1=true后,要重启kube-apiserver, kube-controller-manager, kube-scheduler,创建crontab才会被调度

    创建Cron Job

    创建一个简单的CronJob,每隔1分钟打印当前的时间并”say Hello”,cronjob.yaml:

    apiVersion: batch/v2alpha1
    kind: CronJob
    metadata:
      name: hello
    spec:
      schedule: "*/1 * * * *"
      jobTemplate:
        spec:
          template:
            spec:
              containers:
              - name: hello
                image: alpine
                args:
                - /bin/sh
                - -c
                - date; echo Hello from the Kubernetes cluster
              restartPolicy: OnFailure
    

    下面创建这个CronJob:

    kubectl create -f cronjob.yaml
    cronjob "hello" created
    

    查看这个CronJob的状态:

    kubectl get cronjob hello
    NAME      SCHEDULE      SUSPEND   ACTIVE    LAST-SCHEDULE
    hello     */1 * * * *   False     0         <none>
    

    从上面的输出看这个cronjob还没有被调度,等大约1分钟再次查看:

    kubectl get jobs --watch
    NAME               DESIRED   SUCCESSFUL   AGE
    hello-1503321060   1         1            2m
    hello-1503321120   1         1         1m
    hello-1503321180   1         1         36s
    
    
    kubectl get cronjob
    NAME      SCHEDULE      SUSPEND   ACTIVE    LAST-SCHEDULE
    hello     */1 * * * *   False     0         Mon, 21 Aug 2017 21:14:00 +0800
    

    删除Cron Job

    kubectl delete cronjob hello
    cronjob "hello" deleted
    

    kubectl delete -f cronjob.yaml
    

    删除命令会停止已经创建出来的作业,当时正在运行的作业不会被被停止,同时Job和Pod不会被删除:

    kubectl get jobs
    NAME               DESIRED   SUCCESSFUL   AGE
    hello-1503321060   1         1            7m
    hello-1503321120   1         1            6m
    hello-1503321180   1         1            5m
    hello-1503321240   1         1            4m
    hello-1503321300   1         1            3m
    hello-1503321360   1         1            2m
    hello-1503321420   1         1            1m
    

    需要手动删除上面的job,job被删除,它创建出来的Pod也会被删除掉。

    使用kubectl delete jobs --all可以删除当前namespaces下所有的job

    当前Cron Job的限制

    当前一个CronJob在执行期间“大约”创建一个Job,之所以说“大约”是因为在特殊的情况下可能会创建两个或没有Job被创建。Kubernetes官方正在试图使这种情况尽量少发生,但目前还不能保证完全杜绝。 因此如果我们现在使用它,那么Job应该被我们设计成幂等的。

  • 相关阅读:
    一个datagrid中嵌入checkBox典型的例子
    堆排序算法
    堆排序(利用最大堆)
    动态代理模式的实现
    [转载]C#如何实现对外部程序的动态调用
    9.Jmeter 多个threadgroup 中的配置元件会一次性进行初始化
    二十七。
    三十。接口2
    三十三。日志
    大道至简读后感
  • 原文地址:https://www.cnblogs.com/weifeng1463/p/10289237.html
Copyright © 2020-2023  润新知