我正在尋找一種將網域新增至 ECS 服務(EC2 而不是 Fargate)的方法。
需要明確的是,我正在尋找一個 DNS 解析網域名稱 A 或 AAAA 名稱的解決方案(可能是 CNAME,如果它指向 A 或 AAAA)。對我來說,適用於哪種網路模式並不重要。該容器可以放置在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 負載平衡器的成本過高。
<咆哮>
AFAIK,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 任務來來去去時保持它們對齊。你是否也考慮過應用程式運行器?