ECS(亚马逊弹性计算云容器服务)是一项高度可扩展的,高性能的软件容器管理服务,它支持Docker 软件容器,并允许您轻松地在受 Amazon EC2 实例管理的集群中运行应用程序。
在基于软件容器的架构中部署应用时,通常需要在每一个亚马逊EC2实例上运行一个特定的代理来处理操作或安全事宜(例如监控,安全,测量指标,业务发现,日志等)。传统的方法是使EC2实例在用户数据脚本或init系统(例如Upstart或Systemd)中为每一个代理调用Docker运行命令。虽然这种方法很奏效,但是它有一些缺陷,因为亚马逊ECS对软件容器一无所知,因此不能追踪容器的CPU,内存,和使用的端口。当需要添加,修改,或从实例中删除代理时,使用这种方法也很难管理这些实例,因为这些改变需要在本地对每一个EC2实例进行操作,需要您使用SSH方法连接到每个机器来启动和停止这些容器。
本文章意在向您展示如何使用用户数据脚本,在ECS实例启动时如何为特定的集群启动特定的任务定义过程。
在该举例中,你构建一个样例应用,在每一个ECS实例上运行cAdvisor(容器顾问)工具。这可以让你了解运行中的容器的资源使用率和性能特征。想要了解cAdvisor的更多信息,请访问 GitHub cadvisor repository (GitHub cadvisor知识库)。
开始前,请确保系统已符合以下条件:
创建亚马逊ECS 集群
1. 在ECS控制台上,选择 Create cluster ( 创建集群 )。
2. 赋予集群一个唯一的名称,选择 Create ( 创建 )。
为 cAdvisor 测量指标代理创建任务定义过程
1. 在ECS控制台上,在左侧的菜单栏中选择 Task Definitions ( 任务定义 )。
2. 在 Task Definitions ( 任务定义 )页,选择 Create new task definition ( 创建新的任务定义 )。
3. 在 JSON 页签,将下面的 JSON文本粘贴到文本区域:
{ "family": "cadvisor", "containerDefinitions": [ { "name": "cadvisor", "image": "google/cadvisor", "cpu": 10, "memory": 300, "portMappings": [ { "containerPort": 8080, "hostPort": 8080 } ], "essential": true, "mountPoints": [ { "sourceVolume": "root", "containerPath": "/rootfs", "readOnly": true }, { "sourceVolume": "var_run", "containerPath": "/var/run", "readOnly": false }, { "sourceVolume": "sys", "containerPath": "/sys", "readOnly": true }, { "sourceVolume": "var_lib_docker", "containerPath": "/var/lib/docker", "readOnly": true } ] } ], "volumes": [ { "name": "root", "host": { "sourcePath": "/" } }, { "name": "var_run", "host": { "sourcePath": "/var/run" } }, { "name": "sys", "host": { "sourcePath": "/sys" } }, { "name": "var_lib_docker", "host": { "sourcePath": "/var/lib/docker/" } } ] }
4. 在 Builder ( 创建 )页签,检查你设置的信息并选择 Create ( 创建 )。
创建IAM ECS 角色
IAM角色有标准的ECS IAM权限,也允许实例调用StartTask操作,在该实例上调用任务定义过程。
1. 根据下面所述的策略文档创建一个新的ECS IAM角色。想要了解更多信息,请参阅 Amazon ECS Container Instance IAM Role。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ecs:CreateCluster", "ecs:RegisterContainerInstance", "ecs:DeregisterContainerInstance", "ecs:DiscoverPollEndpoint", "ecs:Submit*", "ecs:Poll", "ecs:StartTask" ], "Resource": [ "*" ] } ] }
使用定义的任务启动ECS 实例
提供的 user data code (用户数据代码)将会为EC2要参加的ECS集群配置名称,从 ECS container agent introspection API 中检索ECS容器实例ARN(高级远程节点),并调用 ECS StartTask 操作来启动前面已创建的名为cadvisor:1的任务定义过程。
1. 启动ECS实例。想要了解更多信息,请参阅 Launching an Amazon ECS Container Instance ,但是在User data部分不能使用下面的代码。记得要替换 your_cluster_name 部分的值。
注意: [p1] 也应添加到init系统(例如upstart或systemd)脚本。这样重启后的实例就会启动该项任务了。
#!/bin/bash cluster="your_cluster_name" echo ECS_CLUSTER=$cluster >> /etc/ecs/ecs.config yum install -y aws-cli jq instance_arn=$(curl -s http://localhost:51678/v1/metadata | jq -r '. | .ContainerInstanceArn' | awk -F/ '{print $NF}' ) az=$(curl -s http://instance-data/latest/meta-data/placement/availability-zone) region=${az:0:${#az} - 1} aws ecs start-task --cluster $cluster --task-definition cadvisor:1 --container-instances $instance_arn --region $region
这里不确定是以上代码还是your_cluster_name的值,请根据专业知识自己判断一下,感觉应该是your_cluster_name的值。
1. 在 AWS Management Console (AWS管理控制台)上,在你启动实例的区域选择EC2 Container Service(EC2软件容器服务)。
2. 在Clusters(集群)页签,选择前面已配置的ECS集群。
3. 在Tasks(任务)页签,你应该可以看到名称为cadvisor:1的任务定义过程处于RUNNING(运行)状态。
原文链接: https://aws.amazon.com/cn/blogs/compute/running-an-amazon-ecs-task-on-every-instance/
活动推荐:7月9日 CSDN在线培训——AWS动手实验课堂系列:Amazon EMR让大数据分析轻松开启
订阅“AWS中文技术社区”微信公众号,实时掌握AWS技术及产品消息!
AWS中文技术社区为广大开发者提供了一个Amazon Web Service技术交流平台 ,推送AWS最新资讯、技术视频、技术文档、精彩技术博文等相关精彩内容,更有AWS社区专家与您直接沟通交流!快加入AWS中文技术社区,更快更好的了解AWS云计算技术。
( 翻译/吕东梅 责编/王鑫贺 )