J'ai un service qui expose plusieurs ports et cela a bien fonctionné avec kubernetes mais maintenant nous le déplaçons vers AWS ECS. Il semble que je ne peux exposer que les ports via Load Balancer et je suis limité à 1 port par service/tâche même lorsque le docker définit plusieurs ports, je dois choisir un port
Le bouton Add to load balancer
Permet d'ajouter un port. Une fois ajouté, il n'y a pas de bouton pour ajouter un deuxième port.
Existe-t-il une solution de contournement plus agréable que de créer un deuxième service proxy pour exposer le deuxième port?
MISE À JOUR: J'utilise le service basé sur Fargate.
Je ne peux pas dire que ce sera une solution de contournement agréable, mais je travaillais sur un projet où je dois exécuter Ejabberd à l'aide d'AWS ECS, mais le même problème s'est produit lorsqu'il est venu de lier le port du service à l'équilibreur de charge.
Je travaillais avec terraform et en raison de cette limitation d'AWS ECS, nous acceptons d'exécuter un conteneur par instance pour résoudre le problème de port car nous étions censés exposer deux ports.
Si vous ne souhaitez pas affecter un port dynamique à votre conteneur et que vous souhaitez exécuter n conteneur par instance alors la solution fonctionnera certainement.
Créez un groupe cible et spécifiez le deuxième port du conteneur.
Accédez aux groupes AutoScaling de votre cluster ECS
Modifier et ajouter le groupe cible nouvellement créé dans le groupe de mise à l'échelle automatique du cluster ECS
Donc, si vous passez à deux conteneurs, cela signifie qu'il y aura deux instances, de sorte que la nouvelle instance de lancement s'enregistrera dans le deuxième groupe cible et le groupe de mise à l'échelle automatique s'en occupera. Cette approche fonctionne bien dans mon cas, mais peu de choses doivent être prises en compte.
Ne liez pas le port principal dans la cible, mieux vaut lier le port principal dans le service ALB. Le principal avantage de cette approche est que si votre conteneur ne répond pas au contrôle de santé AWS, le conteneur redémarre automatiquement. Le bilan de santé du groupe cible ne recréera pas votre conteneur.
Cette approche ne fonctionnera pas lorsqu'il y a une exposition de port dynamique dans le conteneur Docker.
AWS doit mettre à jour son agent ECS pour gérer ce scénario.
J'ai rencontré ce problème lors de la création de plusieurs conteneurs par instance et le deuxième conteneur ne montait pas car il utilisait le même port défini dans la définition de tâche.
Nous avons créé un équilibreur de charge d'application au-dessus de ces conteneurs et supprimé les ports codés en dur. Ce que fait l'équilibreur de charge d'application lorsqu'il n'obtient pas de ports prédéfinis, utilisez la fonctionnalité de mappage de port dynamique. Les conteneurs apparaîtront sur des ports aléatoires et résideront dans un groupe cible et l'équilibreur de charge enverra automatiquement la demande à ces ports.
Plus de détails peuvent être trouvés ici
Vous n'avez pas besoin de solution de contournement, AWS ECS prend désormais en charge plusieurs groupes cibles au sein du même service ECS. Cela sera utile pour les cas d'utilisation où vous souhaitez exposer plusieurs ports des conteneurs.
Actuellement, si vous souhaitez créer un service spécifiant plusieurs groupes cibles, vous devez créer le service à l'aide de l'API Amazon ECS, du SDK, de l'AWS CLI ou d'un modèle AWS CloudFormation. Une fois le service créé, vous pouvez afficher le service et les groupes cibles qui y sont enregistrés avec AWS Management Console.
Par exemple, un conteneur Jenkins peut exposer le port 8080 pour l'interface Web Jenkins et le port 50000 pour l'API.
Réf:
https://docs.aws.Amazon.com/AmazonECS/latest/developerguide/register-multiple-targetgroups.html