webentwicklung-frage-antwort-db.com.de

Sollte ich AWS Elastic Beanstalk oder den Amazon EC2 Container Service (ECS) verwenden, um Docker-Container zu skalieren?

Ich habe eine Docker-basierte Anwendung entwickelt, die aus mehreren Mikrodiensten besteht. Es muss Amazon SQS-Nachrichten verarbeiten und verarbeiten. Zuerst wollte ich AWS Elastic Beanstalk verwenden, aber dann bin ich auf den EC2 Container Service gestürzt. Jetzt weiß ich nicht, welchen ich wählen soll.

Elastic Beanstalk unterstützt ab sofort Multi-Container-Umgebungen. Das ist großartig, denn jeder Mikrodienst verfügt über einen eigenen Anwendungsserver in einem Docker-Container. Das nächste Problem ist die Skalierung:

Ich weiß nicht, wie der Skalierungsmechanismus funktioniert. Zum Beispiel: Ich habe 5 Docker-Container in meiner Elastic Beanstalk-Umgebung. Jetzt ist nur der fünfte Docker-Container stark ausgelastet, da er eine große Menge an SQS-Nachrichten zu verarbeiten hat, die anderen vier sind fast inaktiv, weil sie nicht viel CPU benötigen oder vielleicht nicht viele SQS-Nachrichten haben. Angenommen, der 5. Container führt einen JBoss-Anwendungsserver aus. Soweit ich weiß, kann der Server nur eine begrenzte Anzahl paralleler Anforderungen verarbeiten, auch wenn genügend CPU/Speicher verfügbar ist.

Wenn der JBoss Docker-Container nicht in der Lage ist, die Anzahl der Anforderungen zu verarbeiten, aber genügend CPU/Speicher verfügbar ist, möchte ich natürlich automatisch einen zweiten Docker/JBoss-Container auf derselben Instanz starten. Aber was passiert, wenn ich nicht genug CPU/Speicher habe? Natürlich möchte ich mich auf eine zweite Instanz konzentrieren, die über eine Auto-Scaling-Gruppe in EB konfiguriert werden kann. Jetzt dreht sich eine zweite Instanz, aber jeder Container mit Ausnahme des fünften ist fast leer, natürlich möchte ich nicht, dass sie auch in der zweiten Instanz unnötig 4 erzeugen, was eine Verschwendung von Ressourcen wäre. Nur die fünfte sollte erscheinen und die anderen sollten wie die fünfte skalieren, basierend auf konfigurierbaren Parametern wie z. B .: CPU/Speicher/SQS.

Ich weiß nicht genau, ob Amazon ECS das tut oder ob es überhaupt möglich ist, aber ich kann wirklich keine Quelle im Internet zu diesem Thema finden, was im Allgemeinen heißt, Skalierung basierend auf Instanzen/Containern.

68
orbatschow

EB vs ECS kommt wirklich auf die Kontrolle an. Möchten Sie Ihre Skalierung und Kapazität steuern oder möchten Sie diese stärker abstrahieren und sich stattdessen in erster Linie auf Ihre App konzentrieren? ECS gibt Ihnen die Kontrolle, da Sie die Größe und Anzahl der Knoten im Cluster angeben und festlegen müssen, ob die automatische Skalierung verwendet werden soll. Mit EB stellen Sie einfach ein Dockerfile bereit und EB sorgt für die Skalierung Ihrer Bereitstellung von Anzahl und Größe der Knoten. Grundsätzlich können Sie die Infrastruktur mit der EB-Route vergessen.

Hier ist die EB-Dokumentation zu Docker: http://docs.aws.Amazon.com/elasticbeanstalk/latest/dg/create_deploy_docker.html

Mit ECS müssen Sie zuerst die Infrastruktur aufbauen, bevor Sie mit der Bereitstellung der Docker-Datei beginnen können. Dies hängt also von 1) Ihrer Vertrautheit mit der Infrastruktur und 2) dem Aufwand ab, den Sie für die Infrastruktur gegenüber der App aufwenden möchten.

59
alanwill

Eine tote Frage nicht wiederzubeleben, aber hoffentlich hilft das jemandem.

Die akzeptierte Antwort ist nicht klar genug: Basierend auf dem beschriebenen OP will OP ECS, nicht Multi-Container Elastic Beanstalk (MCEB). Soweit ich das beurteilen kann, versucht MCEB niemals, Container effizient in Instanzen zu packen. OP fragt in einem Kommentar: "Wenn nur einer unter Last ist, skaliert es nur diesen einen oder skaliert es immer die Instanzen und startet alle Container, egal unter welcher Last sie sind?" Und die Antwort ist "Letzteres"; MCEB skaliert die Instanzen und startet alle Container, egal unter welcher Last sie sich befinden.

Bearbeiten

Verwenden Sie nicht die Architektur, die Sie sich vorstellen.

Wie klein sind Ihre Microservices? Wäre es lächerlich, ihnen jeweils einen t2.nano zu geben? Machen Sie sie dann jeweils zu einer Docker-EB-App mit einem Container. EB-Worker-Anwendungen können von SQS-Nachrichten gesteuert werden. Oder verwenden Sie apex.run .

Bearbeiten 31.01.18:

AWS Fargate scheint ziemlich cool zu sein.

Bearbeiten 05.06.19:

Verwenden Sie EKS, wenn Sie Container orchestrieren müssen, um einen Juckreiz zu stillen. Aber wirklich, versuche das zu vermeiden. Verteilte Systeme sind schwer.

9
Sam H.