使用ECS上带有Docker REX Ray插件的现有EBS卷



我正在使用Terraform创建一个ECS集群、一个任务定义和一个服务。

对于任务定义,代码如下:

resource "aws_ecs_task_definition" "postgres" {
container_definitions    = ...
family                   = "Postgres"
requires_compatibilities = ["EC2"]
network_mode             = "bridge"
volume {
name = "PreCreatedEBSVolume"
docker_volume_configuration {
scope         = "task"
autoprovision = false
driver        = "rexray/ebs"
}
}
}

我特别将autoprovision设置为false,以确保新卷是而不是创建的。但是,当服务运行时,会创建一个16GiB(我认为这是默认大小(的新卷,并使用它,而不是使用";预创建EBSVolume";。

我检查了实例中的docker volume ls,确实看到了列出的EBS卷。如果我运行一个装载了这个卷的新实例,它将按预期装载。

有没有一种方法可以让REX Ray使用现有的块存储?

我发现了这个问题。

问题是";"范围";所有物文件有以下内容:

Docker卷的作用域,它决定了它的生命周期。作用域为任务的Docker卷在任务启动时自动配置,在任务停止时销毁。作用域为共享的Docker卷在任务停止后仍将存在。

所以,我不得不将其更改为";共享的";从";任务";以使其使用现有EBS卷。

rexray/ebs的问题是,它只在与实例位于同一AZ时选择现有ebs卷。因此,在我们的案例中,我们需要将特定实例固定到特定的AZ,以便正确使用此驱动程序。

为了获得更好的可用性,我们在3个不同的AZ中设置了6个实例,每个实例都有自己的EBS,但在实例重新启动后,它进入了随机AZ,3个实例中有2个找不到卷。系统日志中的错误消息信息不多。

其他插件做它应该做的事情。

以下是任务定义示例,它回答了这个问题,如果您想知道如何创建指定IOPS和加密的gp3卷,还提供了额外的详细信息:

resource "aws_ecs_task_definition" "postgres" {
container_definitions    = ...
family                   = "Postgres"
requires_compatibilities = ["EC2"]
network_mode             = "bridge"
volume {
name = "PreCreatedEBSVolume"
docker_volume_configuration {
scope         = "shared"
autoprovision = false
driver        = "rexray/ebs"
driver_opts = {
volumetype    = "gp3"
size          = 40
iops          = 3000
encrypted     = true
encryptionkey = "arn:aws:kms:us-east-1:111111111111:key/11111111-1111-1111-1111-11111111"
}
}
}
}

相关内容

  • 没有找到相关文章

最新更新