如何在没有负载均衡器的 ECS 容器(EC2/ECS 服务)中添加域名?

如何在没有负载均衡器的 ECS 容器(EC2/ECS 服务)中添加域名?

我正在寻找一种将域名添加到 ECS 服务(EC2 而不是 Fargate)的方法。

明确地说,我正在寻找一个 DNS 解析域名 A 或 AAAA 名称的解决方案(如果它指向 A 或 AAAA,则可能是 CNAME)。对我来说,这适用于哪种网络模式并不重要。容器可以放置在hostbridge、中的任何一个中awsvpc 如果解决方案有效

awsvpc在 Fargate 之外不可行

需要 AWS VPC 的解决方案似乎与 ECS/EC2 不兼容,并且仅适用于 Fargate。原因这里

每个使用 awsvpc 网络模式的 Amazon ECS 任务都会收到自己的弹性网络接口 (ENI),该接口附加到托管它的 Amazon EC2 实例。网络接口数量有默认配额可以附加到 Amazon EC2 Linux 实例。主网络接口计入该配额

因此 at3.medium只能运行 2 个任务,甚至 at3.2xlarge也只能运行 3 个任务(限制这里

服务发现不可行

服务发现只会为hostbridge类型的网络容器添加 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 设置得非常低。

下一个答案:“不要那样做”

答案2

我不清楚这个问题。服务发现确实支持域名(命名空间)。据我所知,这实际上是强制性的。换句话说,如果您想使用 SD 来调用 ECS 服务,myservice您必须将其引用为您必须定义的任意命名myservice.<domain>空间<domain>(例如 .local 或 .my.domain)。以下是一个例子使用 SD 的堆栈。

请注意,所有这些都是内部的到集群以及内部服务发现的工作方式(例如 ECS 服务如何发现另一个 ECS 服务)。

[编辑] 如果你想公开你的 ECS 服务,但不想使用负载均衡器,另一个选择是使用 API GW 作为在这篇博客文章中描述。一般来说,您不希望在 R53 中注册 Fargate 任务的随机公共 IP 地址,因为它们是短暂的,您需要构建复杂的机制来在 Fargate 任务来来去去时保持它们对齐。您是否还考虑过应用运行器

答案3

相关内容