CodeDeploy 如何使用动态端口映射?
How does CodeDeploy work with dynamic port mapping?
几周以来,我一直在努力让 CodeDeploy / CodePipeline 为我们的解决方案工作。进行某种 CI/CD,并使部署更快、更安全……等
当我继续深入研究时,我觉得要么我做的方式根本不正确,要么它不适合我们的情况。
我们所有的 AWS 基础设施是什么 :
我们有一个 ECS 集群,目前包含一个服务(在 EC2 下),与一个或多个任务相关联,一个反向代理和一个 API。所以反向代理在内部侦听端口 80,当到达时,代理在内部传递到端口 5000 上的 API。
我们有一个与此服务关联的应用程序负载平衡器,可以公开访问。它目前有 2 个侦听器,http 和 https。两个侦听器都重定向到同一个目标组,只有我们的反向代理所在的实例。请注意,要重定向到的实例端口是随机的(检查此 link)
我们有一个自动缩放组,即根据对应用程序负载均衡器的调用次数来缩放实例数量。
我们未来可能有什么 :
- 其他任务将与我们的 API 在同一实例中。例如,我们可以创建另一个 API ,它与以前在同一个集群中,在另一个端口上,具有另一个反向代理和另一个负载平衡器。我们可能有一些 Batch 运行 和其他东西。
有什么问题:
现在,“手动”部署(即告诉服务在 ECS 上进行新部署)不起作用。 CodeDeploy卡在创建替换任务,查看服务日志,出现如下错误
service xxxx-xxxx was unable to place a task because no container
instance met all of its requirements. The closest matching
container-instance yyyy is already using a port required by your task.
这个我不是很懂,因为端口分配是随机的,但可能CodeDeploy在那之前运行,只知道分配的端口是0,和前面的任务定义一样?
我真的不知道如何解决这个问题,我什至怀疑 CodeDeploy 在我们的案例中是否可用...
-- 编辑 02/18/2021 --
所以,我知道为什么它现在不起作用了。就像我说的,我的主机监听反向代理的端口是随机的。但是我的 API 正在监听的端口仍然不是随机的
但是现在,即使我告诉 API 端口像反向代理一样是随机的,我的反向代理如何知道 API 可以在哪个端口上访问?我尝试 link 容器,但它似乎在配置文件中不起作用(我使用 nginx 作为反向代理)。
--
不指定 hostPort 似乎是在主机上分配一个“随机”端口
但是,由于 NGINX 和 API 是两个不同的容器,我需要我的第一个 NGINX 容器来调用我的第一个 API 容器,即 API:32798。我想我错过了什么
您可能会遇到此端口冲突,因为您在同一台主机上有两个任务想要将主机的端口 80 映射到它们的容器中。
我试图想象冲突:
紫色框共享一个端口名称空间,绿色和橙色框也是如此。这意味着在每个框中,您可以使用 1 - ~65k 的端口一次。当您明确需要一个主机端口时,它会尝试将紫色端口 80 映射到两个容器端口,这是行不通的。
您不想将这些容器端口显式映射到主机端口,让 ECS 操心。
只需在服务定义中指定 Load Balancer 集成中的容器端口,它就会为您进行映射。如果你设置容器端口为80,这里指的是绿色的80端口,橙色的80端口。它会暴露这些随机端口,并自动将这些随机端口注册到Load Balancer。
Service Definition docs(搜索 containerPort
)
几周以来,我一直在努力让 CodeDeploy / CodePipeline 为我们的解决方案工作。进行某种 CI/CD,并使部署更快、更安全……等
当我继续深入研究时,我觉得要么我做的方式根本不正确,要么它不适合我们的情况。
我们所有的 AWS 基础设施是什么 :
我们有一个 ECS 集群,目前包含一个服务(在 EC2 下),与一个或多个任务相关联,一个反向代理和一个 API。所以反向代理在内部侦听端口 80,当到达时,代理在内部传递到端口 5000 上的 API。
我们有一个与此服务关联的应用程序负载平衡器,可以公开访问。它目前有 2 个侦听器,http 和 https。两个侦听器都重定向到同一个目标组,只有我们的反向代理所在的实例。请注意,要重定向到的实例端口是随机的(检查此 link)
我们有一个自动缩放组,即根据对应用程序负载均衡器的调用次数来缩放实例数量。
我们未来可能有什么 :
- 其他任务将与我们的 API 在同一实例中。例如,我们可以创建另一个 API ,它与以前在同一个集群中,在另一个端口上,具有另一个反向代理和另一个负载平衡器。我们可能有一些 Batch 运行 和其他东西。
有什么问题:
现在,“手动”部署(即告诉服务在 ECS 上进行新部署)不起作用。 CodeDeploy卡在创建替换任务,查看服务日志,出现如下错误
service xxxx-xxxx was unable to place a task because no container instance met all of its requirements. The closest matching container-instance yyyy is already using a port required by your task.
这个我不是很懂,因为端口分配是随机的,但可能CodeDeploy在那之前运行,只知道分配的端口是0,和前面的任务定义一样?
我真的不知道如何解决这个问题,我什至怀疑 CodeDeploy 在我们的案例中是否可用...
-- 编辑 02/18/2021 --
所以,我知道为什么它现在不起作用了。就像我说的,我的主机监听反向代理的端口是随机的。但是我的 API 正在监听的端口仍然不是随机的
但是现在,即使我告诉 API 端口像反向代理一样是随机的,我的反向代理如何知道 API 可以在哪个端口上访问?我尝试 link 容器,但它似乎在配置文件中不起作用(我使用 nginx 作为反向代理)。
--
不指定 hostPort 似乎是在主机上分配一个“随机”端口
但是,由于 NGINX 和 API 是两个不同的容器,我需要我的第一个 NGINX 容器来调用我的第一个 API 容器,即 API:32798。我想我错过了什么
您可能会遇到此端口冲突,因为您在同一台主机上有两个任务想要将主机的端口 80 映射到它们的容器中。
我试图想象冲突:
紫色框共享一个端口名称空间,绿色和橙色框也是如此。这意味着在每个框中,您可以使用 1 - ~65k 的端口一次。当您明确需要一个主机端口时,它会尝试将紫色端口 80 映射到两个容器端口,这是行不通的。
您不想将这些容器端口显式映射到主机端口,让 ECS 操心。
只需在服务定义中指定 Load Balancer 集成中的容器端口,它就会为您进行映射。如果你设置容器端口为80,这里指的是绿色的80端口,橙色的80端口。它会暴露这些随机端口,并自动将这些随机端口注册到Load Balancer。
Service Definition docs(搜索 containerPort
)