工程

如何通过 Elastic 可观测性监测 Amazon ECS

由于越来越多的组织把他们的应用程序和工作负载转移到了容器里,监测和追踪容器运行状况和使用情况的能力变得更加至关重要。很多团队已经开始使用 Metricbeat docker 模块来收集 Docker 容器监测数据,以便在 Elasticsearch 上存储和分析这些数据,有助于未来进一步分析。但当用户使用 Amazon Elastic 容器服务 (Amazon ECS) 时,将会发生什么呢?仍可用 Metricbeat 监测 Amazon ECS 吗?可以!

在这篇博客中,我们将逐步为您介绍如何用 Elastic 可观测性 来监测 Amazon ECS!

什么是 Amazon ECS?

Amazon ECS 是一种高度可扩展的完全托管型服务,能让编排和配置 Docker 容器变得很容易。有两种不同的基本云服务支持它,这两种服务称为“启动类型”,可决定电脑资源管理方式,它们分别是:EC2 和 Fargate。

使用 EC2 启动类型时,容器在用户必须自行管理的 EC2 实例上运行。使用 Fargate 启动类型时,用户只需指明容器和任务。然后,Fargate 会配置、预配及管理后端基础架构。

我们来看一下如何用 Metricbeat 监测每种启动类型! 

如何通过 Elastic 监测 Amazon ECS EC2 容器

在 EC2 上部署容器时,用户负责对自己的 Amazon ECS 集群进行部署和管理。从监测的角度上看,这些 EC2 实例就跟其他普通的 VM 一样,这意味着用户可以连接它们,并直接从 Docker 守护进程中收集 Docker 统计信息。我们来看一下如何监测在 EC2 上运行的 Amazon ECS 容器,这分为以下几个简单的步骤:

前提条件:SSL 密匙

创建您的 Amazon ECS 集群时,请确保您附上有效的 SSL 密匙,以便通过 SSH 访问实例:

第 1 步:安全组

在网络部分,请确保您选择了一个允许您启用 SSH 访问(端口 22)的安全组

第 2 步:核实 EC2 实例

正确启动 Amazon ECS 集群之后,您就可以列出您的 EC2 实例:

第 3 步:SSL 连接

通过 SSH 以及使用您在第 1 步中附上的密钥对,您能连接到每一个实例,比如:

ssh -i "ec2-ecs-test.pem" ec2-user@3.125.104.129

第 4 步:安装 Metricbeat

由于您能访问所有的集群实例,您可以在每个实例中安装 Metricbeat 并开始从 Docker 守护进程中收集指标:

curl -L -O <a href="https://artifacts.elastic.co/downloads/beats/metricbeat/metricbeat-7.11.1-x86_64.rpm">https://artifacts.elastic.co/downloads/beats/metricbeat/metricbeat-7.11.1-x86_64.rpm</a> 
sudo rpm -vi metricbeat-7.10.1-x86_64.rpm 
sudo metricbeat modules disable system 
sudo metricbeat modules enable docker

现在,我们可以定义 Elasticsearch 终端,以把指标发送过去,在本例中是一个在 Elastic Cloud 上运行的实例。如果您想跟着操作,您可以注册费试用

编辑 metricbeat.yml 并添加 Elastic Cloud 选项:

通常您会在 /etc/metricbeat/metricbeat.yml 路径下找到这个文件,且可以把它编辑为:

sudo vi /etc/metricbeat/metricbeat.yml
cloud.id: "elastic-observability-deployment:ZXV…….k3MTI1ZTA1Ng==" 
cloud.auth: "elastic:2vXXXXXXXXXXXxxxxxxxxxxxV"

如果您正在运行一个自管型 Elasticsearch 集群,您需要配置 Elasticsearch 输出

output.elasticsearch:
  hosts: ["https://myEShost:9200"] 
  username: "elastic" 
  password: "changeme"

下一步,您可以设定预先定义的仪表板、索引和映射:

sudo metricbeat setup -e

启动 Metricbeat:

./metricbeat -e -d & 
sudo service metricbeat start

您也可以把 Metricbeat 服务配置为在系统启动时自动启动:

systemctl enable metricbeat
注意:这一过程必须在该集群的所有 EC2 实例上进行。

第 5 步:核实指标收集

由于 Metricbeat 正在运行,我们可以通过在 Kibana 的“Discover”(数据探索)视图中查看与 Docker 有关的指标,核实事件是否都存到了 Elasticsearch 集群里:

现在,我们可以继续在我们的 Amazon ECS 集群上部署任务,并且 Metricbeat 会从这些任务中收集指标。我们可以使用这些指标来创建可视化内容和仪表板,同时使用额外的元数据,比如默认添加的 cloud_metadatahost_metadata,这两个元数据用于根据 AWS 帐户、地区、主机识别符和类型等信息来关联指标。比如,我们可以通过结合 docker.info.containers.running 指标和 host.name 提供一个概览,显示我们在每个主机上在一定时间内拥有多少正在运行的容器:

第 6 步:在预构建的 Kibana 仪表板上查看指标

另外,我们可以很好地在与 Metricbeat 捆绑的默认 Docker 仪表板上概览容器工作负载:

监测 Amazon ECS 任务只需简单的几步,并且到时您还可以通过使用 Metricbeat 持续增加 EC2 集群的可见性。我们现在继续来看一下如何监测在 Fargate 上运行的 Amazon ECS 任务。

如何通过 Elastic 监测 Fargate 容器

Fargate 上的 Amazon ECS 通过任务元数据终端公开了多种元数据、网络指标,以及有关正在运行的任务和容器的 Docker 统计数据。Metricbeat 使用的是任务元数据终端版本 4,所有容器都可以使用这一终端,且在 AWS Fargate 平台 1.4.0 及以上版本中,默认启用这一终端。

要监测一个正在 Fargate 上运行的任务,您需要在这个任务上部署一个 Metricbeat 容器,方法是手动添加一个新的容器定义。在标准部分,您可以给定一个 Container name,比如metricbeat-container,并使用 Elastic Docker 注册表 docker.elastic.co/beats/metricbeat:7.11.0 中的 Metricbeat docker 镜像,以得到 Metricbeat 镜像的具体版本。

我们还需要为这个容器添加一个命令,以设定并启动 Metricbeat,并把数据发送到 Elastic Cloud:

./metricbeat setup -E cloud.id=$ELASTIC_CLOUD_ID -E cloud.auth=$ELASTIC_CLOUD_AUTH && ./metricbeat modules disable system && ./metricbeat modules enable awsfargate && ./metricbeat -e -E cloud.id=$ELASTIC_CLOUD_ID -E cloud.auth=$ELASTIC_CLOUD_AUTH

您需要在环境变量 部分中使用实际凭证为 $ELASTIC_CLOUD_ID$ELASTIC_CLOUD_AUTH 添加值,可以用 AWS Secret Manager 来避免以纯文本存储这些值:

一旦完成新任务的定义修改,点击“操作”下拉菜单中的运行任务,重启后,Metricbeat 就将被添加到任务中。

如果您有较多任务需要监测,那么手动添加 Metricbeat 容器就会耗时又枯燥。在这种情况下,我们建议使用 AWS CloudFormation,这是 AWS 自带的资源管理方式,无需动手操作就能够在资源的整个生命周期中进行配置和更新。AWS CloudFormation 让您能够把基础架构当作代码,通过一个定义了所有必需资源及其依赖因素的模板文件对其进行管理。

这里是一个有关如何使用 CloudFormation 把 Metricbeat 容器添加到一个任务中的简单例子:

 TaskDefinition:
   Type:AWS::ECS::TaskDefinition 
   Properties:
     Family: !Ref TaskName 
     Cpu:256 
     Memory:512 
     NetworkMode: awsvpc 
     ExecutionRoleArn: !Ref ExecutionRole 
     ContainerDefinitions:
       - Name: metricbeat-container 
         Image: docker.elastic.co/beats/metricbeat:7.11.0 
         Secrets:
           - Name:ELASTIC_CLOUD_ID 
             ValueFrom: !Ref CloudIDArn 
           - Name:ELASTIC_CLOUD_AUTH 
             ValueFrom: !Ref CloudAuthArn 
                 EntryPoint:
           - sh 
           - -c 
         Command:
           - ./metricbeat setup -E cloud.id=$ELASTIC_CLOUD_ID -E cloud.auth=$ELASTIC_CLOUD_AUTH && ./metricbeat modules disable system && ./metricbeat modules enable awsfargate && ./metricbeat -e -E cloud.id=$ELASTIC_CLOUD_ID -E cloud.auth=$ELASTIC_CLOUD_AUTH

您也可以找到一个带有awsfargate 模块 AWS CloudFormation 完整模板,它创建了一个新的集群和带有 Metricbeat 容器和压力测试容器的任务定义,并启动服务。您随时都可以把这一模版复制到一个cloudformation.yml本地文件中,并进行尝试。

如果您正在使用 Elastic Cloud,建议您把 cloud id 和 cloud auth 存到 AWS secret manager 中。这里有一个 AWS CLI 例子:

创建密钥 ELASTIC_CLOUD_AUTH

aws --region us-east-1 secretsmanager create-secret --name ELASTIC_CLOUD_AUTH --secret-string XXX

创建密钥 ELASTIC_CLOUD_ID

aws --region us-east-1 secretsmanager create-secret --name ELASTIC_CLOUD_ID --secret-string YYY

密钥现在都准备好了,接下来,让我们用 CloudFormation 模板文件 cloudformation.yml 调用一个 AWS CLI 来创建一个完整的堆栈。

创建 CloudFormation 堆栈:

aws --region us-east-1 cloudformation create-stack --stack-name test-metricbeat-deployment --template-body file://./cloudformation.yml --capabilities CAPABILITY_NAMED_IAM --parameters ParameterKey=SubnetID,ParameterValue=subnet-5d89de27 ParameterKey=CloudAuthArn,ParameterValue=arn:aws:secretsmanager:us-east-1:xxx:secret:ELASTIC_CLOUD_AUTH-abc ParameterKey=CloudIDArn,ParameterValue=arn:aws:secretsmanager:us-east-1:xxx:secret:ELASTIC_CLOUD_ID-abc ParameterKey=ClusterName,ParameterValue=metricbeat-fargate ParameterKey=RoleName,ParameterValue=ecsFargateTaskExecutionRole 
ParameterKey=TaskName,ParameterValue=task-metricbeat ParameterKey=ServiceName,ParameterValue=metricbeat-service ParameterKey=LogGroupName,ParameterValue=metricbeat-fargate-log-group

一旦 CloudFormation 显示您的堆栈处于 CREATE_COMPLETE 状态,您就应该能看到监测指标每 10 秒就会被发送到 Elasticsearch 一次。awsfargate 模块会从每个容器中收集运行时间指标,包括 CPU、存储器、网络和 diskIO 信息。还有一个即用仪表板,可供您用它来显示 Kibana 中 awsfargate 上的所有监测数据:

一旦您完成体验,您可以用 AWS CLI 轻易地删除整个堆栈:

aws --region us-east-1 cloudformation delete-stack --stack-name test-metricbeat-deployment

后续操作

您在寻找用于 Amazon ECS 容器部署的监测解决方案吗?有了 Metricbeat dockerawsfargate 模块,用户可以轻易监测 Amazon ECS 容器,并把指标发送到 Elastic Cloud 上的 Elasticsearch 服务中。如果您有任何问题或反馈,敬请在 Beats 论坛上发帖哦!