zoukankan      html  css  js  c++  java
  • 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应该被我们设计成幂等的。

  • 相关阅读:
    Saltstack module apache 详解
    Saltstack module ip 详解
    Saltstack module iosconfig 详解
    Saltstack module introspect 详解
    Saltstack module inspector 详解
    Saltstack module ini 详解
    Saltstack module incron 详解
    Modbus 指令 RS485指令规则
    停车系统对接第三方在线支付平台(二)
    停车系统对接第三方在线支付平台
  • 原文地址:https://www.cnblogs.com/weifeng1463/p/10289237.html
Copyright © 2011-2022 走看看