Günstigste und einfachste Möglichkeit, einen regelmäßigen Docker-Prozess auszuführen


7

Ich habe einen dockerisierten Python-Prozess, den ein Client ein- oder zweimal im Monat ausführen möchte. Es ruft eine Reihe von Google-APIs auf und speichert die Ergebnisse in einem Google Sheet. Netzwerkanforderungen werden nicht akzeptiert. Ich möchte einen "magischen Knopf" bereitstellen, der den Docker-Container hochfährt und dann alles herunterfährt.

Einige Hintergrundinformationen: Ich hatte dies zuvor über Docker Cloud auf einer AWS EC2-Mikroinstanz bereitgestellt. Mein Kunde erhielt ein Docker Cloud-Konto und konnte den Container bei Bedarf relativ problemlos ausführen. Bei diesem Workflow gibt es zwei Probleme:

  1. Die bereitgestellte EC2-Instanz (Docker-Host) wurde rund um die Uhr ausgeführt, unabhängig davon, ob der Docker-Container ausgeführt wurde oder nicht. Das wurde teuer.
  2. Die Docker Cloud wurde vor einem Monat heruntergefahren.

Alternativen scheinen Google- und AWS Kubernetes-Dienste zu sein. Mein Vorbehalt ist, dass sie für meinen Kunden zu kompliziert sind. Rat?


Wie lange läuft dieser Prozess?
PrestonM

Backen Sie Ihren Python-Code in ein AWS Lambda
Tensibai

@PrestonM, ungefähr 25 Minuten mit Hunderten von gedrosselten Netzwerk-API-Aufrufen.
Asciimo

@ Tensibai, das habe ich mir überlegt, aber mein Kunde würde ein AWS-Konto benötigen und lernen müssen, wie man das Lambda startet. Auf jeden Fall eine Option, aber ich habe bereits diese voll funktionsfähige, tragbare Docker Container , dass ich sollte in der Lage, einfach auf die Wolke zu werfen :)
asciimo

1
Sie müssten Lambda nicht verstehen, Sie könnten ihnen über API Gateway, S3 oder einen anderen unterstützten Trigger eine Schaltfläche geben. Allerdings sind 25 Minuten ungefähr fünfmal zu lang für eine Lambda-Anrufung: P
Tim Malone

Antworten:


3

AWS bietet jetzt fargate an, das von ihnen verwaltet wird, anstatt ein Dienst wie ECS zu sein, für den Sie die Server ausgeführt haben, und sie verwalten die Steuerebene. Fargate ist im Grunde ein "serverloses" ECS. Sie können eine Cloudwatch verwenden, die sogar geplant ist, um gelegentlich etwas nach einem Zeitplan in einem Fargate-ECS-Cluster auszuführen. Deshalb zahlen Sie nur für das, was Sie verwenden. Zu berücksichtigen ist, dass Fargate einiges teurer ist als ECS, das auf Ihrer eigenen EC2-Instanz ausgeführt wird. Wenn Sie jedoch häufig arbeiten, werden Sie wahrscheinlich nur geringfügige Einsparungen erzielen.

Eine andere Möglichkeit wäre, etwas Ähnliches zu automatisieren. Erstellen Sie also einen ECS-Cluster mit einem ASG-Hintergrund, passen Sie die Skalierung an die ECS-Anforderungen an und starten Sie den Container mit Cloudwatch. ECS kann dann vergrößert und verkleinert werden. Dies kann jedoch schwierig sein, da diese Methode normalerweise zum automatischen Skalieren von ECS-Clustern verwendet wird, die auf Cloutwatch-Triggern basieren. Daher müssen Sie möglicherweise in Cloudwatch herumhacken und möglicherweise ein Lambda-Skript zusammen hacken, da Sie technisch gesehen sind Verwenden Sie es nicht so, wie es beabsichtigt ist. Am Ende wäre dies wahrscheinlich das kostengünstigste, aber in Ihrem Fall könnten die Kosteneinsparungen vernachlässigbar sein.

Meiner Meinung nach ist Kubernetes ein zehn Tonnen schwerer Hammer, mit dem Sie ein Bild an die Wand hängen würden. Es ist viel übertrieben.

Sie können diese beiden Optionen untersuchen und feststellen, ob sie kostengünstig und einfach zu verwalten sind. Andere Container-Orchestrierung wird normalerweise übertrieben sein, ECS hat den Vorteil (normalerweise einen Nachteil), einfach dumm zu sein, und Sie zahlen sehr wenig und haben im Grunde keinen Betriebsaufwand für die Steuerebene.


2

Der billigste Weg ist die Verwendung von Herokus Container Registry .

Es ist völlig kostenlos, einfach zu bedienen und bereitzustellen (Sie benötigen nicht einmal die Heroku-CLI, sondern müssen Ihr Image mit Ihrem Authentifizierungstoken per Docker an registry.heroku.com senden.)

Es ist vielleicht nicht das Beste, aber basierend auf Ihren Kommentaren denke ich, dass es für Sie in Ordnung sein sollte, siehe Nachteile hier .

Eine andere billige Alternative ist hyper.sh .


2

Sie können die Leistung von Zappa und Hug mischen , um Ihren Code in eine serverlose AWS Lambda- Funktion zu konvertieren, die Ihrer Hauptfunktion des Python-Prozesses nur einen Dekorator hinzufügt

import hug
[...]

@hug.get('/your_endpoint_name')
def your_function_name():
    """Here goes your code"""
    [...]
    return "Function finished sucesfully"

Danach können Sie mit AWS Lambda bereitstellen zappa deploy prodund müssen die zurückgegebene URL nur noch zweimal im Monat aufrufen.


1

Während ich normalerweise den anderen Antworten zustimme, dass Kubernetes übertrieben ist, vereinfacht KubeSail dies so weit wie möglich, um das Ausführen von Aufgaben wie Ihrer zu vereinfachen. Es gibt eine kostenlose Stufe, mit der Sie Ihren Job auf unbestimmte Zeit ausführen können. Sie müssen sich nur mit GitHub anmelden, Ihre Kube-Konfiguration abrufen und dann Folgendes verwenden:

apiVersion: batch/v1
kind: Job
metadata:
  name: my-python-script
spec:
  template:
    spec:
      containers:
      - name: my-python-script
        image: asciimo/my-python-image

Speichern Sie einfach das oben Gesagte unter my-job.yamlund ersetzen Sie es image: asciimo/my-python-imagedurch den Namen Ihres Bildes in Dockerhub (oder einer anderen Registrierung). Führen Sie es dann aus

kubectl apply -f my-job.yaml

Wenn Sie mehr über Jobs erfahren möchten, finden Sie in den Kubernetes-Dokumenten viele weitere Informationen und Optionen: https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/

Vollständige Offenlegung, ich bin einer der KubeSail-Gründer



0

Das Ansible ec2- Modul verfügt über die erforderlichen Funktionen (Instanzen starten, einige Aufgaben ausführen und dann beenden). Und sogar Beispielspielbuch haben.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.