弹性货柜服务(ECS)是Amazon提供的完全托管容器编排服务。结合FargateAmazon为容器提供的无服务器计算引擎,您可以运行容器工作负载,而无需配置自己的计算资源。
但是如何整合和查询这些工作负载的所有日志和元数据呢?洛基,Grafana实验室的日志聚合系统已经证明bob电竞频道提高性能而且降低成本.
在本教程中,您将学习如何利用Firelens,一个AWS日志路由器,将您的日志和工作负载元数据转发到一个洛基实例。
因此,你将能够在一个地方查询所有日志使用Grafana.
对于使用Promtail代理,查看我以前的教程如何设置Promtail在一个AWS EC2实例或onAWS的.
这篇博文将涵盖:
需求
在我们开始之前,你需要:
- 的AWS CLI配置(运行
aws配置
). - 已经配置了Loki数据源的Grafana实例。
- VPC中与internet路由可达的子网。(遵循这些指令如果你需要创建一个。)
- 一个安全组为您的容器选择。(遵循这些指令如果你需要创建一个。)
为了简单起见,我们将使用Grafana Cloud Loki和Grafana实例(您可以获得30天的免费试用)格拉夫纳云洛基),但是如果你在运行自己的开源版本的Loki和Grafana实例,所有的步骤都是一样的。
设置ECS集群
要使用ECS运行容器,您需要一个ECS集群.我们将使用Fargate集群,但如果您更喜欢使用EC2集群,所有给定的步骤仍然适用。
让我们用awscli创建集群:
Aws ecs create-cluster——cluster-name ecs-firelens-cluster
我们还需要一个IAM运行容器的角色因此,让我们创建一个新的并授权ECS认可这个角色。
你可能已经有了这个
ecsTaskExecutionRole
您的AWS帐户中的角色。如果是这种情况,您可以跳过这一步。
Curl https://raw.githubusercontent.com/grafana/loki/master/docs/aws/ecs/ecs-role.json > ecs-role。//ecs-role. json aws iam create-role——role-name ecs- executionrole——假设-role-policy-document文件json {"Role": {"Path": "/", "RoleName": " ecaskexecutionrole ", "RoleId": "AROA5FW5RZWLXFPU656SQ", "Arn": "Arn:aws:iam::0000000000: Role / ecaskexecutionrole ", "CreateDate": "2020-07-09T14:51:49+00:00", " becomerolepolicydocument ": {"Version": "2012-10-17", "Statement": [{"Effect": "Allow", "Principal": {"Service": ["ecs-tasks.amazonaws.com"]}, "Action": "sts: autherole "}]}}}}
注意在攻击关于这个新角色;我们稍后将使用它来创建一个ECS任务。
最后我们会给出ECS任务执行策略(AmazonECSTaskExecutionRolePolicy
)到已创建的角色。这将允许我们使用Firelens:
“arn:aws:iam::aws:policy/service-role/ amazonecaskexecutionrolepolicy”
创建任务定义
亚马逊Firelens日志路由器(通常fluentd
或fluentbit
)在应用程序容器旁边运行相同的任务定义,将它们的日志路由到Loki。
在本例中,我们将使用fluentbit(洛基插件安装),但如果你喜欢fluentd一定要检查文档.
我们的任务定义将由两个容器组成Firelens日志路由器发送日志到Loki (log_router
)和一个示例应用程序来生成日志(样本应用
).
让我们下载任务定义,然后浏览最重要的部分。
Curl https://raw.githubusercontent.com/grafana/loki/master/docs/aws/ecs/ecs-task.json > ecs-task.json
{"essential": true, "image": "grafana/ fluentbit -plugin-loki:1.5.0-amd64", "name": "log_router", "firelensConfiguration": {"type": "fluentbit", "options": {"enable-ecs-log-metadata": "true"}}, "logConfiguration": {"logDriver": " awlogs ", "options": {"awslogs-group": "firelens-container", "awslogs-region": "us-east-2", "awslogs-create-group": "true", "awslogs-stream-prefix": "firelens"}}, "memoryReservation": 50},
的log_router
容器图像是Loki docker图像其中包含预安装的Loki插件。如你所见,firelensConfiguration
类型设置为fluentbit
我们还添加了选项
启用ECS日志元数据。这将是有用的查询您的日志与洛基LogQL标签匹配器。
的
logConfiguration
主要用于调试fluentbit容器,但在完成测试和配置后,可以随意删除该部分。
{"command": ["/bin/sh -c \"while true;echo hello_world;done\""], "entryPoint": ["sh","-c"], "essential": true, "image": "alpine:3.12", "logConfiguration": {"logDriver": "awsfirelens", "options": {"Name": " grafancloud apikey>@logs-prod-us-central1.grafana.net/loki/api/v1/push", "Labels": "{job=\"firelens\"}", "RemoveKeys": "container_id,ecs_task_arn", "LabelKeys": "container_name,ecs_task_definition,source,ecs_cluster", "LineFormat": "key_value"}}, "Name": " example -app"}
第二个容器是样本应用
,一个简单的高山打印到标准输出欢迎消息的容器。为了将这些日志发送给Loki,我们将配置此容器以使用日志驱动程序awsfirelens
.
继续并替换Url
你的财产GrafanaCloud凭证。你可以在你的账户在Loki实例页面。如果你正在运行你自己的Loki实例,完全替换URL(例如http://my-loki.com:3100/loki/api/v1/push
).
所有选项
的logConfiguration
会自动翻译成fluentbit输出.例如,上述选项将产生此流畅位输出
配置部分:
[OUTPUT] Name loki Match awsfirelens* Url https://:@logs-prod-us-central1.grafana.net/loki/api/v1/push Labels {job="firelens"} RemoveKeys container_id,ecs_task_arn LabelKeys container_name,ecs_task_definition,source,ecs_cluster LineFormat key_value
这输出
Config将日志转发到GrafanaCloud洛基。要了解有关这些选项的更多信息,请务必阅读洛基输出的文档.我们保留了一些有趣而有用的标签,比如container_name
,ecs_task_definition
,源
而且ecs_cluster
,但您可以静态地通过标签
选择。
如果要在任务中运行多个容器,所有容器都需要一个
logConfiguration
部分。这使您有机会根据容器添加不同的标签。
{"containerDefinitions":[…], "cpu": "256", "executionRoleArn": "arn:aws:iam::00000000:role/ lecaskexecutionrole ", "family": "loki-fargate-task-definition", "memory": "512", "networkMode": "awsvpc", " requirescompatiments ": ["FARGATE"]}
最后,您需要替换executionRoleArn
与在攻击我们创造的角色第一部分.
一旦你完成了任务定义的编辑,我们可以运行下面的命令来创建任务:
Aws ecs register-task-definition——region us-east-2——cli-input-json文件://ecs-task.json
现在让我们创建并启动一个服务。
运行您的服务
要运行服务,您需要提供任务定义名称loki-fargate-task-definition: 1
哪个是任务族加任务修正的组合:1
.您还需要自己的子网和安全组。你可以分别替换子网- 306 ca97d
而且sg-02c489bbdeffdca1d
在下面的命令中启动你的服务:
aws ecs create-service——cluster ecs-firelens-cluster \——service-name firelens-loki-fargate \——task-definition loki-fargate-task-definition:1 \——want -count 1——region us-east-2——launch-type "FARGATE" \——network-configuration "awsvpcConfiguration={subnets=[subnet-306ca97d],securityGroups=[sg-02c489bbdeffdca1d],assignPublicIp=ENABLED}"
确保公众(
assignPublicIp
)启用,否则ECS将无法连接到Internet,您将无法提取外部docker映像。
现在可以访问ECS控制台,应该可以看到任务正在运行。现在让我们打开Grafana并使用Loki数据源来探索我们的任务日志。输入查询{工作= " firelens "}
你应该看看我们的样本应用
日志显示如下所示:
使用日志标签
下拉菜单,您应该能够通过ECS元数据发现您的工作负载,如果展开日志行,也可以看到它。
就是这样!一定要看看LogQL了解更多关于强大的Loki查询语言。