Amazon-Web-Services

AWS:ECS/ALB 設置,轉換 docker-compose 文件,埠映射到多個容器

  • March 14, 2020

我知道這不是一個“原始問題”。一般主題被廣泛涵蓋。儘管如此,我正在為我的特定設置而苦苦掙扎:

我正在嘗試將以下 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 配置的

我已經通過反複試驗進行了很多測試和更新,並且覺得我的基本方法/理解一定是有缺陷的。

  1. 我需要為每個容器提供單獨的服務嗎?
  2. 我需要一項服務,但每個容器需要單獨的任務嗎?(如果是後者,為什麼允許我在一個任務中創建多個容器??)
  3. 每個容器都需要一個新的 ALB 嗎?
  4. 每個等都有一個新的目標群體?
  5. 還是 ALB 錯了,我需要切換回經典負載均衡器?
  6. 最後我應該保持原樣並嘗試創建第三個 NGINX 容器作為路由代理並嘗試以這種方式控制入口?看起來這應該是負載平衡器的工作,但我現在有點困惑!

對不起,很長的文章。如果我缺少相關的設置資訊,或者需要清理相關的細節。我會照辦的。

最後,我閱讀了有關 ecs-cli compose 工具的資訊,但想先了解如何“手動”執行此操作,然後再嘗試使用更自動化的工具。

歡迎在此處提供任何回饋或建議,或指向可能與此案例相關的有用教程。我發現的大多數處理這個問題的,往往是關於更複雜的 VPN 拓撲,這對我來說有點太先進了。似乎我的案例應該非常標準/新手友好。

多謝!

  1. 您不能通過 ALB 傳遞 SSH。它不起作用,因為 ALB 純粹用於 HTTP / HTTPS 流量,它不會讓 SSH 通過。

如果需要,您可以將 NLB(網路負載均衡器)用於 SSH。(但是 SSH’ing 到容器是一個很大的 NO NO ;) 2. 您不能在一個目標組中混合使用不同的服務。創建兩個目標組 - 一個用於埠 3000 的容器,一個用於埠 5000 的容器。然後為每個使用不同的 ALB 路徑,例如 /app3000 和 /app5000,映射到各自的 TG。它們都可以在一個 ALB 之後,只是不同的 TG。

希望有幫助:)

引用自:https://serverfault.com/questions/1006852