我是 Amazon ECS 的新手,我想知道如何设置服务以便轻松地扩大/缩小一个容器。
这是我的项目架构:
- website:包含网站的容器,仅提供 html 页面和 javascript/css/images。监听 80。
- api:使用 NodeJS 开发的提供 json 服务的 API 容器。监听 443。
- rabbitmq:带有 rabbitmq 的容器。api 容器与其链接。
- worker:等待来自rabbitmq的命令(它也链接到它)并处理它们,然后将答案发送回rabbitmq的容器。
目前,我刚刚为所有容器创建了一个任务定义,集群中只有一项服务。我在 API 上还有一个负载均衡器(因此我可以通过 DNS 名称从网站访问它)。
它工作正常,但我希望能够启动更多工作人员,而无需启动其他所有工作人员,而我现在似乎无法做到这一点(如果我错了,请纠正我)。所以我有几个问题:
- 我需要创建单独的任务定义吗?
- 我需要创建单独的服务吗?
- 如果我为每个容器创建一个任务定义(因此正面和网站,后退和api,经纪人和rabbitmq和工人和工人),即使它们不在同一个任务定义中,我是否仍然能够将容器链接在一起?
这是我当前的任务定义:
{
"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": 4096,
"image": "flipendo/worker"
},
{
"volumesFrom": [],
"portMappings": [],
"command": [],
"environment": [],
"essential": true,
"entryPoint": [],
"links": [],
"mountPoints": [],
"memory": 2048,
"name": "rabbitmq",
"cpu": 2048,
"image": "rabbitmq"
},
{
"volumesFrom": [],
"portMappings": [
{
"hostPort": 443,
"containerPort": 3000
}
],
"command": [],
"environment": [
],
"essential": true,
"entryPoint": [],
"links": [
"rabbitmq"
],
"mountPoints": [],
"memory": 2048,
"name": "api",
"cpu": 2048,
"image": "flipendo/api"
},
{
"volumesFrom": [],
"portMappings": [
{
"hostPort": 80,
"containerPort": 3000
}
],
"command": [],
"environment": [
{
"name": "API_PORT",
"value": "443"
},
{
"name": "API_ADDR",
"value": "load balancer dns server"
}
],
"essential": true,
"entryPoint": [],
"links": [
"api"
],
"mountPoints": [],
"memory": 1024,
"name": "website",
"cpu": 1024,
"image": "flipendo/website"
}
],
"volumes": [],
"family": "Flipendo"
}
非常感谢。
答案1
Do I need to create separate task definitions?
是的
Do I need to create separate services?
不一定。您可以直接运行任务,而无需“服务”。但“服务”允许与负载均衡器、应用程序自动扩展以及零停机部署关联。
“Docker 链接”容器的唯一方法是像您当前所做的那样在一个任务定义中定义它们。这样,ECS 会将所有容器放在同一个实例上。拆分成不同的任务意味着没有链接,因为容器可能会在不同的实例上启动。
因此,如果您决定拆分它们,那么每个容器都必须通过“服务”url 连接到其他容器。
我的建议是
- 创建 ALB/ELB
- 将所有容器拆分成单独的任务。
- 为所有任务创建“服务”
- 将每个服务容器与 ALB/ELB 关联
- 更新每个服务配置以使用每个服务所用的 ALB/ELB 的 DNS:PORT
- 停止使用 rabitMQ 并迁移到 SQS。
这样,您就可以单独扩展每个“服务”。
如果您决定继续使用 rabbitMQ,则必须将 ELB 用于 rabbitMQ 容器,并手动将 rabbitMQ 使用的容器端口与 ELB 关联。
ALB 将自动发现您的服务使用的容器端口。
有关 ALB 和 ECS 的更多详细信息,请参阅: