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

80

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

Ab sofort unterstützt Elastic Beanstalk Multi-Container-Umgebungen. Das ist großartig, weil jeder Microservice einen eigenen Anwendungsserver in einem Docker-Container hat. 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 eine große Anzahl von SQS-Nachrichten verarbeitet werden muss. Die anderen vier sind fast inaktiv, da sie nicht viel CPU benötigen oder möglicherweise nicht viele SQS-Nachrichten enthalten. Nehmen wir an, im 5. Container wird ein JBoss-Anwendungsserver ausgeführt. Soweit ich weiß, kann der Server nur eine begrenzte Anzahl paralleler Anforderungen verarbeiten, selbst wenn genügend CPU / Speicher verfügbar ist.

Wenn der JBoss Docker-Container die Anzahl der Anforderungen nicht verarbeiten kann, 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 eine zweite Instanz drehen, die über eine automatische Skalierungsgruppe in EB konfiguriert werden kann. Jetzt dreht sich eine zweite Instanz, aber jeder Container außer der fünften ist fast im Leerlauf. 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 5. sollte erscheinen und die anderen sollten wie die 5. Skala basierend auf konfigurierbaren Parametern wie z. B.: CPU / Speicher / SQS skalieren.

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

Orbatschow
quelle
Haben Sie das Gefühl, dass Ihr Problem gelöst wurde? Ich habe ein sehr ähnliches Problem in Bezug auf EB, ich vermute, es startet alle 5 Container in einer separaten Instanz
Cameron Singe
3
Ich bin auch verwirrt. Die ausgewählte Antwort erklärt nicht wirklich, wie die Skalierung in beiden Diensten funktioniert. Tritt ECS / EB auch wirklich von einem anderen 5. Container und läuft dann beide parallel auf derselben Instanz, wenn genügend Ressourcen vorhanden sind?
Codepushr

Antworten:

65

EB vs ECS kommt wirklich auf die Kontrolle an. Möchten Sie Ihre Skalierung und Kapazität steuern oder möchten Sie diese abstrakter gestalten und sich stattdessen hauptsächlich auf Ihre App konzentrieren? ECS gibt Ihnen die Kontrolle, da Sie die Größe und Anzahl der Knoten im Cluster angeben müssen und festlegen müssen, ob die automatische Skalierung verwendet werden soll oder nicht. Mit EB stellen Sie einfach eine Docker-Datei bereit und EB kümmert sich um 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

Bei ECS müssen Sie zuerst die Infrastruktur erstellen, bevor Sie mit der Bereitstellung der Docker-Datei beginnen können, damit es wirklich auf 1) Ihre Vertrautheit mit der Infrastruktur und 2) den Aufwand ankommt, den Sie für die Infrastruktur im Vergleich zur App aufwenden möchten.

Alanwill
quelle
7
Ja, aber wie funktioniert der automatische Skalierungsmechanismus beider Dienste? Skaliert Elastic Beanstalk die Container pro Container? Wenn also nur einer geladen ist, skaliert er nur diesen oder skaliert immer die Instanzen und startet alle Container, egal unter welcher Last sie sind?
Orbatschow
6
Jetzt, da ECS GA ist, nutzt EB ECS, um seine Multi-Container-Infrastruktur bereitzustellen. Die automatische Skalierung erfolgt unter Verwendung des typischen Grundelements der automatischen EC2-Skalierungsgruppe. Der auslösende Faktor für die Vergrößerung oder Verkleinerung ist jedoch nicht der Container, sondern der Instanzknoten. Das heißt, wenn der Netzwerkschnittstellenverkehr oder die CPU-Auslastung oder die Festplattenauslastung einen bestimmten Schwellenwert erreichen, kann der Cluster skaliert werden. Wenn in Ihrem Beispiel der Knoten des 5. Containers unter hoher CPU-Auslastung stand, können Sie einen Gruppenauslöser für die automatische Skalierung basierend festlegen auf diesem.
Alanwill
Hier sind einige Ressourcen, die Ihnen ebenfalls helfen sollen: aws.amazon.com/blogs/aws/aws-elastic-beanstalk-for-docker docs.aws.amazon.com/elasticbeanstalk/latest/dg/…
Alanwill
Beachten Sie auch, dass Sie mit AWS Fargate den kontrollierteren containerorientierten ECS-Ansatz beibehalten und die Verantwortung für die Clustersteuerung verschieben können .
dmulter
Wie wäre es mit Preisgestaltung? Ist es anders
Daniel Vilela
11

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

Die akzeptierte Antwort ist nicht klar genug: Basierend auf dem, was OP beschrieben hat, 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 eine unter Last ist, skaliert es nur diese oder skaliert es immer die Instanzen und startet alle Container, egal unter welcher Last sie sind?" Und die Antwort lautet "Letzteres"; MCEB skaliert die Instanzen und startet alle Container, unabhängig davon, unter welcher Last sie stehen.

Bearbeiten

Verwenden Sie nicht die Architektur, die Sie sich vorstellen.

Wie mikro sind Ihre Microservices? Wäre es lächerlich, jedem 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 versuchen Sie das wirklich zu vermeiden. Verteilte Systeme sind schwer.

Sam H.
quelle
1
Es macht genau das. Für uns ist das kein großes Problem, da wir unsere Apps stapelweise strukturieren, wobei es normalerweise in Ordnung ist, dass sie zusammen skaliert werden. Wenn eine App unabhängig skaliert werden muss, sollte dies eine weitere App auf EB sein. Ich bemühe mich sehr, mir ein gutes Szenario vorzustellen, in dem dies erforderlich ist. Ich habe viele Fälle von Menschen gelesen, die diesen Wunsch geäußert haben, und ich kann mich nicht entscheiden, ob es sich nur um einen akademischen, ein Designproblem oder einen wirklich gültigen Fall handelt.
Jacob Thomason