如何使用ECS服务发现

62次阅读
没有评论

问题描述

想要使用Amazon服务发现来注册一个Redis服务器,以便其他在同一集群中的ECS服务可以访问它。用户使用EC2部署服务,而不是Fargate,所以服务发现创建了一个简单的SRV DNS记录,这意味着其他服务必须请求R53服务以获取真正的”A”记录,以便访问Redis服务。用户的问题是:如何正确实现这一点?每次都请求R53显然不是一个好主意。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

可以通过几种方法实现目标。我们可以使用具有awsvpc网络模式的服务,这样您的服务可以获得真正的”A” DNS记录和ENI接口。但是需要注意,EC2实例可以附加的ENI数量是有限的,对于微型或小型实例,最多只能附加3个。

以下是使用awsvpc网络模式的示例配置:

version: '3'
services:
  redis:
    image: redis
    network_mode: awsvpc
    # 其他配置

在上面的示例中,我们定义了一个名为redis的服务,并将network_mode设置为awsvpc。这将使服务获得真正的”A” DNS记录和ENI接口。

方案2

另一种更灵活的解决方案是使用内部NLB或自定义代理(如HAproxy)作为ambassador。您可以将代理作为awsvpc网络模式的服务运行,这样它可以获得自己的”A” DNS记录,例如proxy.prod。所有其他服务(如Redis、Mongo、Elasticsearch等)可以配置为使用桥接网络模式的服务,这样它们将获得一个SRV记录(如果配置了服务发现)。

最后,您需要配置代理将所有流量重定向到所需的服务,使用端口转发。HAproxy可以解析SRV记录,因此您不必自己处理。HAproxy将为您完成这些操作,您只需要配置您的应用程序使用proxy.prod + 端口来访问每个服务,例如:
– Redis: proxy.prod:6379
– Mongo: proxy.prod:27017
– 其他服务类似

使用这种技术,您可以实现许多令人惊叹的功能,无论代理位于何处,它可以作为容器与您的应用程序在同一节点上运行,也可以作为Fargate中的容器,或者在另一个节点上运行。

以上是两种实现目标的解决方案,您可以根据自己的需求选择适合的方法。希望对您有所帮助!

正文完