This page is read only. You can view the source, but not change it. Ask your administrator if you think this is wrong. ~~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:<code> 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 </code> * Bouw het image <code bash> docker build -f ./Dockerfile -t <repository-url>/<repo>/<image-naam>:<tag> </code> * Push het image <code bash> docker push <repository-url>/<repo>/<image-naam>:<tag> </code> ===== 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: <code yaml> apiVersion: v1 kind: ConfigMap metadata: name: my-crontab data: crontab: | * * * * * echo "Hello from job 1" */5 * * * * echo "Hello from job 2" </code> 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: <code yaml> 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 </code> 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: <code bash> oc create -f ./configmap.yaml -n <my-namespace> oc create -f ./deployment.yaml -n <my-namespace> </code> Je kan vervolgens de logs van de Pod opvragen om te zien of je cronjob werkt <code bash> oc get pods -n <my-namespace> 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 * * * *" ... </code> Mocht je aanpassingen hebben gedaan in de ConfigMap, dan moet je de Deployment even herstarten, anders worden de aanpassingen niet ingelezen: <code bash> oc rollout restart deployment/my-cronjob -n <my-namespace> </code> chp/cronjobs-met-supercronic.txt Last modified: 2026/05/27 14:01by 127.0.0.1 Log In