AWS:ECS/ALB 设置,转换 docker-compose 文件,将端口映射到多个容器

AWS:ECS/ALB 设置,转换 docker-compose 文件,将端口映射到多个容器

我知道这不是一个“原始问题”。一般主题已广泛涵盖。尽管如此,我仍在努力解决我的特定设置:

我正在尝试将以下 docker-compose 文件转换为基于 ECS 的 AWS 部署。

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

我正在使用 AWS ECS、ECR,它位于部署到 EC2 的 ALB 后面

我的集群中正在运行一项服务,我在该服务中“定义”了此部署。
该服务有一个任务定义。
该任务有 2 个容器。

容器 1(my-app)是一个在端口 3000 上监听的 Web 服务器。
容器 1(my-app)还有一个在端口 22 上监听的 SSHD 服务器。
(我现在明白有更好的方法来管理 ECS 中的 SSH,我们假装这对这个问题并不重要)。

端口映射目前在容器定义中为 0:3000。

容器 2(my-microservice)也有一个在端口 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 组合工具的信息,但在尝试利用更自动化的工具之前,我想先了解如何“手动”执行此操作。

欢迎提供任何反馈或建议,或指向可能与此用例相关的有用教程。我发现的大多数与此相关的教程都涉及更复杂的 VPN 拓扑,这对我来说现在有点太高级了。看来我的用例应该是相当标准/新手友好的。

多谢!

答案1

  1. 您无法通过 ALB 传递 SSH。它不起作用,因为 ALB 纯粹用于 HTTP / HTTPS 流量,它不会让 SSH 通过。

    你可以使用 NLB(网络负载均衡器)用于 SSH(如果您愿意)。(但是通过 SSH 连接到容器是大忌 ;)

  2. 不能在一个目标组中混合不同的服务。创建两个目标组 - 一个用于端口 3000 容器,一个用于端口 5000 容器。然后为每个目标组使用不同的 ALB 路径,例如 /app3000 和 /app5000,映射到相应的 TG。它们都可以位于一个 ALB 后面,只是不同的 TG。

希望有帮助:)

相关内容