Frage Amazon ECS (Docker): Bindungscontainer an eine bestimmte IP-Adresse


Ich spiele mit Amazon ECS (ein Packen von Docker) und ich finde, dass es eine Docker-Fähigkeit gibt, die ECS nicht zu bieten scheint. Ich möchte nämlich, dass mehrere Container in einer Instanz ausgeführt werden und dass Anforderungen in IP-Adresse 1 an Container 1 übertragen werden und dass Anfragen, die an IP-Adresse 2 gesendet werden, an Container 2 usw. zugeordnet werden.

In Docker erfolgt die Bindung eines Containers an eine bestimmte IP-Adresse über:

docker run -p myHostIPAddr:80:8080 imageName command

In Amazon ECS scheint dies jedoch nicht möglich zu sein.

Ich habe eine EC2-Instanz mit mehreren Elastic-IP-Adressen eingerichtet. Wenn ein Container als Teil einer Taskdefinition konfiguriert wird, können Hostports Containerports zugeordnet werden. Im Gegensatz zu Docker bietet ECS jedoch keine Möglichkeit, die Host-IP-Adresse als Teil des Mappings anzugeben.

Eine weitere Wendung besteht darin, dass ausgehende Anfragen von Container N die externe IP-Adresse von Container N haben sollen.

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 NetzwerkBindings-Array zurückgeben kann, das Elemente wie folgt enthält:

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

und das Java-SDK hat eine Klasse namens NetworkBinding, die dieselben Informationen darstellt. Diese Information scheint jedoch nur als Antwort auf eine Anforderung ausgegeben zu werden. Ich kann keine Möglichkeit finden, diese verbindlichen Informationen an ECS zu übermitteln.

Der Grund dafür ist, dass ich komplett unterschiedliche VMs für verschiedene Kundenkreise einrichten möchte, indem ich verschiedene Container benutze, die sich möglicherweise auf derselben EC2-Instanz befinden. Jede VM hat einen eigenen Webserver (einschließlich eigener SSL-Zertifikate) sowie einen eigenen FTP- und SSH-Dienst.

Vielen Dank.


22
2018-05-29 21:27


Ursprung


Ich habe das gleiche Problem mit unserem Workflow. aws ecs describe-container-instances scheint nicht zu helfen. Sie scheinen dich wirklich dazu zu bringen, ein ELB zu benutzen, was für unseren Fall ziemlich dumm ist. - four43
Es scheint einen Weg zu geben, es jetzt zu tun (Q4 2017): stackoverflow.com/a/46577872/6309 - VonC


Antworten:


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

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


3
2018-02-22 01:46



Ca-Ching! 18 Dollar pro Monat für ein ELB. Nun, wer möchte Microservices mit ECS? aws.amazon.com/elasticloadbalancing/pricing - Knots
@Knots 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 für alle Ihre Dienste einen einzelnen ALB (anstelle von klassischen ELBs) anstelle von 1 pro Dienst verwenden. Sie müssen sich entweder auf unterschiedlichen Hostnamen oder unterschiedlichen Pfaden auf einem Hostnamen befinden. - A.J. Brown


Hier ist eine tatsächliche, logische Möglichkeit, es zu tun. Es klingt zu kompliziert, aber Sie können es tatsächlich in wenigen Minuten implementieren, und es funktioniert. Ich implementiere es tatsächlich, während wir sprechen.

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

Anwendungsbasierte Elastic Load Balancer können Anforderungen basierend auf dem angeforderten Pfad weiterleiten. Mit den Zielgruppen können Sie Anfragen, die an Sie gerichtet werden, weiterleiten elb-domain.com/1 zu Behälter 1, elb-domain.com/2 zu Behälter 2 usw.

Jetzt bist du nur noch einen Schritt davon entfernt. Erstellen Sie einen Reverse-Proxy-Server.

In meinem Fall verwenden wir nginx, so dass Sie einen Nginx-Server mit beliebig vielen IPs erstellen können. Mit der Reverse-Proxying-Funktion von nginx können Sie Ihre IPs an die Pfade Ihrer ELBs weiterleiten und sie entsprechend an den richtigen Container weiterleiten (s). Hier 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;
    }
}

Natürlich, wenn Sie IPs wirklich hören, können Sie das weglassen server_name Linie und höre einfach auf entsprechende Schnittstellen.

Dies ist eigentlich besser als das Zuweisen einer statischen IP pro Container, da Sie Cluster von Andockmaschinen haben, bei denen Anforderungen für jede Ihrer "IPs" über diesen Cluster verteilt sind. Das erneute Erstellen eines Computers hat keine Auswirkungen auf die statische IP-Adresse und Sie müssen nicht viele Konfigurationsschritte wiederholen.

Obwohl dies Ihre Frage nicht vollständig beantwortet, weil es Ihnen nicht erlaubt, FTP und SSH zu verwenden, würde ich argumentieren, dass Sie Docker nie dazu verwenden sollten, und Sie sollten stattdessen Cloud-Server verwenden. Wenn Sie Docker verwenden, sollten Sie den Container selbst aktualisieren, anstatt den Server mit FTP oder SSH zu aktualisieren. Für HTTP und HTTPS funktioniert diese Methode jedoch einwandfrei.


2
2018-01-22 20:13





Sie können nicht zum Container selbst, 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 Verwenden Sie Ihren bevorzugten Instanztyp
    • Weisen Sie diese Instanz dem obigen Cluster zu, indem Sie die Option UserData verwenden, wie in diesem Handbuch beschrieben.
  • Erstellen Sie eine TaskDefinition mit Netzwerkmodus auf "bridge" setzen (wie auf Ihrem Desktop)
  • Erstellen Sie eine Service-Definition mit:
    • LaunchType auf EC2 gesetzt
    • Cluster ist auf den Cluster festgelegt, den Sie oben erstellt haben
    • Die Taskdefinition wurde auf die Taskdefinition festgelegt, die Sie oben erstellt haben
  • Weisen Sie der EC2-Instanz beliebige Sicherheitsgruppen zu, wie Sie es sonst tun würden.

Obwohl Sie immer noch direkt mit einer EC2-Instanz kommunizieren, 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, wodurch Sie den Dienst und die Konfiguration darin einfacher verwalten und konfigurieren können.


0
2018-02-13 23:44