我在具有 5 个 EC2 实例的单个 ECS 集群中运行了大约 15 个微服务。在设置服务时,我并没有太注意任务放置策略,现在我想改变它,但到目前为止我还没有找到这样做的方法。似乎您只能在创建服务时定义策略,而不能在更新它时定义策略(亚马逊文档没有提到更新,但也没有说这是不可能的)。
有没有办法更改任务放置或我必须重新创建每个服务?
我正在尝试在 ECS 中构建我自己的服务发现版本,因为我希望向上和向下扩展的服务不是 HTTP 服务器,因此无法由 ELB 管理。此外,ECS 尚不支持 docker 的用户定义网络功能,这将是进行服务发现的另一种方式。正如该问题讨论中提到的:
目前服务发现是一个巨大的痛苦,需要另一个服务(它本身通常是基于集群的,自我发现然后侦听其他服务)。这是一个凌乱的解决方案,更不用说实施和维护更令人讨厌的 Lambda“解决方案”了。
因此,我将采用令人讨厌的 Lambda“解决方案”路线来代替其他选择。我需要构建这个 hack 服务发现的主要内容是在我的 EC2 主机上运行的每个 docker 容器的 IP 地址。
通过 SSH 连接到充当我的 ECS 容器实例之一的 EC2 服务器,我可以运行docker ps以获取每个正在运行的 docker 容器的容器 ID。对于任何给定的 containerId,我可以运行docker inspect ${containerId}它返回 JSON,包括有关该容器的许多详细信息,特别是NetworkSettings.IPAddress与该容器的绑定(我的发现实现所需的主要内容)。
我正在尝试使用 Lambda 中的 AWS 开发工具包来获取此值。到目前为止,这是我的 Lambda 函数(您也应该能够运行它——这里没有特定于我的设置):
exports.handler = (event, context, callback) => {
var AWS = require('aws-sdk'),
ecs = new AWS.ECS({"apiVersion": '2014-11-13'});
ecs.listClusters({}, (err, data) => {
data.clusterArns.map((clusterArn) => {
ecs.listTasks({
cluster: clusterArn
}, …Run Code Online (Sandbox Code Playgroud) 这是nginx配置
server {
listen $PORT;
location ~ ^/documents/(.*)$ {
proxy_pass http://127.0.0.1:5000/$1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location = /favicon.ico {
return 204;
access_log off;
log_not_found off;
}
}
Run Code Online (Sandbox Code Playgroud)
url 有两种用例/documents/:
POST 到/documents/进行一些处理或
GET/documents/ping被 AWS ELB 用作健康检查
在 cloudwatch 日志中,我得到了一堆 ping 条目
要求 nginx 不记录 ping 的最简单方法是什么?
我正在尝试在 Application Loader Balancer (ELBv2) 后面配置 ECS Fargate,我想终止 ALB 上的 TLS/SSL 连接,并将 HTTP 流量(端口 80)发送到在端口 80 上侦听的 Fargate 图像.
这是我正在尝试做的图表:
任何帮助表示赞赏!
我是 docker 和 ECS 的新手,所以我可能不会使用正确的术语。如果我需要澄清,请告诉我。
我的场景:我有许多独立的容器。每个容器代表一个网站。每个容器都应该一直运行,但可能会出现长时间不活动的情况(例如,CPU 使用率为零)。为了便于说明,我们假设我有 10 个容器,每个容器需要最多 200MB RAM 和最多 1vCPU。我们进一步假设我总共只需要 2vCPU 来处理所有 10 个容器的组合负载(因为它们不会同时看到高负载)。
Fargate 选项 1:我为每个容器创建一个不同的任务:(2GB,1vCPU)x 10(2GB 是 1vCPU 的最小 RAM)。
Fargate 选项 2:我使用所有容器创建一个任务:(2GB,2vCPU)。
EC2 选项:我为每个容器创建一个任务,所有任务都映射到单个 EC2 实例。
如果我理解正确的话,Fargate 选项 2 比 Fargate 选项 1 便宜得多,因为我知道我最多只需要 2vCPU。但选项 2 的灵活性要差得多,因为它是停止/启动/缩放的任务,并且我希望将我的容器视为彼此独立(例如独立地停止/启动/缩放)。
此外,如果我理解正确的话,EC2 选项是我既可以获得每个容器一个任务的灵活性,又可以为我实际需要的资源付费的唯一方法。
所以:看来对于资源利用率较低的独立容器来说,Fargate此时不太适合。
我的理解正确吗?
我已经在 ECS 上设置了集群、容器、任务和服务。
在我创建该服务后,它似乎正在运行“3 个所需的任务”,但是没有任何任务被创建为挂起或正在运行。实际上,它似乎什么也没做。
我的任务定义(不包括空值和空数组)是
{
"containerDefinitions": [
{
"portMappings": [
{
"hostPort": 5000,
"protocol": "tcp",
"containerPort": 25565
},
{
"hostPort": 5000,
"protocol": "udp",
"containerPort": 25565
}
],
"cpu": 0,
"memoryReservation": 1024,
"image": "itzg/bungeecord",
"essential": true,
"name": "BungeeCord"
}
],
"compatibilities": [
"EC2"
],
"taskDefinitionArn": "arn:aws:ecs:us-west-1:949960343466:task-definition/BungeeCordTask:3",
"family": "BungeeCordTask",
"requiresAttributes": [
{
"name": "com.amazonaws.ecs.capability.docker-remote-api.1.21"
}
],
"requiresCompatibilities": [
"EC2"
],
"revision": 3,
"status": "ACTIVE",
}
Run Code Online (Sandbox Code Playgroud)
我的集群有 3 个 ECS 实例,它们都在运行并且上面没有任何东西: 我的集群
我的服务在这里: 我的服务
我没有任何自动缩放、负载平衡或任何设置。但我确实有一些真正的默认服务发现。
任何人都知道为什么没有任务开始?
编辑:
我正在将现有应用程序从在裸 EC2 实例上运行迁移到使用 ECS 的容器化设置。我有两种情况需要在容器之间共享数据。一个是存储一些静态和媒体文件的 EFS 共享,另一个是日志目录,以便我可以使用 sidecar 容器中的 Cloudwatch Logs 代理将日志推送到 Cloudwatch。
网络服务器需要能够将数据写入这两个位置,但到目前为止我还无法实现。日志目录是本地卷,归root:root. 我按照这些说明设置的 EFS 共享归1000:xfs(无用户名)所有。在这两种情况下,我的网络用户 ( www-data) 都不能写入这些位置。
如何告诉 ECS 在具有给定所有者和/或组的容器内安装卷?
在 AWS 控制台 > CloudWatch > Container Insights > 性能监控 > ECS 任务中,Storage Read和的图表单位如下Storage Write所示:Bytes/Second
存储读取
字节/秒
然而,在这两种情况下,除了容器重新启动时的垂直下降之外,图表似乎总是单调增加,并且当我不希望看到持续恒定的 IO 时,它们具有很长的水平部分。
这些图表实际上显示的是累积值Bytes而不是所述值吗Bytes/Second?
在 AWS 文档的表格中查找ECS Container Insights 指标,我看到StorageReadBytes两者都这么StorageWriteBytes说Unit: Bytes,假设这指的是控制台 UI 图表中显示的相同指标,也许这证实了我的怀疑,即这是 AWS 控制台 UI 中的错误?
我尝试使用 AWS 中的“反馈”按钮来报告此问题,但在此发布,以防任何人都可以确认,或者它是否可以帮助其他可能因看似高的持续 I/O 率而担心的人。
我使用ECS和ALB将我的容器公开到互联网。当我更新容器映像时(我使用CloudFormation更新任务和服务),目标组将与旧容器的连接设置为Draining. 问题是这一步总是需要整整 5 分钟,这与我的属性相同Deregistration Delay。
根据文档,这不应该发生:
取消注册延迟 Elastic Load Balancing 停止向正在取消注册的目标发送请求。默认情况下,Elastic Load Balancing 在完成取消注册过程之前等待 300 秒 [...]。
如果取消注册目标没有正在进行的请求且没有活动连接,Elastic Load Balancing 会立即完成取消注册过程,而无需等待取消注册延迟过去。
明显的解释是我与容器有持久连接。但是,我在测试服务上遇到了这个问题,只有我自己知道。
我有一个由 Laravel 提供支持的 Web 应用程序,该应用程序设置在 AWS ECS 上。我需要将 artisan 命令作为 cronjob 运行。
我正在查看 ECS 集群配置中的“计划任务”。我可以按照 AWS 上的“计划任务 (Cron) ”文档启动新任务。我在目标中使用 Laravel 的任务定义,我将其用于 Web 服务,它有两个任务。
任何帮助将不胜感激。谢谢。
amazon-ecs ×10
docker ×3
amazon-elb ×2
amazon-alb ×1
amazon-ec2 ×1
aws-fargate ×1
containers ×1
cron ×1
nginx ×1
php ×1