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