使用 AWS ECS 部署新的 docker 图像
Deploying new docker image with AWS ECS
我有一个 ECS 集群,其中有一项服务是 运行 我定义的任务。它只是一个简单的烧瓶服务器,因为我正在学习如何使用 ECS。现在我正试图了解如何更新我的应用程序并让它无缝部署。
- 我从 flask 服务器返回
Hello, World! (rev=1)
开始。
- 我在本地修改我的
app.py
说 Hello, World! (rev=2)
- 我重建 docker 镜像,并推送到 ECR
- 因为我的图像仍然命名为
image_name:latest
,我可以简单地更新服务并强制进行新的部署:aws ecs update-service --force-new-deployment --cluster hello-cluster --service hello-service
- 我的最小百分比设置为 100,最大百分比设置为 200%(使用滚动更新),因此我假设应该在旧实例关闭时设置一个新的 EC2 实例。我观察到(不断刷新 ELB HTTP 端点)是 rev=?在消息中来回交替:
(rev=1)
然后 (rev=2)
没有失败(循环,不是随机的)。
- 然后过了一会儿(大概 30 秒?)翻转停止并出现新消息:
Hello, World! (rev=2)
- 在整个过程中,我注意到没有启动更多的 EC2 实例。所以这一切一定是在同一个实例上发生的。
这是怎么回事?这是在 ECS 中更新应用程序的正确方法吗?
这是正常行为,它与您配置最小和最大健康百分比的方式有关。
100% 的最小健康百分比意味着在任何时候都必须至少有 1 个任务 运行ning(对于应该 运行 1 个任务实例的服务)。最大健康百分比 200% 意味着您不允许同时执行超过 2 个任务 运行(同样对于应该 运行 1 个任务实例的服务)。这意味着在服务更新期间,ECS 将首先启动一个新任务(达到最大值 200% 并避免低于 100%),当这个新任务被认为是健康的时,它将删除旧任务(恢复到 100%)。这解释了为什么这两个任务在短时间内同时 运行ning(并且负载平衡)。
这种配置确保了最大的可用性。如果您想避免这种情况,并允许少量停机,您可以将最小值配置为 0%,将最大值配置为 100%。
关于您的 EC2 实例:它们代表您的 "cluster" = 您的服务用于启动任务的硬件。上述过程发生在这个 "fixed" 硬件上。
我有一个 ECS 集群,其中有一项服务是 运行 我定义的任务。它只是一个简单的烧瓶服务器,因为我正在学习如何使用 ECS。现在我正试图了解如何更新我的应用程序并让它无缝部署。
- 我从 flask 服务器返回
Hello, World! (rev=1)
开始。 - 我在本地修改我的
app.py
说Hello, World! (rev=2)
- 我重建 docker 镜像,并推送到 ECR
- 因为我的图像仍然命名为
image_name:latest
,我可以简单地更新服务并强制进行新的部署:aws ecs update-service --force-new-deployment --cluster hello-cluster --service hello-service
- 我的最小百分比设置为 100,最大百分比设置为 200%(使用滚动更新),因此我假设应该在旧实例关闭时设置一个新的 EC2 实例。我观察到(不断刷新 ELB HTTP 端点)是 rev=?在消息中来回交替:
(rev=1)
然后(rev=2)
没有失败(循环,不是随机的)。 - 然后过了一会儿(大概 30 秒?)翻转停止并出现新消息:
Hello, World! (rev=2)
- 在整个过程中,我注意到没有启动更多的 EC2 实例。所以这一切一定是在同一个实例上发生的。
这是怎么回事?这是在 ECS 中更新应用程序的正确方法吗?
这是正常行为,它与您配置最小和最大健康百分比的方式有关。
100% 的最小健康百分比意味着在任何时候都必须至少有 1 个任务 运行ning(对于应该 运行 1 个任务实例的服务)。最大健康百分比 200% 意味着您不允许同时执行超过 2 个任务 运行(同样对于应该 运行 1 个任务实例的服务)。这意味着在服务更新期间,ECS 将首先启动一个新任务(达到最大值 200% 并避免低于 100%),当这个新任务被认为是健康的时,它将删除旧任务(恢复到 100%)。这解释了为什么这两个任务在短时间内同时 运行ning(并且负载平衡)。
这种配置确保了最大的可用性。如果您想避免这种情况,并允许少量停机,您可以将最小值配置为 0%,将最大值配置为 100%。
关于您的 EC2 实例:它们代表您的 "cluster" = 您的服务用于启动任务的硬件。上述过程发生在这个 "fixed" 硬件上。