AWS:ECS/ALB 設置,轉換 docker-compose 文件,埠映射到多個容器
我知道這不是一個“原始問題”。一般主題被廣泛涵蓋。儘管如此,我正在為我的特定設置而苦苦掙扎:
我正在嘗試將以下 docker-compose 文件基本上轉換為 AWS 中基於 ECS 的部署。
version: '3' services: app: build: context: . dockerfile: ./docker/Dockerfile restart: always container_name: "my-app" volumes: - ./src:/app/src - ./.env:/app/.env - ./store:/app/store ports: #HOST:CONTAINER - "3000:3000" - "4000:22" networks: - my-network my-micorservice: build: context: . dockerfile: docker/Dockerfile.MY.MICROSERVICE restart: always container_name: "my-microservice" ports: - "5000:5000" networks: - my-network networks: bb-network: driver: bridge
我在部署到 EC2 的 ALB 後面使用 AWS ECS、ECR
我在我的集群中執行了一項服務,我在其中“定義”了這個部署。
該服務有一個任務定義。
該任務有 2 個容器。
Container 1 (my-app) 是一個監聽 3000 埠的 Web 伺服器。Container
1 (my-app) 也有監聽 22 埠的 SSHD 伺服器。
(我知道現在有更好的方法來管理 ECS 中的 SSH,我們假設它沒有這個問題沒關係)。
容器定義中的埠映射目前為 0:3000。
容器 2(我的微服務)還有一個執行在 5000 埠上的 Web 伺服器
我正在使用一個 1 目標組。
最初,我成功部署了容器 1,並且能夠通過負載均衡器訪問它,但只能在第一個暴露的埠上(通過 ALB 的公共 80/443 的 3000)
現在我正在嘗試添加容器 2 並在容器 1
的埠 22 上到達第二個服務。任務成功啟動,並且健康檢查通過。
但是,我仍然只能從外部到達容器 1,並且只能在第一個映射埠(通過公共 80 或公共 443 的埠 3000)。
如果我嘗試在容器 1 配置中定義額外的埠映射規則,該任務將不再執行。
例如,如果我嘗試將容器 1 更改為埠映射定義:
0:3000
22:22
或
3000:3000
22:22
或
0:3000
0:22
我得到:
“無法放置任務,因為沒有容器實例滿足其所有要求。最匹配的容器實例 7a628412-1ecc-4f8d-8615-672cfd62bb17 已經在使用您的任務所需的埠。”
我暫時把安全組中的所有埠全部打開,並在ALB中設置了路由規則,將80,443,22,5000全部轉發到目標組。
從其他閱讀/邏輯看來,我可能需要多個目標組,但在創建服務時我實際上不能定義超過 1 個目標組。
即每個負載均衡器定義只接受一個目標組,每個服務定義只接受一個負載均衡器。
現在,如果我嘗試訪問埠 5000,這也指向容器 1,而不是容器 2。
總之,我正在努力實現:
- 容器 1:公共 80,公共 443 —> 容器 1 3000
- 容器 1:公共 22(或者如果需要,其他埠,如 4000)-> 容器 1 22
- 容器 2:公共 5000 —> 容器 2 5000
- 容器 2 到容器 1:3000:3000
- 容器 1 到容器 2:5000:5000
- 集裝箱 1 到集裝箱 2:22:22
注意:到目前為止,所有這些都是通過 AWS 管理 GUI 配置的
我已經通過反複試驗進行了很多測試和更新,並且覺得我的基本方法/理解一定是有缺陷的。
- 我需要為每個容器提供單獨的服務嗎?
- 我需要一項服務,但每個容器需要單獨的任務嗎?(如果是後者,為什麼允許我在一個任務中創建多個容器??)
- 每個容器都需要一個新的 ALB 嗎?
- 每個等都有一個新的目標群體?
- 還是 ALB 錯了,我需要切換回經典負載均衡器?
- 最後我應該保持原樣並嘗試創建第三個 NGINX 容器作為路由代理並嘗試以這種方式控制入口?看起來這應該是負載平衡器的工作,但我現在有點困惑!
對不起,很長的文章。如果我缺少相關的設置資訊,或者需要清理相關的細節。我會照辦的。
最後,我閱讀了有關 ecs-cli compose 工具的資訊,但想先了解如何“手動”執行此操作,然後再嘗試使用更自動化的工具。
歡迎在此處提供任何回饋或建議,或指向可能與此案例相關的有用教程。我發現的大多數處理這個問題的,往往是關於更複雜的 VPN 拓撲,這對我來說有點太先進了。似乎我的案例應該非常標準/新手友好。
多謝!
- 您不能通過 ALB 傳遞 SSH。它不起作用,因為 ALB 純粹用於 HTTP / HTTPS 流量,它不會讓 SSH 通過。
如果需要,您可以將 NLB(網路負載均衡器)用於 SSH。(但是 SSH’ing 到容器是一個很大的 NO NO ;) 2. 您不能在一個目標組中混合使用不同的服務。創建兩個目標組 - 一個用於埠 3000 的容器,一個用於埠 5000 的容器。然後為每個使用不同的 ALB 路徑,例如 /app3000 和 /app5000,映射到各自的 TG。它們都可以在一個 ALB 之後,只是不同的 TG。
希望有幫助:)