转载

在每一个实例上运行亚马逊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...