AWS Fargate 集成(用于 ECS 集群)
编辑AWS Fargate 集成(用于 ECS 集群)
编辑概述
编辑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>
- FLEET_ENROLL:
使用 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 |
增强 (查看拉取请求) |
8.13.0 或更高版本 |
1.2.0 |
增强 (查看拉取请求) |
8.13.0 或更高版本 |
1.1.0 |
增强 (查看拉取请求) |
8.13.0 或更高版本 |
1.0.0 |
增强 (查看拉取请求) |
8.12.0 或更高版本 |
0.5.1 |
增强 (查看拉取请求) |
— |
0.5.0 |
错误修复 (查看拉取请求) |
— |
0.4.0 |
增强 (查看拉取请求) |
— |
0.3.0 |
增强 (查看拉取请求) |
— |
0.2.5 |
增强 (查看拉取请求) |
— |
0.2.4 |
增强 (查看拉取请求) |
— |
0.2.3 |
增强 (查看拉取请求) |
— |
0.2.2 |
增强 (查看拉取请求) |
— |
0.2.1 |
增强 (查看拉取请求) |
— |
0.2.0 |
增强 (查看拉取请求) |
— |
0.1.3 |
增强 (查看拉取请求) |
— |
0.1.2 |
增强 (查看拉取请求) |
— |
0.1.1 |
增强 (查看拉取请求) |
— |
0.1.0 |
增强 (查看拉取请求) |
— |