如何在沒有負載平衡器的情況下為 ECS 容器(EC2/ECS 服務)新增網域名稱?

如何在沒有負載平衡器的情況下為 ECS 容器(EC2/ECS 服務)新增網域名稱?

我正在尋找一種將網域新增至 ECS 服務(EC2 而不是 Fargate)的方法。

需要明確的是,我正在尋找一個 DNS 解析網域名稱 A 或 AAAA 名稱的解決方案(可能是 CNAME,如果它指向 A 或 AAAA)。對我來說,適用於哪種網路模式並不重要。該容器可以放置在hostbridgeawsvpc 如果解決方案有效

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 負載平衡器的成本過高。

<咆哮>

AFAIK,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

相關內容