我知道这不是一个“原始问题”。一般主题已广泛涵盖。尽管如此,我仍在努力解决我的特定设置:
我正在尝试将以下 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 配置的
我已经通过反复试验进行了大量测试和更新,并且觉得我的基本方法/理解一定存在缺陷。
- 我是否需要为每个容器提供单独的服务?
- 我是否需要一个服务但每个容器有单独的任务?(如果是后者,为什么我被允许在一个任务中创建多个容器?)
- 每个容器都需要一个新的 ALB 吗?
- 每个都有一个新的目标群体吗?
- 或者 ALB 在这里错了,我需要切换回经典负载均衡器?
- 最后,我是否应该保持原样,并尝试创建第三个 NGINX 容器作为路由代理,并尝试以此方式控制入口?这似乎应该是负载均衡器的工作,但我现在有点困惑!
抱歉发了这么长的帖子。如果我遗漏了相关的设置信息,或者需要清理相关细节。我会这样做。
最后,我阅读了有关 ecs-cli 组合工具的信息,但在尝试利用更自动化的工具之前,我想先了解如何“手动”执行此操作。
欢迎提供任何反馈或建议,或指向可能与此用例相关的有用教程。我发现的大多数与此相关的教程都涉及更复杂的 VPN 拓扑,这对我来说现在有点太高级了。看来我的用例应该是相当标准/新手友好的。
多谢!
答案1
您无法通过 ALB 传递 SSH。它不起作用,因为 ALB 纯粹用于 HTTP / HTTPS 流量,它不会让 SSH 通过。
你可以使用 NLB(网络负载均衡器)用于 SSH(如果您愿意)。(但是通过 SSH 连接到容器是大忌 ;)
你不能在一个目标组中混合不同的服务。创建两个目标组 - 一个用于端口 3000 容器,一个用于端口 5000 容器。然后为每个目标组使用不同的 ALB 路径,例如 /app3000 和 /app5000,映射到相应的 TG。它们都可以位于一个 ALB 后面,只是不同的 TG。
希望有帮助:)