Manages multiple CronJobs with same image, but different commands and workdirs. Supports mounting of persistent volume to save results somewhere, ENV variables configmaps, concurrency and restart policy.
Makefile
and change images registry to yours, then run make && make push
docker build -t cron-operator .
to make image and push to your repo laterYou can find images here https://hub.docker.com/r/iam21h/cron-operator. Pin version number in operator.yaml
if you do not want automaticaly get new features and bugs.
Edit files and run:
kubectl -f deploy/crds/blindage_v1alpha1_cronop_crd.yaml
kubectl -f deploy/clusterrole.yaml
kubectl -f deploy/clusterrole_binding.yaml # edit service account namespace here
kubectl -n operators -f deploy/service_account.yaml
kubectl -n operators -f deploy/operator.yaml
or use Helm:
helm repo add 21h https://charts.blindage.org
helm repo update
helm install cron-operator 21h/cron-operator -n operators
Change operator.yaml
if you want operator watch only specified namespace. Check deploy
directory, may be you want to use Role instead of ClusterRole.
In your CronOp
resource you can set image, parameters and tasks. CronJobs is a result of reconciling tasks section, some parameters can be global and overrided in each task. Remember, CronJob, Pod and Job is a different things.
Look into pkg/apis/blindage/v1alpha1/cronop_types.go
for your CustomResource syntax and comments.
This parameters can be set in global section or each task:
Set Configmap with ENV variables
envConfigmap
: default empty | string
Mount configmap as files
mountConfigmap
: default empty | string
mountConfigmapPath
: by default mounts to /configmap-local | string
Mount secret as files
mountSecret
: default empty | string
mountSecretPath
: by default mounts to /secret-local | string
mountSecretPermissions
: default permissions, use decimal notation, default 256 | integer
How to restart Pod
restartPolicy
: OnFailure | Never | Always
Limit Job restarts
backoffLimit
: 0 | integer
Allow Cronjob to run concurrent Jobs
concurrencyPolicy
: Allow | Forbid | Replace
Set standard kubernetes Pod security context
podSecurityContext
: default empty
Global history limits:
Also you can save intermediate results in mounted persistent volume. You can set PVC name with PersistentVolumeName
, mount point with PersistentVolumePath
and PersistentVolumeSubPath
. It's easy.
Global affinity, node selection and tolerations, have standard kubernetes specs:
Global resource limiting also kubernetes standard, but separated:
Operator automatically copies labels from CR meta to Cronjob, Job and Pod.
Also you cat set annotations
in CR spec to set it for Pod and merge it with individual task annotations:
---
apiVersion: blindage.org/v1alpha1
kind: CronOp
metadata:
name: mycron
labels:
my-application: python-app
spec:
image: "python:3"
annotations:
co.elastic.logs.backup/multiline.match: after
co.elastic.logs.backup/multiline.negate: "true"
co.elastic.logs.backup/multiline.pattern: ^\[
tasks:
- name: print-test
annotations:
logger: do-not-log
commands: ['python','-c', 'print("testtesttest")']
schedule: "* * * * *"
Good sample you can find in deploy/test-cron.yaml
, see it in case of questions.
This resource can help you run your first tasks:
---
apiVersion: blindage.org/v1alpha1
kind: CronOp
metadata:
name: mycron
labels:
app: python
service: testing-cron
spec:
image: "python:3"
tasks:
- name: print-test
commands: ['python','-c', 'print("doing nothing")']
schedule: "* * * * *"
- name: hello
commands: ['python','-c', 'print("hello world hourly")']
schedule: "0 * * * *"
If you delete this resource operator will delete CronJobs and Jobs.
Copyright by Vladimir Smagin (21h) 2019
http://blindage.org email: 21h@blindage.org
Project page: https://git.blindage.org/21h/cron-operator