Amazon ECS (Docker): Container an bestimmte IP-Adresse binden

24

Ich spiele mit Amazon ECS (ein Umpacken von Docker) und stelle fest, dass es eine Docker-Funktion gibt, die ECS anscheinend nicht bietet. Ich möchte nämlich, dass mehrere Container in einer Instanz ausgeführt werden und Anforderungen, die an IP-Adresse 1 eingehen, auf Container 1 und Anforderungen, die an IP-Adresse 2 eingehen, auf Container 2 usw. abgebildet werden.

In Docker erfolgt das Binden eines Containers an eine bestimmte IP-Adresse über:

docker run -p myHostIPAddr:80:8080 imageName command

In Amazon ECS scheint es jedoch keine Möglichkeit zu geben, dies zu tun.

Ich habe eine EC2-Instanz mit mehreren elastischen IP-Adressen eingerichtet. Wenn Sie einen Container als Teil einer Aufgabendefinition konfigurieren, können Sie Host-Ports Container-Ports zuordnen. Im Gegensatz zu Docker bietet ECS jedoch keine Möglichkeit, die Host-IP-Adresse als Teil der Zuordnung anzugeben.

Eine zusätzliche Wendung ist, dass ich möchte, dass ausgehende Anforderungen von Container N die externe IP-Adresse von Container N haben.

Gibt es eine Möglichkeit, all das zu tun?

Ich habe die AWS CLI-Dokumentation sowie das AWS SDK für Java durchgesehen. Ich kann sehen, dass die CLI ein networkBindings-Array mit folgenden Elementen zurückgeben kann:

{
  "bindIP": "0.0.0.0", 
  "containerPort": 8021, 
  "hostPort": 8021
},

und das Java SDK verfügt über eine Klasse mit dem Namen NetworkBinding, die dieselben Informationen darstellt. Diese Informationen werden jedoch offenbar nur als Antwort auf eine Anforderung ausgegeben. Ich kann keine Möglichkeit finden, diese verbindlichen Informationen an ECS weiterzuleiten.

Der Grund, warum ich dies tun möchte, ist, dass ich völlig verschiedene VMs für verschiedene Wahlkreise einrichten möchte, wobei verschiedene Container möglicherweise auf derselben EC2-Instanz verwendet werden. Jede VM verfügt über einen eigenen Webserver (einschließlich unterschiedlicher SSL-Zertifikate) sowie über einen eigenen FTP- und SSH-Dienst.

Vielen Dank.

Markiere R
quelle
Ich habe das gleiche Problem mit unserem Workflow. aws ecs describe-container-instancesscheint nicht zu helfen. Sie scheinen dich wirklich dazu bringen zu wollen, eine ELB zu benutzen, was für unseren Fall ziemlich dumm ist.
14.
Es scheint eine Möglichkeit zu geben, dies jetzt zu tun (4. Quartal 2017): stackoverflow.com/a/46577872/6309
VonC

Antworten:

4

Eine Option: Erstellen Sie eine ELB für jeden Client und weisen Sie jeder ELB bestimmte Container zu.

[1] http://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-load-balancing.html

Adam Keck
quelle
13
Ca-ching! 18 Dollar pro Monat für eine ELB. Nun, wer möchte Microservices mit ECS? aws.amazon.com/elasticloadbalancing/pricing
Knoten
1
@ Knoten hatten wir das gleiche Problem. Dann sind wir zu Lambda + API Gateway gewechselt und unsere Kosten sind auf 10 Cent gesunken.
Grepe
Sie können jetzt einen einzigen ALB (anstelle von klassischen ELBs) für alle Ihre Services anstelle von 1 pro Service verwenden. Sie müssen sich entweder auf unterschiedlichen Hostnamen oder auf unterschiedlichen Pfaden auf einem Hostnamen befinden.
AJ Brown
4

Hier ist eine logische Vorgehensweise. Es klingt zu kompliziert, aber Sie können es tatsächlich in wenigen Minuten implementieren, und es funktioniert. Ich setze es tatsächlich um, während wir sprechen.

Sie erstellen für jeden Container eine Aufgabe und für jede Aufgabe einen Dienst, der mit einer Zielgruppe für jeden Dienst gekoppelt ist. Und dann erstellen Sie nur 1 Elastic Load Balancer.

Anwendungsbasierte Elastic Load Balancer können Anforderungen basierend auf dem angeforderten Pfad weiterleiten. Über die Zielgruppen können Sie Anfragen elb-domain.com/1an Container 1, elb-domain.com/2Container 2 usw. weiterleiten.

Jetzt bist du nur noch einen Schritt entfernt. Erstellen Sie einen Reverseproxyserver.

In meinem Fall verwenden wir nginx, sodass Sie einen nginx-Server mit beliebig vielen IP-Adressen erstellen können. Mit der Reverse-Proxy-Funktion von nginx können Sie Ihre IP-Adressen an die Pfade Ihrer ELB weiterleiten, die sie dementsprechend an den richtigen Container weiterleiten (s). Hier ist ein Beispiel, wenn Sie Domains verwenden.

server {
    server_name domain1.com;
    listen 80;
    access_log /var/log/nginx/access.log vhost;
    location / {
        proxy_pass http://elb-domain.com/1;
    }
}

Wenn Sie tatsächlich IPs server_nameabhören, können Sie natürlich die Leitung weglassen und nur die entsprechenden Schnittstellen abhören.

Dies ist tatsächlich besser als das Zuweisen einer statischen IP pro Container, da Sie Cluster von Docker-Computern haben können, auf denen Anforderungen für jede Ihrer "IPs" über diesen Cluster verteilt sind. Die Wiederherstellung eines Computers wirkt sich nicht auf die statische IP-Adresse aus, und Sie müssen nicht viele Konfigurationsschritte wiederholen.

Obwohl dies Ihre Frage nicht vollständig beantwortet, da Sie FTP und SSH nicht verwenden können, würde ich argumentieren, dass Sie Docker niemals verwenden sollten, um dies zu tun, und Sie sollten stattdessen Cloud-Server verwenden. Wenn Sie Docker verwenden, sollten Sie den Container selbst aktualisieren, anstatt den Server über FTP oder SSH zu aktualisieren. Für HTTP und HTTPS funktioniert diese Methode jedoch einwandfrei.

DasNavigat
quelle
1

Sie können nicht auf den Container selbst zugreifen, aber Sie können eine EC2-Instanz für einen bestimmten Container erstellen. Wenn Sie auf diesen Dienst zugreifen möchten, können Sie auf den EC2-Host verweisen, auf dem der Container ausgeführt wird.

  • Erstellen Sie mit dieser Anforderung einen dedizierten Cluster für Ihre Dienste
  • Erstellen Sie eine AMI-optimierte EC2-Instanz mit Ihrem bevorzugten Instanztyp
    • Stellen Sie sicher, dass Sie diese Instanz dem obigen Cluster mit der Option UserData zuweisen, wie in diesem Handbuch beschrieben.
  • Erstellen Sie eine TaskDefinition, bei der NetworkMode auf "bridge" gesetzt ist (wie auf Ihrem Desktop).
  • Erstellen Sie eine Service-Definition mit:
    • LaunchType auf EC2 gesetzt
    • Cluster auf den oben erstellten Cluster festgelegt
    • Aufgabendefinition auf die oben erstellte Aufgabendefinition festgelegt
  • Weisen Sie der EC2-Instanz wie gewohnt Sicherheitsgruppen zu.

Obwohl Sie immer noch direkt mit einer EC2-Instanz sprechen, können Sie die IP des Containers (indirekt) wie bei der EC2-Instanz steuern. Dies erspart Ihnen den Aufwand, die Dienste auf dem "Bare Metal" auszuführen, sodass Sie den Dienst und die darin enthaltene Konfiguration einfacher verwalten und konfigurieren können.

Patrick Twohig
quelle