Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Cron in der Cloud - Die Top 10 Hitparade

Cron in der Cloud - Die Top 10 Hitparade

Die meisten Backend-Systeme führen neben den kontinuierlich laufenden Prozessen die einen Web-Service ausmachen auch zeitlich gesteuerte Prozesse durch. Diese sind notwendig um zu regelmäßigen Zeitpunkten Reports zu generieren, Housekeeping und Backups durchzuführen, E-Mails zu versenden oder Caches neu aufzubauen. Der bekannte cron-Daemon automatisiert solche Prozesse schon fast seit Anbeginn der Computer Ära.

Beim Versuch dieses Tool auf die von Microservices, Cloud und Container getriebene Welt anzuwenden stellen sich jedoch Fragen: Wie kann ich meine cron-Prozesse auf mehrere Instanzen verteilen? Wie garantiere ich die Ausführung des Tasks wenn mein Container jederzeit heruntergefahren und ausgetauscht werden kann? Wie gestalte ich eine rollierende Ausführung über Container hinweg oder garantiere das ein Task nur einmal pro Zeiteinheit in meinem Cluster ausgeführt wird?

Um diese Fragen zu beantworten und für jeden das richtige Tool zu finden, schauen wir uns in diesem Talk zehn verschiedene Optionen für Cloud-Natives cron an. Hierbei bedienen wir uns unter anderem bei Frameworks, Microservices, AWS Cloud Infrastruktur, Serverless Komponenten, Container Orchestrierung und einem Kubernetes Operator. Nebenbei bewerten wir, ganz subjektiv, die „Cloudyness“, die Flexibilität der Lösung, sowie den Aufwand bei Integration und Monitoring.

Alex Krause

December 13, 2018
Tweet

More Decks by Alex Krause

Other Decks in Programming

Transcript

  1. 10. – 13.12.2018 Frankfurt am Main #ittage Cron in der

    Cloud Die Top 10-Hitparade Alex Krause @alex0ptr @alex0ptr
  2. „Jeden Tag um 06:45 Uhr berechnet der Service aus dem

    aktuellen Datenbestand die Menge der reservierten Kontingente. Der resultierende Report soll persistiert und per eMail an den Fachbereich gesendet werden. “ @alex0ptr
  3. @alex0ptr Availability zone VPC Subnet Availability zone Subnet Subnet Auto

    Scaling Group Subnet Instances Instances DB instance DB instance standby Application Load Balancer NAT gateway NAT gateway Application Load Balancer
  4. @alex0ptr FROM alpine RUN apk add --no-cache curl CMD ["sh",

    "-c", "crontab /etc/cron/crontab; crond -f -d 8"] --- apiVersion: apps/v1 kind: Deployment […] spec: […] spec: containers: - name: cron image: cron imagePullPolicy: IfNotPresent volumeMounts: - name: config mountPath: /etc/cron/ volumes: - name: config configMap: name: crontab --- apiVersion: v1 kind: ConfigMap metadata: name: crontab data: crontab: | */1 * * * * curl myservice.local/job/crontainer
  5. @alex0ptr // define the job and tie it to our

    MyJob class JobDetail job = newJob(MyJob.class) .withIdentity("job1", "group1") .build(); // Trigger the job to run now, and then repeat every 40 seconds Trigger trigger = newTrigger() .withIdentity("trigger1", "group1") .startNow() .withSchedule(simpleSchedule() .withIntervalInSeconds(40) .repeatForever()) .build(); // Tell quartz to schedule the job using our trigger scheduler.scheduleJob(job, trigger);
  6. 2 Zutaten 1. Scheduler (z.B. cron, Quartz) 2. Verteilter Lock

    (z.B. etcd, Hazelcast, Redis) 3. Viel Arbeit @alex0ptr
  7. Golang + Postgres https://github.com/rafaeljesus/crony “Crony works by calling back to

    your application via HTTP GET according to a schedule constructed by you or your application.”
  8. Bash + Redis = http://github.com/kvz/cronlock “Uses a central Redis server

    to globally lock cronjobs across a distributed system. This can be usefull if you have 30 webservers that you deploy crontabs to (such as mailing your customers), but you don't want 30 cronjobs spawned.” echo '0 8 * * * CRONLOCK_HOST=redis.mydomain.com cronlock /var/www/mail_customers.sh' | crontab
  9. Type: AWS::AutoScaling::ScheduledAction Properties: AutoScalingGroupName: recalc-world-cron-group DesiredCapacity: 1 Recurrence: 45 6

    * * * Auto Scaling Group Auto Scaling Group Instance Role assume autoscaling:DetachInstances
  10. #!/bin/bash set -e set -u set -o pipefail function finish

    { shutdown -h now } trap finish EXIT aws autoscaling detach-instances \ --instance-ids $(curl http://169.254.169.254/latest/meta-data/instance-id) --auto-scaling-group-name recalc-world-cron-group --should-decrement-desired-capacity . ./expensive-task.sh
  11. service: cron-serverless provider: name: aws runtime: java8 package: artifact: target/cron-dev.jar

    functions: cron: handler: com.serverless.Handler events: - schedule: rate(1 minutes)
  12. --- apiVersion: batch/v2alpha1 kind: CronJob metadata: name: scheduled-job spec: schedule:

    "*/20 * * * *" jobTemplate: spec: template: metadata: labels: parent: "scheduled-kill-core" spec: serviceAccountName: scheduled-kill-core containers: - name: scheduled-kill-core image: widerin/openshift-cli command: ["/bin/sh"] args: - "-c" - > oc patch deployment core -p "{[…]}" restartPolicy: Never
  13. krondor ‣ Drop-In Lösung ‣ HTTP Integration ‣ Kubernetes (first)

    ‣ Eingebautes Monitoring ‣ At-least-once ‣ Retries mit Back-Off @alex0ptr
  14. CRD Pod Pod Pod Pod krondor # krongroup reservations -

    - - name: reservations selector: matchLabels: app: http-container jobs: - name: release-unpaid-seats endpoint: [...] schedule: PT1M - name: mail-stakeholders endpoint: [...] [...] 1. reads 2. discover reservations 3. http call
  15. QAware GmbH Mainz Rheinstraße 4 D 55116 Mainz Tel.: +49

    (0) 6131 215 69 – 0 Fax: +49 (0) 6131 215 69 – 68 xing.com/companies/qawaregmbh linkedin.com/company/qaware-gmbh slideshare.net/qaware twitter.com/qaware github.com/qaware youtube.com/qawaregmbh
  16. QAware GmbH München Aschauer Straße 32 81549 München Tel.: +49

    (0) 89 23 23 15 – 0 Fax: +49 (0) 89 23 23 15 – 129 xing.com/companies/qawaregmbh linkedin.com/company/qaware-gmbh slideshare.net/qaware twitter.com/qaware github.com/qaware youtube.com/qawaregmbh