AWS Fargate 集成(用于 ECS 集群)

编辑

AWS Fargate 集成(用于 ECS 集群)

编辑

版本

1.2.1 (查看全部)

兼容的 Kibana 版本

8.13.0 或更高版本

支持的无服务器项目类型
这是什么?

安全性
可观察性

订阅级别
这是什么?

基本

支持级别
这是什么?

Elastic

概述

编辑

AWS Fargate 集成有助于检索有关您的容器和属于 Amazon Elastic Container Service (Amazon ECS) 集群的任务的元数据、网络指标和 Docker 统计信息。

AWS Fargate 集成目前仅支持 ECS 集群。它不支持 EKS 集群。

凭据

编辑

此集成不需要 AWS 凭据。ECS 任务元数据端点仅在集群内部可访问。

设置

编辑

要开始收集 AWS Fargate 指标,您必须在同一个任务定义中将 Elastic Agent 作为 边车容器与您的应用程序容器一起运行。

每个任务定义都必须运行一个 Agent,因为任务元数据信息仅对在任务中运行的容器可用。

以下是一个 Elastic Agent 作为边车与应用程序容器一起运行的示例

TaskDefinition:
    Type: AWS::ECS::TaskDefinition
    Properties:
      Family: !Ref TaskName
      Cpu: 256
      Memory: 512
      NetworkMode: awsvpc
      ExecutionRoleArn: !Ref ExecutionRole
      ContainerDefinitions:
        - Name: <application-container>              << ===== Application container
          Image: <application-container-image>
          <application-container-settings>
        - Name: elastic-agent-container              << ===== Elastic Agent container
          Image: docker.elastic.co/beats/elastic-agent:8.12.0

Elastic Agent 使用 Amazon ECS 任务元数据端点收集指标。

Amazon ECS 任务元数据端点是一个 HTTP 端点,每个容器都可以访问,并且默认在 AWS Fargate 平台版本 1.4.0 及更高版本上启用。Elastic Agent 使用 任务元数据端点版本 4

使用 AWS 管理控制台入门

编辑

本节向您展示如何在 ECS 集群中运行 Elastic Agent,开始收集 Fargate on ECS 指标,并将它们发送到 Elastic Stack。

要在您现有的 ECS 集群上快速部署,请按照以下步骤操作。

任务定义
编辑

打开 AWS 管理控制台并访问 Amazon ECS 页面。在这里,您可以选择“任务定义”,然后选择“创建新任务定义”以启动向导。

步骤 1

  • 从可用启动类型的列表中选择“Fargate”。

步骤 2

  • 为“任务定义名称”添加您喜欢的名称,例如“elastic-agent-fargate-deployment”。
  • 对于“任务角色”,选择“ecsFargateTaskExecutionRole”。
  • 对于“操作系统系列”,选择“Linux”。
  • 为“任务内存 (GB)”和“任务 CPU (vCPU)”选择一个值;最低值适用于测试目的。
  • 单击“添加容器”。

至于容器,您可以使用以下值

  • 容器名称: elastic-agent-container
  • 映像: docker.elastic.co/beats/elastic-agent:8.12.0
  • 环境变量

    • FLEET_ENROLL: yes
    • FLEET_ENROLLMENT_TOKEN: <注册令牌>
    • FLEET_URL: <fleet-server-url>

使用 AWS Secrets Manager 存储 Fleet Server 注册令牌。

服务
编辑

选择一个现有的 ECS 集群,并使用启动类型“FARGATE”创建一个新服务。使用我们刚刚创建的任务定义。

一旦 Elastic Agent 启动,打开仪表板“[AWS Fargate] Fargate 概览”,您将在几分钟内看到指标显示出来。

使用 AWS CLI 入门

编辑

在本示例中,我们将使用 AWS CLI 和 CloudFormation 模板来设置以下资源

  • 一个 ECS 集群,
  • Elastic Agent 的任务定义,
  • 一个在集群上执行代理任务的服务。
设置
编辑

准备您的终端和 AWS 环境,以创建用于测试的 ECS 集群。

选择一个区域
编辑

为此会话设置默认 AWS 区域

export AWS_DEFAULT_REGION="us-east-1"
密钥管理
编辑

在 AWS Secrets Manager 中存储注册令牌和 Fleet Server URL

aws secretsmanager create-secret \
    --name FLEET_ENROLLMENT_TOKEN \
    --secret-string <your-fleet-enrollment-token-goes-here>

aws secretsmanager create-secret \
    --name FLEET_URL \
    --secret-string <your-fleet-url>

记下两个密钥的 Amazon Resource Name (ARN),我们稍后会用到它们。

如果您需要在测试期间更新它们,请使用以下 put-secret-value 来执行此操作

aws secretsmanager put-secret-value \
    --secret-id FLEET_ENROLLMENT_TOKEN \
    --secret-string <fleet-enrollment-token>
网络
编辑

还有一件事。您需要选择一个子网,您的 ECS 集群将在该子网中创建。记下下一步的子网 ID。

部署堆栈
编辑

复制以下 CloudFormation 模板,并将其以名称 cloudformation.yml 保存在您的计算机上

AWSTemplateFormatVersion: "2010-09-09"
Parameters:
  SubnetID:
    Type: String
    Description: Enter the ID of the subnet you want to create the cluster in.
  FleetEnrollmentTokenSecretArn:
    Type: String
    Description: Enter the Amazon Resource Name (ARN) of the secret holding the enrollment token for the Elastic Agent.
  FleetUrlSecretArn:
    Type: String
    Description: Enter the Amazon Resource Name (ARN) of the secret holding the Fleet Server URL.
  ClusterName:
    Type: String
    Default: elastic-agent-fargate
    Description: Enter the name of the Fargate cluster to create.
  RoleName:
    Type: String
    Default: ecsFargateTaskExecutionRole
    Description: Enter the Amazon Resource Name (ARN) of the task execution role that grants the Amazon ECS container agent permission to make AWS API calls on your behalf.
  TaskName:
    Type: String
    Default: elastic-agent-fargate-task
    Description: Enter the name of the task definition to create.
  ServiceName:
    Type: String
    Default: elastic-agent-fargate-service
    Description: Enter the name of the service to create.
  LogGroupName:
    Type: String
    Default: elastic-agent-fargate-log-group
    Description: Enter the name of the log group to create.
Resources:
  Cluster:
    Type: AWS::ECS::Cluster
    Properties:
      ClusterName: !Ref ClusterName
      ClusterSettings:
        - Name: containerInsights
          Value: disabled
  LogGroup:
    Type: AWS::Logs::LogGroup
    Properties:
      LogGroupName: !Ref LogGroupName
  ExecutionRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: !Ref RoleName
      AssumeRolePolicyDocument:
        Statement:
          - Effect: Allow
            Principal:
              Service: ecs-tasks.amazonaws.com
            Action: sts:AssumeRole
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy
      Policies:
        - PolicyName: !Sub 'EcsTaskExecutionRole-${AWS::StackName}'
          PolicyDocument:
            Version: 2012-10-17
            Statement:
              - Effect: Allow
                Action:
                  - secretsmanager:GetSecretValue
                Resource:
                  - !Ref FleetEnrollmentTokenSecretArn
                  - !Ref FleetUrlSecretArn
  TaskDefinition:
    Type: AWS::ECS::TaskDefinition
    Properties:
      Family: !Ref TaskName
      Cpu: 256
      Memory: 512
      NetworkMode: awsvpc
      ExecutionRoleArn: !Ref ExecutionRole
      ContainerDefinitions:
        - Name: elastic-agent-container
          Image: docker.elastic.co/beats/elastic-agent:8.12.0
          Secrets:
            - Name: FLEET_ENROLLMENT_TOKEN
              ValueFrom: !Ref FleetEnrollmentTokenSecretArn
            - Name: FLEET_URL
              ValueFrom: !Ref FleetUrlSecretArn
          LogConfiguration:
            LogDriver: awslogs
            Options:
              awslogs-region: !Ref AWS::Region
              awslogs-group: !Ref LogGroup
              awslogs-stream-prefix: ecs
          Environment:
            - Name: FLEET_ENROLL
              Value: true
              # You migh need to set FLEET_INSECURE to true
              # if you're connecting to a development
              # environment. Use it responsibly.
              # - Name: FLEET_INSECURE
              #   Value: true
      RequiresCompatibilities:
        - EC2
        - FARGATE
  Service:
    Type: AWS::ECS::Service
    Properties:
      ServiceName: !Ref ServiceName
      Cluster: !Ref Cluster
      TaskDefinition: !Ref TaskDefinition
      DesiredCount: 1
      LaunchType: FARGATE
      NetworkConfiguration:
        AwsvpcConfiguration:
          AssignPublicIp: ENABLED
          Subnets:
            - !Ref SubnetID

我们现在终于准备好部署 ECS 集群,其中 Elastic Agent 在其自己的任务中运行。

aws cloudformation create-stack \
    --stack-name elastic-agent-fargate-deployment \
    --template-body file://./cloudformation.yml \
    --capabilities CAPABILITY_NAMED_IAM \
    --parameters \
        ParameterKey=SubnetID,ParameterValue=<subnet-id> \
        ParameterKey=FleetEnrollmentTokenSecretArn,ParameterValue=arn:aws:secretsmanager:eu-west-1:000123456789:secret:FLEET_ENROLLMENT_TOKEN-ZxsJGw \
        ParameterKey=FleetUrlSecretArn,ParameterValue=arn:aws:secretsmanager:eu-west-1:000123456789:secret:FLEET_URL-mvjF3a \
        ParameterKey=ClusterName,ParameterValue=elastic-agent-fargate \
        ParameterKey=RoleName,ParameterValue=ecsFargateTaskExecutionRole \
        ParameterKey=TaskName,ParameterValue=elastic-agent-fargate-task \
        ParameterKey=ServiceName,ParameterValue=elastic-agent-fargate-service \
        ParameterKey=LogGroupName,ParameterValue=elastic-agent-fargate-log-group

AWS CLI 将返回一个 StackId

{
    "StackId": "arn:aws:cloudformation:eu-west-1:000123456789:stack/elastic-agent-deployment/fc324160-b0f9-11ec-9c45-0643aa7239c3"
}

检查堆栈状态,直到它达到 CREATE_COMPLETE 状态。使用 AWS 管理控制台或 AWS CLI(需要工具 jq

$ aws cloudformation list-stacks | jq '.StackSummaries[] | .StackName + " " + .StackStatus'

"elastic-agent-fargate-deployment CREATE_COMPLETE"

就这样!

清理
编辑

一旦您完成了实验,您可以使用以下命令删除所有资源(ECS 集群、任务、服务等)

aws cloudformation delete-stack --stack-name elastic-agent-fargate-deployment

进一步阅读

编辑

如果您想了解有关 Amazon ECS 指标的更多信息,请查看博客文章 如何使用 Elastic 可观察性监控 Amazon ECS

指标

编辑
任务统计信息
编辑

ECS 字段参考

请参阅以下 文档,了解有关 ECS 字段的详细信息。

导出的字段
字段 描述 类型 指标类型

@timestamp

事件时间戳。

date

agent.id

此代理的唯一标识符(如果存在)。示例:对于 Beats,这将是 beat.id。

keyword

awsfargate.task_stats.cluster_name

集群名称

keyword

awsfargate.task_stats.cpu.core.*.norm.pct

每个 CPU 核心的时间百分比,按 CPU 核心数归一化。

scaled_float

gauge

awsfargate.task_stats.cpu.core.*.pct

每个 CPU 核心的时间百分比。

scaled_float

gauge

awsfargate.task_stats.cpu.core.*.ticks

每个 CPU 核心的 CPU 时钟周期。

long

counter

awsfargate.task_stats.cpu.kernel.norm.pct

内核空间中的时间百分比,按 CPU 核心数归一化。

scaled_float

gauge

awsfargate.task_stats.cpu.kernel.pct

内核空间中的时间百分比。

scaled_float

gauge

awsfargate.task_stats.cpu.kernel.ticks

内核空间中的 CPU 时钟周期。

long

counter

awsfargate.task_stats.cpu.system.norm.pct

系统中总 CPU 时间的百分比,按 CPU 核心数归一化。

scaled_float

gauge

awsfargate.task_stats.cpu.system.pct

系统中总 CPU 时间的百分比。

scaled_float

gauge

awsfargate.task_stats.cpu.system.ticks

CPU 系统时钟周期。

long

counter

awsfargate.task_stats.cpu.total.norm.pct

总 CPU 使用率,按 CPU 核心数归一化。

scaled_float

gauge

awsfargate.task_stats.cpu.total.pct

总 CPU 使用率。

scaled_float

gauge

awsfargate.task_stats.cpu.user.norm.pct

用户空间中的时间百分比,按 CPU 核心数归一化。

scaled_float

gauge

awsfargate.task_stats.cpu.user.pct

用户空间中的时间百分比。

scaled_float

gauge

awsfargate.task_stats.cpu.user.ticks

用户空间中的 CPU 时钟周期。

long

counter

awsfargate.task_stats.diskio.read.bytes

容器生命周期内读取的字节数

long

counter

awsfargate.task_stats.diskio.read.ops

容器生命周期内的读取次数

long

counter

awsfargate.task_stats.diskio.read.queued

排队请求的总数

long

counter

awsfargate.task_stats.diskio.read.rate

每秒当前读取次数

long

gauge

awsfargate.task_stats.diskio.read.service_time

服务 IO 请求的总时间,以纳秒为单位

long

counter

awsfargate.task_stats.diskio.read.wait_time

请求在队列中等待服务所花费的总时间,以纳秒为单位

long

counter

awsfargate.task_stats.diskio.reads

每秒当前读取次数

scaled_float

gauge

awsfargate.task_stats.diskio.summary.bytes

容器生命周期内读取和写入的字节数

long

counter

awsfargate.task_stats.diskio.summary.ops

容器生命周期内的 I/O 操作次数

long

counter

awsfargate.task_stats.diskio.summary.queued

排队请求的总数

long

counter

awsfargate.task_stats.diskio.summary.rate

每秒当前操作次数

long

gauge

awsfargate.task_stats.diskio.summary.service_time

服务 IO 请求的总时间,以纳秒为单位

long

counter

awsfargate.task_stats.diskio.summary.wait_time

请求在队列中等待服务所花费的总时间,以纳秒为单位

long

counter

awsfargate.task_stats.diskio.total

每秒读取和写入次数

scaled_float

gauge

awsfargate.task_stats.diskio.write.bytes

容器生命周期内写入的字节数

long

counter

awsfargate.task_stats.diskio.write.ops

容器生命周期内的写入次数

long

counter

awsfargate.task_stats.diskio.write.queued

排队请求的总数

long

counter

awsfargate.task_stats.diskio.write.rate

每秒当前写入次数

long

gauge

awsfargate.task_stats.diskio.write.service_time

服务 IO 请求的总时间,以纳秒为单位

long

counter

awsfargate.task_stats.diskio.write.wait_time

请求在队列中等待服务所花费的总时间,以纳秒为单位

long

counter

awsfargate.task_stats.diskio.writes

每秒当前写入次数

scaled_float

gauge

awsfargate.task_stats.identifier

跨任务和集群的容器标识符,等于 container.name + / + container.id。

keyword

awsfargate.task_stats.memory.commit.peak

Windows 上的峰值提交字节数

long

counter

awsfargate.task_stats.memory.commit.total

总字节数

long

counter

awsfargate.task_stats.memory.fail.count

失败计数器。

scaled_float

counter

awsfargate.task_stats.memory.limit

内存限制。

long

gauge

awsfargate.task_stats.memory.private_working_set.total

Windows 上的私有工作集

long

gauge

awsfargate.task_stats.memory.rss.pct

内存驻留集大小百分比。

scaled_float

gauge

awsfargate.task_stats.memory.rss.total

总内存驻留集大小。

long

gauge

awsfargate.task_stats.memory.rss.usage.max

最大内存使用量。

long

counter

awsfargate.task_stats.memory.rss.usage.pct

内存使用率百分比。

scaled_float

gauge

awsfargate.task_stats.memory.rss.usage.total

总内存使用量。

long

gauge

awsfargate.task_stats.memory.stats.*

来自 cgroups memory.stat 接口的原始内存统计信息

unsigned_long

awsfargate.task_stats.memory.usage.max

最大内存使用量。

long

counter

awsfargate.task_stats.memory.usage.total

总内存使用量。

long

gauge

awsfargate.task_stats.network.*.inbound.bytes

传入字节总数。

long

counter

awsfargate.task_stats.network.*.inbound.dropped

丢弃的传入数据包总数。

long

counter

awsfargate.task_stats.network.*.inbound.errors

传入数据包的总错误数。

long

counter

awsfargate.task_stats.network.*.inbound.packets

传入数据包总数。

long

counter

awsfargate.task_stats.network.*.outbound.bytes

传入字节总数。

long

counter

awsfargate.task_stats.network.*.outbound.dropped

丢弃的传入数据包总数。

long

counter

awsfargate.task_stats.network.*.outbound.errors

传入数据包的总错误数。

long

counter

awsfargate.task_stats.network.*.outbound.packets

传入数据包总数。

long

counter

awsfargate.task_stats.task_desired_status

来自 Amazon ECS 的任务的所需状态。

keyword

awsfargate.task_stats.task_known_status

来自 Amazon ECS 的任务的已知状态。

keyword

awsfargate.task_stats.task_name

ECS 任务名称

keyword

container.labels.com_amazonaws_ecs_cluster

ECS 集群名称

keyword

container.labels.com_amazonaws_ecs_container-name

ECS 容器名称

keyword

container.labels.com_amazonaws_ecs_task-arn

ECS 任务 ARN

keyword

container.labels.com_amazonaws_ecs_task-definition-family

ECS 任务定义系列

keyword

container.labels.com_amazonaws_ecs_task-definition-version

ECS 任务定义版本

keyword

container.name

容器名称。

keyword

data_stream.dataset

数据流数据集。

constant_keyword

data_stream.namespace

数据流命名空间。

constant_keyword

data_stream.type

数据流类型。

constant_keyword

示例

task_stats 的示例事件如下所示

{
    "@timestamp": "2017-10-12T08:05:34.853Z",
    "awsfargate": {
        "task_stats": {
            "cluster_name": "default",
            "task_known_status": "RUNNING",
            "task_desired_status": "RUNNING",
            "cpu": {
                "core": {
                    "1": {
                        "pct": 0,
                        "norm": {
                            "pct": 0
                        },
                        "ticks": 1520000000
                    },
                    "2": {
                        "pct": 0,
                        "norm": {
                            "pct": 0
                        },
                        "ticks": 1420180000000
                    }
                },
                "kernel": {
                    "norm": {
                        "pct": 0
                    },
                    "pct": 0,
                    "ticks": 1520000000
                },
                "system": {
                    "norm": {
                        "pct": 1
                    },
                    "pct": 2,
                    "ticks": 1420180000000
                },
                "total": {
                    "norm": {
                        "pct": 0.2
                    },
                    "pct": 0.4
                },
                "user": {
                    "norm": {
                        "pct": 0
                    },
                    "pct": 0,
                    "ticks": 490000000
                }
            },
            "diskio": {
                "read": {
                    "bytes": 3452928,
                    "ops": 118,
                    "queued": 0,
                    "rate": 0,
                    "service_time": 0,
                    "wait_time": 0
                },
                "reads": 0,
                "summary": {
                    "bytes": 3452928,
                    "ops": 118,
                    "queued": 0,
                    "rate": 0,
                    "service_time": 0,
                    "wait_time": 0
                },
                "total": 0,
                "write": {
                    "bytes": 0,
                    "ops": 0,
                    "queued": 0,
                    "rate": 0,
                    "service_time": 0,
                    "wait_time": 0
                },
                "writes": 0
            },
            "identifier": "query-metadata/1234",
            "memory": {
                "fail": {
                    "count": 0
                },
                "limit": 0,
                "rss": {
                    "pct": 0.0010557805807105247,
                    "total": 4157440
                },
                "stats": {
                    "active_anon": 4157440,
                    "active_file": 4497408,
                    "cache": 6000640,
                    "dirty": 16384,
                    "hierarchical_memory_limit": 2147483648,
                    "hierarchical_memsw_limit": 9223372036854772000,
                    "inactive_anon": 0,
                    "inactive_file": 1503232,
                    "mapped_file": 2183168,
                    "pgfault": 6668,
                    "pgmajfault": 52,
                    "pgpgin": 5925,
                    "pgpgout": 3445,
                    "rss": 4157440,
                    "rss_huge": 0,
                    "total_active_anon": 4157440,
                    "total_active_file": 4497408,
                    "total_cache": 600064,
                    "total_dirty": 16384,
                    "total_inactive_anon": 0,
                    "total_inactive_file": 4497408,
                    "total_mapped_file": 2183168,
                    "total_pgfault": 6668,
                    "total_pgmajfault": 52,
                    "total_pgpgin": 5925,
                    "total_pgpgout": 3445,
                    "total_rss": 4157440,
                    "total_rss_huge": 0,
                    "total_unevictable": 0,
                    "total_writeback": 0,
                    "unevictable": 0,
                    "writeback": 0
                },
                "usage": {
                    "max": 15294464,
                    "total": 12349440
                }
            },
            "network": {
                "eth0": {
                    "inbound": {
                        "bytes": 137315578,
                        "dropped": 0,
                        "errors": 0,
                        "packets": 94338
                    },
                    "outbound": {
                        "bytes": 1086811,
                        "dropped": 0,
                        "errors": 0,
                        "packets": 25857
                    }
                }
            },
            "task_name": "query-metadata"
        }
    },
    "cloud": {
        "region": "us-west-2"
    },
    "container": {
        "id": "1234",
        "image": {
            "name": "mreferre/eksutils"
        },
        "labels": {
            "com_amazonaws_ecs_cluster": "arn:aws:ecs:us-west-2:111122223333:cluster/default",
            "com_amazonaws_ecs_container-name": "query-metadata",
            "com_amazonaws_ecs_task-arn": "arn:aws:ecs:us-west-2:111122223333:task/default/febee046097849aba589d4435207c04a",
            "com_amazonaws_ecs_task-definition-family": "query-metadata",
            "com_amazonaws_ecs_task-definition-version": "7"
        },
        "name": "query-metadata"
    },
    "service": {
        "type": "awsfargate"
    }
}

更新日志

编辑
更新日志
版本 详细信息 Kibana 版本

1.2.1

增强 (查看拉取请求)
澄清集成仅支持 ECS 集群。

8.13.0 或更高版本

1.2.0

增强 (查看拉取请求)
添加对 task_stats 数据流的处理器支持。

8.13.0 或更高版本

1.1.0

增强 (查看拉取请求)
ECS 版本更新至 8.11.0。更新 kibana 约束至 ^8.13.0。修改了字段定义,以删除 ecs@mappings 组件模板中已变得冗余的 ECS 字段。

8.13.0 或更高版本

1.0.0

增强 (查看拉取请求)
使 AWS Fargate GA(正式发布)

8.12.0 或更高版本

0.5.1

增强 (查看拉取请求)
改进文档

0.5.0

错误修复 (查看拉取请求)
移除 memory.usage.pct 字段,并使用 memory.usage.total 代替以表示纯内存使用量。

0.4.0

增强 (查看拉取请求)
将软件包 format_version 更新至 3.0.0。

0.3.0

增强 (查看拉取请求)
为任务统计数据流启用 TSDB。这提高了存储使用率和查询性能。有关更多详细信息,请参阅 https://elastic.ac.cn/guide/en/elasticsearch/reference/current/tsds.html

0.2.5

增强 (查看拉取请求)
更新 DiskIO 写入和读取可视化效果,以使用 last_value 而不是 average。

0.2.4

增强 (查看拉取请求)
将 AWS Fargate 输入控件迁移到新的控制面板。

0.2.3

增强 (查看拉取请求)
设置维度字段并添加 agent.id

0.2.2

增强 (查看拉取请求)
向字段添加指标类型。

0.2.1

增强 (查看拉取请求)
添加了类别和/或子类别。

0.2.0

增强 (查看拉取请求)
通过从库中删除单独的可视化效果来改进仪表板

0.1.3

增强 (查看拉取请求)
阐明如何将 awsfargate 集成作为 sidecar 容器运行。

0.1.2

增强 (查看拉取请求)
在收集的字段中添加 Fargate 任务的 DesiredStatus 和 KnownStatus

0.1.1

增强 (查看拉取请求)
改进描述和屏幕截图

0.1.0

增强 (查看拉取请求)
初始版本