我是使用 Amazon ECS 的新手,我想知道如何设置服务以便轻松扩展/缩减一个容器。
这是我的项目架构:
目前,我只为我的所有容器创建了一个任务定义,而在我的集群中,我只有一项服务。我在 API 上也有一个负载平衡器(所以我可以通过 DNS 名称从网站访问它)。
它工作正常,但我希望能够启动更多的工作人员,而不启动其他一切,而且我现在似乎无法做到这一点(如果我错了,请纠正我)。所以我有几个问题:
这是我当前的任务定义:
{
"taskDefinitionArn": "arn:aws:ecs:ap-southeast-2:347930943102:task-definition/Flipendo:4",
"revision": 4,
"containerDefinitions": [
{
"volumesFrom": [],
"portMappings": [],
"command": [],
"environment": [
],
"essential": true,
"entryPoint": [],
"links": [
"rabbitmq"
],
"mountPoints": [],
"memory": 2048,
"name": "worker",
"cpu": …Run Code Online (Sandbox Code Playgroud) 当弹性负载均衡器 (ELB) 与自动扩展组相关联时,可以指定一个宽限期,在此宽限期内,即使新 EC2 实例被 ELB 标记为不正常,也不会终止。是否可以指定一个类似的宽限期,在此期间新的 ECS 任务不会被其关联的 ECS 服务杀死并重新启动,即使正在运行任务的 ECS 实例已被 ELB 标记为不健康?
更新:
在我们当前的用例中,作为 ECS 任务运行的 docker 容器包含一个 JBoss 实例,该实例在启动时加载许多缓存。加载这些缓存可能需要几分钟时间。但是,ECS 服务会在容器启动后立即向 ELB 注册容器实例。这意味着可以在新容器准备好接受之前将流量路由到新容器。我们可以增加 ELB 上的健康检查间隔和“健康/不健康阈值”,以防止 ELB 将流量路由到实例和 ECS 服务重新启动容器,直到缓存加载完毕。然而,增加健康检查间隔和阈值是不可取的,因为如果在加载缓存后实例被标记为不健康,
因此,是否可以应用一个宽限期,在此期间ELB不会将流量路由到新容器并且ECS服务不会重新启动容器(即使它未通过健康检查)?或者失败了,是否有关于我们用例的解决方案的任何建议?
我有一个带有 ELB 的 ECS 集群。昨晚我看到一个任务卡在重启循环中。从服务事件日志中,它说:
“服务 xxxxx 无法放置任务,因为没有容器实例满足其所有要求。最匹配的容器实例 xxxxxxxxxxxxxx 已经在使用您的任务所需的端口。”
但是,我已经检查过所有此类任务都已停止,并且当时不应使用该端口。更新服务无助于创建新的任务定义,然后更新有帮助。终止实例并允许 ELB 重新启动它会有所帮助。
知道为什么该服务无法保护任务的端口吗?
我正在尝试使用此处提供的 CloudFormation ECS 服务模板 AWS作为指南来建立一个新的 ECS 集群。我的 ECS 实例在 AutoScaling 组内启动,但未通过运行状况检查并始终终止。
输出并没有真正告诉我什么检查失败或原因。
我使用的 CloudFormation 代码几乎是 AWS 文档中提供的股票代码。我添加了一个具有更广泛权限的安全组(以便我可以在迭代时通过 SSH 进入)并将 AMI 更新到 us-east-1 中 ECS 优化的 Amazon Linux 的最新版本。
当前模板:
{
"AWSTemplateFormatVersion" : "2010-09-09",
"Description": "Deploys PoC ECS infrastructure.",
"Parameters" : {
"KeyName": {
"Description": "Name of an existing EC2 KeyPair to enable SSH access to the Elastic Beanstalk and Bastion hosts",
"Type": "String",
"MinLength": "1",
"MaxLength": "255",
"AllowedPattern": "[\\x20-\\x7E]*",
"ConstraintDescription": "can contain only ASCII characters.",
"Default": "smx-test-key"
}, …Run Code Online (Sandbox Code Playgroud) 启动配置上的用户数据:
#!/bin/bash
echo ECS_CLUSTER=prodcluster >> /etc/ecs/ecs.config
sudo yum install -y nfs-utils
sudo mkdir /home/ec2-user/web_file_uploads
sudo chmod 777 /home/ec2-user/web_file_uploads
sudo mount -t nfs4 -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2 fs-abcdef.efs.ap-southeast-2.amazonaws.com:/ /home/ec2-user/web_file_uploads
Run Code Online (Sandbox Code Playgroud)
任务定义:
{
"networkMode": "bridge",
"containerDefinitions": [
{
"portMappings": [
...
],
"essential": true,
"mountPoints": [
{
"containerPath": "/src/temp_uploads/",
"sourceVolume": "web_file_uploads",
"readOnly": null
}
],
"name": "webapp",
"readonlyRootFilesystem": null,
"image": "911911911.dkr.ecr.ap-southeast-2.amazonaws.com/webapp:release6",
"memoryReservation": 150
}
],
"volumes": [
{
"host": {
"sourcePath": "/home/ec2-user/web_file_uploads"
},
"name": "web_file_uploads"
}
],
"family": "webapp-task"
}
Run Code Online (Sandbox Code Playgroud)
注意:我已将所需的端口添加到安全组。src/temp_uploads 文件夹必须包含在使用此任务定义启动的所有其他容器实例中。
问题:如果我使用 …
我正在尝试设置具有自动缩放功能的 AWS 服务。我已经创建了一个带有应用程序负载均衡器的集群,并使用应该在端口 8080 上打开以供使用的 docker 镜像创建了一个任务。我根据该任务创建了一个服务,我已将最小和所需的实例数设置为 1,最大为 10,并创建了扩展和缩减规则。但是,没有创建新实例,我定期在事件列表中获得的所有内容是:
service microrecieverservice 无法放置任务,因为没有容器实例满足其所有要求。最接近的匹配容器实例 97d97ce9-967d-49ad-83ad-f4f904aae1f6 已经在使用您的任务所需的端口。有关更多信息,请参阅故障排除部分。
我在故障排除部分找不到任何相关内容。我已经能够手动向集群添加另一个实例,但给定的事件没有变化。我可以通过 ssh 进入这个实例,有两个 docker 镜像:一个是 amazon-ecs-agent:latest,另一个是我的任务定义。此时,我尝试向服务器发送 REST 请求以查看它是否会通过但连接被拒绝。大约在同一时间,docker 镜像重新启动。
容器没有运行任何其他会使用端口 8080 的东西,当我使用端口 8080 执行netstat -lntp该过程时,就是我的 docker 镜像。
我们在AWS的ECS平台上运行我们的服务,并将日志发送到AWS CloudWatch。
我们有两种类型的日志,任何容器都可以生成其中一种类型:
审核日志是法规强制要求的,除了更严格的访问控制要求外,它们的保留时间比应用程序日志更长,因此将两者放在同一个日志流中并不是真正的选择。因此,我们使用两个日志流,其中一个位于具有严格访问策略的 CloudWatch 日志组中。
目前,我们正在将日志写入单独的磁盘文件,日志代理将日志条目从磁盘文件发送到 CloudWatch。然而,我们希望切换到“Docker 方式”的日志记录,即将所有日志写入 STDOUT 或 STDERR,并让日志驱动程序处理其余的事情。这听起来特别有吸引力,因为日志磁盘(几乎)是我们正在使用的唯一磁盘安装,摆脱它们确实非常好。(除了日志磁盘之外,我们的容器是严格只读的。)
问题是,我们无法找到一种明智的方法来保持日志流分离。显而易见的事情是以某种方式标记日志消息并稍后将它们分开,但仍然存在一个问题:
希望我们遗漏了一些明显的东西,在这种情况下,我们将非常感谢您的帮助。
如果没有,是否有任何解决方法(甚至是适当的解决方案)来让这种事情发挥作用?
背景: 我使用过 EC2 和 RDS。最近,我收到一位客户的询问,他想使用 Amazon Web Services 开发移动和 Web 应用程序,并且需要关于他应该使用哪种服务的建议?
此外,我已经通过 YouTube 和 Google 上的几个教程来了解这些服务,但我仍然无法弄清楚他应该使用哪种服务。
问题: 我对上述服务没有任何适当的知识和经验。因此,我希望得到与他们合作过的人的建议。
请说明使用特定服务的优缺点,以便我更容易提供建议。
amazon-web-services elastic-beanstalk amazon-ecs amazon-ecr amazon-lambda
如果我向我的 ECS 服务发布了一个存在错误的新 Docker 映像,则该服务将尝试启动新任务,但如果新任务无法启动,则将保留旧版本。
在这种情况下,它有时(并非总是)会向总线发出一个事件,例如:
服务 xxx 无法持续成功启动任务。有关详细信息,请参阅故障排除部分。
有时它只会发出大量事件,例如:
服务 xxx 注销了目标组 yyy 中的 1 个目标
我希望在这种情况下触发 CloudWatch 警报。我怎样才能做到这一点?
我看不到任何跟踪可用于触发此警报的相关事件的 CloudWatch 指标。https://docs.aws.amazon.com/AmazonECS/latest/developerguide/cloudwatch-metrics.html
如果任务无法启动,那么我什至无法获得有关 LB 目标组的任何 UnHealthyHostCount 指标。
我想我必须创建一个 EventBridge 规则来监视上述指定的事件,但我看不到让该规则触发警报的明显方法。我设置了一条规则,将“警告”和“错误”事件转发到 SNS/电子邮件,但我并不总是收到这些事件。所以我经常遇到重启循环而没有警报触发。:-(
目前,我正在尝试弄清楚如何配置 ECS 服务之间的通信。我计划进行以下设置:
我心中有以下选择:
alb.amazonaws.com/backend/将请求转发到backend-target-group将请求提供给后端 ECS 任务。它们似乎都不是正确的做法。由于财务限制,我不想为每项服务使用单独的 ALB。我想到的是 ECS 服务的某种内部 DNS 名称。我已经检查了以下链接,但不知道如何将其应用到我的案例中。
相关问题: AWS ECS 容器通信
因此,理想情况下我想要实现的是:为后端服务提供内部 DNS 名称,并将请求从前端服务发送到后端。
amazon-ecs ×10
docker ×3
amazon-alb ×1
amazon-ec2 ×1
amazon-ecr ×1
amazon-efs ×1
amazon-elb ×1
autoscaling ×1
aws-fargate ×1
monitoring ×1