【问题标题】:Launch and shutting down instances suited for AWS ECS or Kubernetes?启动和关闭适用于 AWS ECS 或 Kubernetes 的实例?
【发布时间】:2019-09-12 02:22:40
【问题描述】:

我正在尝试创建某种网络基础设施,并且一直在研究 Amazon ECS 和 Kubernetes。但是,我不太确定这些系统是否能满足我的实际需求,或者我是否将它们扭曲成其他东西。如果我可以描述我手头的任务,有人可以验证一下 Amazon ECS 或 Kubernetes 是否真的会帮助我完成这项工作,这是正确的思考方式吗?

我正在尝试在 AWS 实例上进行按需单任务处理。我的意思是,我有一个资源密集型应用程序,我想在云中运行它并处理用户提交的大量数据。我想提交此数据以在应用程序上进行处理,启动 EC2 实例,处理数据,将结果上传到 S3,然后关闭 EC2 实例。

我已经为此使用简单队列服务、EC2 和 Lambda 组合了一个有效的解决方案。但我想知道 ECS 或 Kubernetes 会让这更简单吗?我一直在浏览 ECS 文档,它似乎不太关心启动和关闭实例。似乎它想要一个持续运行的实例,然后将 docker 图像作为要运行的任务提供给它。 Amazon ECS 是否可以配置为在没有任务运行时自动关闭所有实例?

另外,我不明白我将如何提交要处理的特定数据块。看起来 Amazon ECS 中定义的“任务”确实对应于单个 Docker 容器,而不是 Docker 容器将处理什么样的数据。那是对的吗?那么我是否还需要通过简单的队列服务或其他方式将要处理的数据提供给实例?然后使用 Lambda 轮询这些队列,看看它们是否应该向 ECS 提交任务?

这是我目前对此的幼稚理解,如果有人可以帮助我更好地理解我所描述的事情,或者指出我更好的思考方式,将不胜感激。

【问题讨论】:

  • 恕我直言,问题似乎有点宽泛。确切的问题是什么?它读起来有点像“做 x 的最佳方法是什么?”类型问题,这会导致主要基于意见的答案。你能把它缩小或分解一下吗?例如 ECS 任务定义..etc 您当前的解决方案似乎是合理的顺便说一句。

标签: amazon-web-services docker amazon-ec2 kubernetes amazon-ecs


【解决方案1】:

这是一个复杂的主题,一个好的答案的许多细节取决于您的域/系统的确切要求。因此,以下信息基于您提供的非常高级的描述。

ECS、kubernetes 等的许多功能都旨在允许分布式应用程序充当单一服务,并且可以水平扩展、升级和维护。这意味着它有助于统一服务接口、负载平衡、服务可靠性、零停机维护、根据需求(或​​其他指标)向上/向下扩展工作节点的数量等。

以下内容描述了一个针对您的 Kubernetes 用例(比 AWS ECS 更通用)的解决方案的高级构想。

因此,对于您的用例,您可以设置一个运行分布式事件队列的 kubernetes 集群,例如 Apache Pulsar 集群,以及一个正在发送队列事件以进行处理的应用程序集群。您的应用程序集群大小可以根据队列中未处理事件的数量自动扩展 (custom pod autoscaler)。集群基础架构将配置为根据计划的 pod 数量(基础架构上的 pod 预留容量)自动扩展。

您必须确保您的应用程序可以在容器中以无状态形式运行。

相对于您当前的解决方案,我看到的主要好处是云提供商的独立性以及运行容器化系统的一些一般好处:1. 不必担心您的 EC2 实例在操作系统依赖项方面的确切设置你的工作量。 2. 能够将处理应用程序作为单一服务来处理。 3. 潜在地提高可靠性,例如在出现错误的情况下。

关于您的确切问题:

是否可以配置 Amazon ECS,以便在没有任务运行的情况下 自动关闭所有实例?

这里的关键字是自动缩放。请注意,有两个级别的扩展: 1. 基础设施扩展(EC2 实例的数量)和应用程序服务扩展(部署的应用程序容器/任务的数量)。 ECS 基础架构扩展基于 EC2 自动扩展组工作。有关更多信息,请参阅this link。有关应用程序服务扩展和无服务器 ECS (Fargate),请参阅 this link

另外我不明白我将如何提交具体的 要处理的数据块。看起来像定义的“任务” Amazon ECS 真的对应单个 Docker 容器,没那么多 Docker 容器将处理什么样的数据。对吗?

ECS 中的“Task Definition”描述了如何部署一个或多个 docker 容器以达到某个目的,以及它的环境/限制应该是什么。任务是在“服务”中运行的单个实例,该服务本身可以部署单个或多个任务。类似的概念还有 Kubernetes 中的 Pod 和 Service/Deployment。

所以我还需要将要处理的数据输入到 通过简单的队列服务或其他实例?然后使用 Lambda 进行轮询 看看这些队列是否应该向 ECS 提交任务?

队列总是有助于将服务请求从处理中分离出来,并确保您不会丢失请求。如果您的应用程序服务集群可以提供服务接口并以可靠的方式直接处理传入请求,则不需要。但是,如果您的应用程序集群必须频繁扩展/缩减,这可能会影响其可靠处理的能力。

【讨论】:

  • 谢谢。这有助于我更好地理解。阅读了一些文档,我发现 AWS Batch 可能就是我想要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-15
  • 2011-01-25
相关资源
最近更新 更多