具有 EC2 和 Fargate 实例的 AWS 混合集群

vvg*_*vvg 3 amazon-ec2 amazon-web-services aws-fargate aws-cdk

我正在将 AWS CDK 用于基础设施即代码(下面是 C# .NET 中的 CDK 代码片段)。

我创建了一个 VPC,如下所示:

        // vpc (testing)
        this.vpc = new Vpc(this, "vpc", new VpcProps() {
            MaxAzs = 1,
            NatGateways = 1
        });
Run Code Online (Sandbox Code Playgroud)

我创建了一个集群,如下所示:

        // cluster
        this.cluster = new Cluster(this, "cluster", new ClusterProps() {
            Vpc = this.vpc
        });
Run Code Online (Sandbox Code Playgroud)

我对 Fargate 任务有一个工作人员定义,如下所示:

        // worker
        this.workerDefinition = new FargateTaskDefinition(this, 
            "worker-definition", 
            new FargateTaskDefinitionProps() {
                Cpu = 256,
                MemoryLimitMiB = 512
            }
        );
Run Code Online (Sandbox Code Playgroud)

我有 Fargate 工作线程服务,如下所示,它通过实例计数和任务定义将工作线程服务与集群联系起来:

            var worker = new FargateService(this, "worker", new FargateServiceProps() {
                Cluster = this.cluster,
                DesiredCount = k,       // up to k worker instances
                TaskDefinition = this.workerDefinition
            });
Run Code Online (Sandbox Code Playgroud)

问题:

  1. 我想在集群中至少使用 k 个保留的 EC2 实例。我应该创建这些 EC2 实例并将它们添加到集群中吗?
  2. 如果我使用 FARGATE 启动类型调用 ecs.runTask(),Fargate 服务是否会在预旋转的 EC2 实例之一上启动,直到达到 k 的限制(然后,我打算使用基于工作负载的自动缩放规则)按需启动 FARGATE_SPOT 实例)?
  3. 我对预先创建并添加到集群中的 EC2 实例将用于运行 FARGATE 任务的理解是否正确?
  4. 调度程序如何决定将任务放置在哪里?假设我的任务是可重入的(即,我可以在同一台机器上运行多个实例),Fargate 如何知道(或者我如何指示它以便它知道)它可以在同一台机器上放置多个实例(即,Fargate 是否自动使用 CPU/IO 利用率作为容器上打包任务的指标)?

Mat*_*nér 5

您运行的 Fargate 任务永远不会在您创建和管理的 EC2 实例上运行,它们将在 AWS 管理的计算容量上运行。使用 Fargate 的好处之一是您不必担心管理 EC2 实例。

回答您的问题:

  1. 如果您想在您创建的 EC2 实例上运行任务,则需要使用 EC2 启动模式启动任务。

  2. 如果您使用 FARGATE 启动类型,Fargate 将在 AWS 管理的计算容量上运行您的任务。您运行的任何 EC2 实例都不会用于这些任务。

  3. 不可以,您创建并添加到集群的 EC2 实例仅用于使用 EC2 启动类型启动的任务。

  4. 运行服务时,ECS 服务计划程序将根据您为服务定义的扩展标准启动或停止任务。