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

results matching ""

    No results matching ""