尽管有大量关于该主题的AWS博客文章,但我在使用桥接模式时难以理解ECS中AWS实施ECS中的服务发现的要点,并且通常难以获得通往(相对基本)容器网络的途径。
在我看来,服务发现似乎是关于解决动态生成的容器(在任务中)的可访问性,因此,类似于docker用户定义的网络,我可以在具有预定义规范主机名.name-space的群集中访问群集中的不同任务。 VPC。
我已经在VPC中确保:
DNS hostnames: Enabled
DNS resolution: Enabled
在使用桥接模式时定义了服务发现时:
{
"Name": "my-service.my-namespace.",
"Type": "SRV",
"SetIdentifier": "4b46cb82ba434dasdb163c1f06ca5c083",
"MultiValueAnswer": true,
"TTL": 60,
"ResourceRecords": [
{
"Value": "1 1 27017 4b46cb82ba434dasdb163c1f06ca5c083.my-service.my-namespace."
}
],
"HealthCheckId": "862bd287-2b41-43ac-8442-a3d27042482b"
},
因此,每次创建或更新服务时,我都需要手动查找记录。例如,我不能dig
my-service.my-namespace
,该记录不存在。
和:
2.每次更新服务时,记录都会重新生成...
要到达这里,我需要做:
$ aws servicediscovery list-namespaces
$ aws route53 list-resource-record-sets --hosted-zone-id $ZONE_ID --region us-east-1
我的应用程序当前通过注入的环境变量访问任务主机,但是如果记录在每次服务更新时都刷新,则这不是启动器。我遇到的所有文档/论坛似乎都在说,创建某种动态的SRV查找变通方法(似乎有点怪异?),或者只是切换到awsvpc模式,但是为什么此服务在网桥/主机下完全可用?
显然,我缺少基本的东西。
此外,我正在使用动态端口映射。如果我不这样做,则滚动更新之类的操作会失败,并显示 port in use 错误。类似地,尝试通过调度来运行任务的新实例会产生相同的错误。
我可以在任务中给定的docker容器内连接实例的内部私有DNS,即ip-172-31-52-141.ec2.internal,但是这里我不在VPC之外(?)即现在我需要指定动态映射的端口。因此,这也是一个初学者。
所有这些都位于公共ALB(用于动态端口解析等)的后面,并且运行良好,AWS外部的请求可以正确解析到目标组/目标服务。
如果我切换到awsvpc模式并启用服务发现,则可以让多个任务/服务私下通信。
但是,如果我想让多个服务进行通信但又一个服务/任务可能容纳多个Docker容器(例如本地化的Redis缓存),该怎么办?如果不再次将网络模式设置为“桥接”,则无法为这些容器指定“链接”。
这是TLDR问题:
我有2个任务,每个任务都有一个服务。每个任务可能有多个实例,因此端口必须是动态的。在每个任务中,我有2个容器。
允许不同服务通过预定义的host.namespace dns解析进行通信,并使每个任务中的容器相互通信的一般方法是什么?
道歉很长,但是作为ECS / AWS的新手,我真的在这里苦苦挣扎;)
任何反馈或建议都非常感谢。