Bahubali Shetti

使用 Elastic 可观测性管理 Amazon ECS 基于 EC2 的集群上的应用程序

了解如何管理基于 EC2 实例的 Amazon ECS 集群上的应用程序,以及如何简单地使用 Elastic Agent 与 AWS 和 Docker 集成,以全面了解您的应用程序、ECS 服务和相应的 EC2 实例。

Managing your applications on Amazon ECS EC2-based clusters with Elastic Observability

在之前的博客中,我们探讨了 Elastic 可观测性如何帮助您监控各种 AWS 服务并有效地分析它们

Amazon ECS(弹性容器服务)是使用较多的 AWS 容器服务之一。虽然目前趋势是使用 Fargate 来简化 ECS 集群的设置和管理,但许多用户仍然偏好将 Amazon ECS 与 EC2 实例结合使用。虽然它可能不如 AWS Fargate 那样简单或高效,但它可以提供对底层基础结构的更多控制。

在最近的博客中,我们探讨了 Elastic 可观测性如何帮助管理带有 Fargate 的 Amazon ECS。但是,本博客将回顾如何使用 Elastic 可观测性管理带有 EC2 实例的 Amazon ECS 集群。

通常,当使用 EC2 设置基于 Amazon ECS 的集群时,您可能可以或不可以访问 EC2 实例。这决定了您可以使用 Elastic 可观测性中的哪些内容来监控基于 EC2 的 ECS 集群。因此,您可以使用两个组件来监控基于 EC2 的 ECS 集群的 Elastic 可观测性

如上图所示,这两个组件是

  1. _ 基准设置 __ _ 运行 AWS 集成的 Elastic Agent 配置为从 CloudWatch 获取 ECS 指标和日志。此 Agent 在不属于 ECS 集群的实例上运行,因为它允许您查看所有 ECS 集群和其他 AWS 服务,例如 EKS、RDS 和 EC2。

  2. _ 附加设置:_ 如果您可以访问 ECS 集群中的 EC2 实例,则可以在每个 EC2 实例中运行 Elastic 的 Docker 集成。这为您提供了比 AWS 容器洞察更详细的容器信息。并且它不需要 AWS CloudWatch,这可能会非常昂贵。

使用基准设置或附加设置中的任何一种,您都必须为 ECS 集群设置 AWS CloudWatch Container Insights。但是,带有附加设置的 Docker 集成可以向 AWS CloudWatch Container Insights 提供更多信息。

因此,我们将回顾如何监控基于 EC2 的 ECS 集群的各个组件

  • ASG 组中的 EC2 实例
  • 在 ECS 集群中运行的 ECS 服务
  • ECS 任务(容器)

此外,我们将回顾如何通过 AWS CloudWatch 获取和不获取 AWS CloudWatch 来获取 ECS 集群的指标和日志。我们将向您展示如何使用

  • AWS CloudWatch Container Insights(来自 CloudWatch)
  • Docker 指标(非 CloudWatch)
  • 通过 CloudWatch 的 Amazon ECS 日志

先决条件和配置

如果您计划遵循本博客,这里是一些我们用来设置配置的组件和详细信息

  • Elastic Cloud 上的一个帐户和一个已部署的堆栈(请参阅此处的说明)——确保您同时拥有这两者。
  • 一个 nginx 容器和一个 stress 容器——我们将使用这两个基本容器来帮助突出显示 Elastic ECS 集群上的负载。
  • 自动伸缩组中的 ECS EC2 集群——确保您有权访问以在 EC2 实例上加载 Elastic Agent,或者您可以创建 AMI 并将其用作 ECS 集群的基准映像。
  • 您帐户中任何不属于 ECS 集群且具有公共访问权限(发送指标和日志)的 EC2 实例

设置完成后,您将在 Elastic 可观测性中看到什么?

如果您使用配置了 AWS CloudWatch Container Insights 的 ECS EC2 集群的基准配置,并且 Elastic Agent 配置了以下 Elastic Agent 集成

  • ECS 集成
  • EC2 集成
  • 带有指标和日志的 AWS CloudWatch 集成

那么您将能够在 Elastic 仪表板中获取以下信息

  • 集群中的容器(通过 Elastic Agent 和 AWS CloudWatch 集成的 AWS CloudWatch Container Insights)
  • 集群中的服务(通过 Elastic Agent 和 AWS CloudWatch 集成的 AWS CloudWatch Container Insights)
  • ECS 集群的 CPU 和内存利用率(带有 ECS 集成的 Elastic Agent)
  • 集群中实例的 EC2 CPU 和内存利用率(带有 EC2 集成的 Elastic Agent)
  • 每个容器的 CPU 和内存利用率(通过 Elastic Agent 和 AWS CloudWatch 集成的 AWS CloudWatch Container Insights)

如果使用每个 ECS EC2 实例的带有 Docker 集成的 Elastic Agent 的附加配置,您将能够通过 Docker 获取指标的直接馈送。可以查看以下指标

让我们看看如何设置这一切。

设置一切

在接下来的几个步骤中,我将介绍

  • 在 Elastic Cloud 上获取一个帐户
  • 启动 ECS EC2 集群并可能设置您自己的 AMI
  • 设置容器 nginxstress 容器
  • 在 ECS EC2 实例上设置带有 Docker 容器集成的 Elastic Agent
  • 在独立的 EC2 实例上设置带有 AWS、CloudWatch 和 ECS 集成的 Elastic Agent

步骤 1:在 Elastic Cloud 上创建一个帐户

按照说明开始使用 Elastic Cloud

步骤 2:设置带有 EC2 实例的 ECS 集群

创建集群时,使用控制台设置时有两个选项

  • 创建一个新的 ASG 组,您将只能使用预加载的基于 Amazon Linux(2 或 2023)的 AMI 集
  • 在设置 ECS 集群之前设置您自己的 ASG 集群,然后从此选项中选择。此选项将使您可以更好地控制 Linux 版本,并能够在用于 ASG 中实例的 AMI 中添加 Elastic Agent 之类的东西。

无论选择哪个选项,您都需要开启容器洞察(请参阅下图的底部)。

设置集群后,您可以转到 AWS CloudWatch,在那里您应该看到集群的 Container Insights

步骤 3:设置带有 Docker 集成的 Elastic Agent

接下来,您需要在每个实例中添加一个 Elastic Agent。在 Elastic Cloud 中,设置一个带有 Docker 和系统集成的 Elastic 策略,如下所示

接下来,为策略添加一个 Agent,然后复制相应的安装脚本(在我们的例子中,由于我们正在运行 Amazon Linux 2,所以是 Linux),并在集群中的每个 EC2 实例上运行它

添加完成后,您应该能在集群中看到代理。每个代理都将位于每个 EC2 实例上。

如果您决定使用自己的 ASG 设置 ECS EC2 集群,而不使用 Amazon Linux AMI(版本 2 或 2023),则需要执行以下操作:

步骤 4:设置带有 AWS 集成的 Elastic 代理

从 Elastic Cloud 的集成选项卡中,选择 AWS 集成并选择添加代理。然后,您需要逐步完成 AWS 集成的配置。

至少,请确保您已启用以下配置选项:

这将确保不仅摄取 EC2 指标和日志,而且还摄取所有 CloudWatch 指标和日志。ECS 指标和日志存储在 CloudWatch 中。

如果您只想确保摄取特定 ECS 集群的日志,您还可以通过几个参数限制要摄取的内容。在我们的设置中,我们仅从前缀为 /aws/ecs/containerinsights/EC2BasedCluster/ 的日志组收集日志。

设置此策略后,像步骤 1 中那样添加代理。

但是,此代理需要添加到独立于 ECS 集群的 EC2 实例中。

安装后,此代理将帮助拉取:

  • 您帐户中的所有 EC2 实例指标(可以在集成策略中调整)。
  • 从 ECS 摄取 AWS CloudWatch Container Insights。
  • ECS 指标,例如:
    • aws.ecs.metrics.CPUReservation.avg
    • aws.ecs.metrics.CPUUtilization.avg
    • aws.ecs.metrics.GPUReservation.avg
    • aws.ecs.metrics.MemoryReservation.avg
    • aws.ecs.metrics.MemoryUtilization.avg
    • 更多 - 请在此处查看完整列表

步骤 5:设置服务和容器

在运行此配置时,我们在进入任务之前使用了 nginx 和一个 压力容器

为了在 ECS 上启动服务和容器,您需要为每个容器设置一个任务。但更重要的是,您需要确保以下两者的角色:

"taskRoleArn": "arn:aws:iam::xxxxx:role/ecsTaskExecutionRol"executionRoleArn":,

"arn:aws:iam::xxxxx:role/ecsTaskExecutionRole",

具有以下权限:

最重要的是,您应该确保添加此权限:

AmazonEC2ContainerServiceforEC2Role

它将确保可以在集群中的 EC2 实例上启动容器。

在您拥有正确的权限后,然后设置以下任务。

这是 NGINX 的任务 JSON:

{
  "family": "NGINX",
  "containerDefinitions": [
    {
      "name": "nginx",
      "image": "nginx: latest",
      "cpu": 0,
      "portMappings": [
        {
          "name": "nginx-80-tcp",
          "containerPort": 80,
          "hostPort": 80,
          "protocol": "tcp",
          "appProtocol": "http"
        }
      ],
      "essential": true,
      "environment": [],
      "environmentFiles": [],
      "mountPoints": [],
      "volumesFrom": [],
      "ulimits": [],
      "logConfiguration": {
        "logDriver": "awslogs",
        "options": {
          "awslogs-create-group": "true",
          "awslogs-group": "/ecs/",
          "awslogs-region": "us-west-2",
          "awslogs-stream-prefix": "ecs"
        },
        "secretOptions": []
      }
    }
  ],
  "taskRoleArn": "arn:aws:iam::xxxxxx:role/ecsTaskExecutionRole",
  "executionRoleArn": "arn:aws:iam::xxxxx:role/ecsTaskExecutionRole",
  "networkMode": "awsvpc",
  "requiresCompatibilities": ["EC2"],
  "cpu": "256",
  "memory": "512",
  "runtimePlatform": {
    "cpuArchitecture": "X86_64",
    "operatingSystemFamily": "LINUX"
  }
}

这是压力容器的任务 JSON:

{
  "family": "stressLoad",
  "containerDefinitions": [
    {
      "name": "stressLoad",
      "image": "containerstack/alpine-stress",
      "cpu": 0,
      "memory": 512,
      "memoryReservation": 512,
      "portMappings": [],
      "essential": true,
      "entryPoint": ["sh", "-c"],
      "command": [
        "/usr/local/bin/stress --cpu 2 --io 2 --vm 1 --vm-bytes 128M --timeout 6000s"
      ],
      "environment": [],
      "mountPoints": [],
      "volumesFrom": [],
      "logConfiguration": {
        "logDriver": "awslogs",
        "options": {
          "awslogs-create-group": "true",
          "awslogs-group": "/ecs/",
          "awslogs-region": "us-west-2",
          "awslogs-stream-prefix": "ecs"
        }
      }
    }
  ],
  "taskRoleArn": "arn:aws:iam::xxxxx:role/ecsTaskExecutionRole",
  "executionRoleArn": "arn:aws:iam::xxxxx:role/ecsTaskExecutionRole",
  "networkMode": "awsvpc",
  "requiresCompatibilities": ["EC2"],
  "cpu": "256",
  "memory": "512",
  "runtimePlatform": {
    "cpuArchitecture": "X86_64",
    "operatingSystemFamily": "LINUX"
  }
}

定义任务后,请确保使用 EC2 的启动类型启动每个服务(每个任务一个服务)。

您现在应该有两个正在运行的服务。

步骤 6:检查 Elastic Cloud 中的指标和日志

转到 Elastic Cloud 并确保您从 ECS 集群获取指标和日志。首先,通过查看名为 [Metrics Docker] Overview 的内置仪表板来检查您是否正在接收指标。

_ 通过对此仪表板进行一些工作,添加容器洞察指标和 Docker 指标,您应该能够看到: _

如果您只有 ECS 集成和步骤 2 中的 Elastic 代理,那么您需要创建一个新的仪表板。

可以使用以下指标设置此仪表板:

  • 集群中的容器(通过 Elastic 代理和 AWS Cloudwatch 集成进行容器洞察)。使用以下指标设置 TSVB 面板:aws.dimensions.ClusterName : "EC2BasedCluster" 和 aws.containerinsights.metrics.TaskCount.max
  • 集群中的服务(通过 Elastic 代理和 AWS Cloudwatch 集成进行容器洞察)。使用以下配置来设置图表:

  • ECS 集群的 CPU 和内存利用率(带有 ECS 集成的 Elastic 代理)。使用以下配置来设置 CPU 和内存利用率图表:

  • 集群中实例的 EC2 CPU 和存储利用率(带有 EC2 集成的 Elastic 代理)。使用以下配置来设置 CPU 和内存利用率图表:

  • (未显示):每个容器的 CPU 和内存利用率(通过 Elastic 代理和 AWS Cloudwatch 集成进行容器洞察)

步骤 7:查看 ECS 集群的日志

由于我们在步骤 2 中设置了 AWS CloudWatch 日志收集,我们可以在 Discover 中查看这些日志,方法是按日志组 ARN /aws/ecs/containerinsights/EC2BasedCluster/ 进行过滤。

总结

我希望您了解 Elastic Observability 如何帮助您进行 AWS 监控 ECS 服务指标。以下是对课程和您所学内容的快速回顾:

  • Elastic Observability 支持通过 Elastic 代理上的 AWS 集成摄取和分析 AWS ECS 服务指标和相应的 EC2 指标。通过 Elastic 代理,可以轻松设置从 AWS 服务摄取数据。
  • Elastic Observability 还可以通过在 ECS EC2 自动扩展组的每个 EC2 实例上的 Elastic 代理上运行的 Docker 集成来获取容器指标。
  • Elastic 具有多个开箱即用 (OOTB) 的 AWS 服务仪表板,可以用作基线来获取您自己的自定义视图。

准备好开始了吗?通过 AWS Marketplace 注册,开始您的 7 天免费试用,并在全球任何 AWS 上的 Elastic Cloud 区域中快速启动部署。您在 AWS Marketplace 上购买的 Elastic 将包含在您的每月合并账单中,并将从您在 AWS 的承诺支出中扣除。

本帖中描述的任何功能或特性的发布和时间安排均由 Elastic 自行决定。任何当前不可用的功能或特性可能不会按时交付或根本不交付。