~~META:
title = Cronjobs met Supercronic
~~
====== Cronjobs met Supercronic ======
Er draaien in het OpenShift cluster veel cronjobs. Deze cronjobs
hebben een relatief hoge impact op de resources van het OpenShift
cluster. Niet zozeer door de taken die uitgevoerd worden, maar wel door
de overhead van het starten (en ook weer stoppen) van containers. Veel
daarvan worden op exact hetzelfde tijdstip gestart (denk aan de eerste
minuut van een uur bijvoorbeeld) en worden ook vaak elke 5 minuten,
of soms vaker uitgevoerd. Dit zorgt voor veel overhead en daarmee
overlast en maakt het nodig om te kijken naar alternatieve oplossingen.
Om deze impact te verlagen bevelen we het gebruik van Supercronic
aan. Met deze implementatie blijft er continue een container draaien
en voert deze de taak (of meer dan 1 taak) uit volgens het gewenste
interval. Een langdurig draaiende container (maar die niet altijd
bezig is) geeft veel minder overhead dan een container die opgestart
moet worden om (vaak) een eenvoudige taak uit te voeren.
Op deze pagina leggen we uit hoe je een Cronjob kan maken met behulp
van Supercronic. Voor gedetailleerde handleiding van Supercronic
zelf kan je [[https://github.com/aptible/supercronic|hier]] hun
documentatie lezen.
===== Beschikbaarheid ======
We hebben Supercronic beschikbaar gesteld in de volgende van onze Docker images:
* registry.npohosting.nl/npohosting/base-supercronic:0.2
* registry.npohosting.nl/npohosting/php-fpm:8.1
* registry.npohosting.nl/npohosting/php-fpm:8.2
* registry.npohosting.nl/npohosting/php-fpm:8.3
Je kan ook zelf Supercronic installeren in een docker image. In
onderstaande voorbeeld installeren we Supercronic in ons nginx image:
* Maak eerst een ''Dockerfile'' aan:
FROM registry.npohosting.nl/npohosting/nginx:1.27
USER 0
# Latest releases available at https://github.com/aptible/supercronic/releases
ENV SUPERCRONIC_URL=https://github.com/aptible/supercronic/releases/download/v0.2.33/supercronic-linux-amd64 \
SUPERCRONIC_SHA1SUM=71b0d58cc53f6bd72cf2f293e09e294b79c666d8 \
SUPERCRONIC=supercronic-linux-amd64
RUN curl -fsSLO "$SUPERCRONIC_URL" \
&& echo "${SUPERCRONIC_SHA1SUM} ${SUPERCRONIC}" | sha1sum -c - \
&& chmod +x "$SUPERCRONIC" \
&& mv "$SUPERCRONIC" "/usr/local/bin/${SUPERCRONIC}" \
&& ln -s "/usr/local/bin/${SUPERCRONIC}" /usr/local/bin/supercronic
USER 1001
* Bouw het image
docker build -f ./Dockerfile -t //:
* Push het image
docker push //:
===== Gebruik =====
Het gebruik van Supercronic is vrij eenvoudig. We hebben een voorbeeld
staan in GitHub: https://github.com/npohosting/supercronic. Supercronic
bestaat uit twee onderdelen:
* Een ConfigMap met daarin de crontab die moet draaien.
* Een Deployment die de Supercronic container draait
==== De ConfigMap ====
Een basis ConfigMap ziet er als volgt uit:
apiVersion: v1
kind: ConfigMap
metadata:
name: my-crontab
data:
crontab: |
* * * * * echo "Hello from job 1"
*/5 * * * * echo "Hello from job 2"
Zoals te zien is kunnen er meerdere regels worden toegevoegd aan de crontab, zo kunnen meerdere cronjobs in dezelfde container draaien.
==== De Deployment ====
De Deployment ziet er als volgt uit:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-cronjob
spec:
selector:
matchLabels:
app: my-cronjob
template:
metadata:
labels:
app: my-cronjob
spec:
containers:
- name: my-cronjob
image: registry.npohosting.nl/npohosting/base-supercronic:latest
command:
- /usr/local/bin/supercronic
args:
- /config/crontab
resources:
limits:
memory: "128Mi"
cpu: "500m"
requests:
memory: "128Mi"
cpu: "500m"
volumeMounts:
- name: my-crontab
mountPath: /config
volumes:
- name: my-crontab
configMap:
name: my-crontab
De Deployment hierboven is wat je minimaal nodig hebt. Je kan hier
natuurlijk het image aanpassen naar wat nodig is, je kan hier nog extra
persistent volumes aan koppelen, eventuele environment variabelen,
noem het maar op, alles wat je nodig hebt. Probeer wel de naam van
de Deployment te veranderen naar een duidelijke naam.
Wanneer de ConfigMap en Deployment naar wens zijn gemaakt kan je deze
instellen in OpenShift:
oc create -f ./configmap.yaml -n
oc create -f ./deployment.yaml -n
Je kan vervolgens de logs van de Pod opvragen om te zien of je cronjob werkt
oc get pods -n
NAME READY STATUS RESTARTS AGE
my-cronjob-59d65bc547-5bn4m 1/1 Running 0 44m
oc logs -f my-cronjob-59d65bc547-5bn4m -n my-namespace
...
time="2023-09-26T06:34:00Z" level=info msg=starting iteration=42 job.command="echo \"Hello from job 1\"" job.position=0 job.schedule="*/1 * * * *"
time="2023-09-26T06:34:00Z" level=info msg="Hello from job 1" channel=stdout iteration=42 job.command="echo \"Hello from job 1\"" job.position=0 job.schedule="*/1 * * * *"
time="2023-09-26T06:34:00Z" level=info msg="job succeeded" iteration=42 job.command="echo \"Hello from job 1\"" job.position=0 job.schedule="*/1 * * * *"
...
Mocht je aanpassingen hebben gedaan in de ConfigMap, dan moet je
de Deployment even herstarten, anders worden de aanpassingen niet
ingelezen:
oc rollout restart deployment/my-cronjob -n