转载

在每一个实例上运行亚马逊ECS任务

ECS(亚马逊弹性计算云容器服务)是一项高度可扩展的,高性能的软件容器管理服务,它支持Docker 软件容器,并允许您轻松地在受 Amazon EC2  实例管理的集群中运行应用程序。

在基于软件容器的架构中部署应用时,通常需要在每一个亚马逊EC2实例上运行一个特定的代理来处理操作或安全事宜(例如监控,安全,测量指标,业务发现,日志等)。传统的方法是使EC2实例在用户数据脚本或init系统(例如Upstart或Systemd)中为每一个代理调用Docker运行命令。虽然这种方法很奏效,但是它有一些缺陷,因为亚马逊ECS对软件容器一无所知,因此不能追踪容器的CPU,内存,和使用的端口。当需要添加,修改,或从实例中删除代理时,使用这种方法也很难管理这些实例,因为这些改变需要在本地对每一个EC2实例进行操作,需要您使用SSH方法连接到每个机器来启动和停止这些容器。

本文章意在向您展示如何使用用户数据脚本,在ECS实例启动时如何为特定的集群启动特定的任务定义过程。

设置样例

在该举例中,你构建一个样例应用,在每一个ECS实例上运行cAdvisor(容器顾问)工具。这可以让你了解运行中的容器的资源使用率和性能特征。想要了解cAdvisor的更多信息,请访问 GitHub cadvisor repository (GitHub cadvisor知识库)。

开始前,请确保系统已符合以下条件:

  •    你拥有一个AWS账户。想要了解更多信息, 请参阅文档
  •   你的账户已经定义了一个VPC(虚拟私有云),账户启用了DNS支持,且至少有一个公共子 网。想要了解更多信息, 请参阅文档
  • 已生成了一个EC2密钥对,你可以使用私钥文件(后缀为pem)。想要了解更多信息, 请参阅文档

创建亚马逊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云计算技术。

( 翻译/吕东梅 责编/王鑫贺 )

正文到此结束
Loading...