我的团队正在开发一个由20个微服务组成的应用程序,这将部署在aws ecs ec2实例中。我计划在集群中启动3个aws ec2实例。每个微服务都有自己的on任务定义和服务。
构建docker容器,将其推送到aws ecr,然后使用Jenkinsfile通过jenkins将其部署到ecs。在任务定义json文件中,我将主机端口设置为0,这样每个docker容器主机端口将是随机的,并且如果我们将所需的服务计数增加到2或更多,则不会有任何端口冲突。
我猜同一任务定义上的容器可以使用链接进行通信,但在我的例子中,我们无法预测docker容器在哪个实例上。
如果我们在不同的服务器上使用rabbitmq,它如何与不同的微服务对话?我在任务定义中使用网络模式作为“默认网络”,我应该将其更改为awsvpc吗?
发布于 2018-12-21 13:26:58
"awsvpc“网络模式不适用于服务发现
网络模式awsvpc不是为此目的而创建的。此模式仅为每个正在运行的任务分配一个弹性网络接口,提供动态内网IP地址和内部DNS名称。这有助于获得主要的网络相关好处,如控制,流日志,每个任务定义的流量监控。等等,我不确定是否有任何方法可以跟踪这些动态的内网IP并明智地使用它们。
Ref - https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-networking.html
解决方案-
您可以寻找一种服务发现机制。AWS最近推出了ECS服务发现,您可以将其与您的服务集成,这将大量使用Route 53并在运行中进行更改。
参考-
https://aws.amazon.com/blogs/aws/amazon-ecs-service-discovery/ https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-discovery.html
更轻松的是,人们也建议"ecs-task-kite“,但似乎现在还没有准备好生产- https://github.com/awslabs/ecs-task-kite
似乎使用AWS ECS服务发现机制将是您目前最好的选择。虽然,我还没有机会测试它。
另一种方法是为RabbitMQ本身使用不同的集群,根据您希望支持的协议,通过NLB或ALB公开它。并让服务集群使用它的ALB/NLB端点与RabbitMQ集群对话。在RabbitMQ不可扩展的情况下,将ASG设置为min、max、desire=1。
发布于 2018-12-28 17:21:03
我现在正在运行一个类似的部署。RabbitMq服务器是与集群位于同一私有网络中的独立实例。安全组配置为允许来自该网络的所有流量。我部署的“弱”部分是我没有做任何服务发现。由于机器未重新启动,本地ip地址(10.0....)从不更改,因此我在任务定义中定义了指向该ip地址的外部主机。
当服务想要读取/发布消息时,y使用定义的主机。如果由于某种原因,我重新启动rabbitmq实例和ip地址,我将不得不使用更新后的ip地址重新部署所有容器。
这可以使用实例元数据来修复
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/local-ipv4根据在某个地方注册的官方文档Ec2 Instance metadata (redis,zookeeper,等)然后,您的服务可以对其进行检查,因此,如果rabbitMq实例重新启动,则不需要重新部署。
https://stackoverflow.com/questions/53878890
复制相似问题