我正在寻找一种将域名添加到 ECS 服务(EC2 而不是 Fargate)的方法。
明确地说,我正在寻找一个 DNS 解析域名 A 或 AAAA 名称的解决方案(如果它指向 A 或 AAAA,则可能是 CNAME)。对我来说,这适用于哪种网络模式并不重要。容器可以放置在host
、bridge
、中的任何一个中awsvpc
如果解决方案有效!
awsvpc
在 Fargate 之外不可行
需要 AWS VPC 的解决方案似乎与 ECS/EC2 不兼容,并且仅适用于 Fargate。原因这里:
每个使用 awsvpc 网络模式的 Amazon ECS 任务都会收到自己的弹性网络接口 (ENI),该接口附加到托管它的 Amazon EC2 实例。网络接口数量有默认配额可以附加到 Amazon EC2 Linux 实例。主网络接口计入该配额。
因此 at3.medium
只能运行 2 个任务,甚至 at3.2xlarge
也只能运行 3 个任务(限制这里)
服务发现不可行
服务发现只会为host
和bridge
类型的网络容器添加 SRV 类型的 DNS 记录。我们运行的大多数软件都不理解 SRV 记录。我们需要 A 和 AAAA 记录。
服务发现将为awsvpc
网络类型容器创建 A 和 AAAA 记录......恢复awsvpc
不可行。
AWS App Mesh 不可行
我们尝试设置应用网格,并几乎立即被告知我们的任务需要awsvpc
¯\(ツ)/¯
负载均衡器似乎不可行
这可能对某些服务有用。但是,我们随后会陷入巨大的困境,要么服务不是 HTTP,要么服务要求客户端使用 SSL 客户端证书进行身份验证。
为非 HTTP/客户端 SSL 服务创建许多 IP 负载平衡器成本过高。
<咆哮>
据我所知,Kubernetes 会让这变得微不足道。甚至 docker swarm 也有这个。我真的很震惊我们花了多少时间来搜索这个微不足道的东西。<\咆哮>
问题
如何向没有负载均衡器的 ECS/EC2 容器添加域名?
答案1
需要澄清的是,您不希望将唯一的弹性网络接口连接到 ECS 容器(因为每个实例都有限制),因为这很容易进行地形改造或其他什么的。
通过 systemd 推出你自己的 AppMesh 解决方案:
使用通过 systemd 启动运行的 bash 脚本访问 IMDS,查找 ECS 服务的公共 IP 地址,然后使用 AWS CLI 更新 DNS 记录。这显然非常后期绑定,因此请确保将 TTL 设置得非常低。
- https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instancedata-data-retrieval.html
- https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-metadata-endpoint-v4.html
下一个答案:“不要那样做”
答案2
我不清楚这个问题。服务发现确实支持域名(命名空间)。据我所知,这实际上是强制性的。换句话说,如果您想使用 SD 来调用 ECS 服务,myservice
您必须将其引用为您必须定义的任意命名myservice.<domain>
空间<domain>
(例如 .local 或 .my.domain)。以下是一个例子使用 SD 的堆栈。
请注意,所有这些都是内部的到集群以及内部服务发现的工作方式(例如 ECS 服务如何发现另一个 ECS 服务)。
[编辑] 如果你想公开你的 ECS 服务,但不想使用负载均衡器,另一个选择是使用 API GW 作为在这篇博客文章中描述。一般来说,您不希望在 R53 中注册 Fargate 任务的随机公共 IP 地址,因为它们是短暂的,您需要构建复杂的机制来在 Fargate 任务来来去去时保持它们对齐。您是否还考虑过应用运行器?