Используйте существующий том EBS с плагином Docker REX-Ray на ECS
Я использую 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
чтобы убедиться, что новый том не создается. Но все же, когда служба запускается, создается новый том с размером 16 ГБ (который, как я предполагаю, является размером по умолчанию) и используется вместо использования "PreCreatedEBSVolume".
Я проверяю docker volume ls
в данном случае я вижу перечисленные тома EBS. И если я запустил новый экземпляр с смонтированным томом, он будет монтироваться должным образом.
Есть ли способ заставить REX-Ray использовать существующее блочное хранилище?
4 ответа
Я нашел проблему.
Проблема в свойстве "scope". В документах было сказано следующее:
Объем тома Docker, определяющий его жизненный цикл. Тома Docker, относящиеся к задаче, автоматически подготавливаются при запуске задачи и уничтожаются при ее остановке. Тома Docker, которые обозначены как общие, сохраняются после остановки задачи.
Итак, мне просто пришлось изменить его на "общий" с "задачи", чтобы он использовал существующий том EBS.
Проблема с rexray/ebs заключается в том, что он выбирает существующий том EBS только тогда, когда он находится в той же зоне доступности, что и инстанс. Таким образом, в нашем случае нам нужно было привязать определенные экземпляры к определенной зоне доступности, чтобы правильно использовать этот драйвер.
Наша установка состояла из 6 инстансов в 3 разных зонах доступности для лучшей доступности, и каждый инстанс имел свою собственную EBS, но после перезапуска инстанса он переходил в случайную зону доступности, и в 2 из 3 не удалось найти том. Сообщение об ошибке в системных журналах было не очень информативным.
В остальном этот плагин делает то, что должен.
Ниже приведен пример определения задачи, который отвечает на вопрос, а также дает дополнительные сведения, если вы хотите знать, как создать том gp3 с указанными IOPS и шифрованием:
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"
}
}
}
}
У меня была эта проблема, но у меня была и другая проблема. Плагин занимает область при установке, но кажется, что отображаются только тома из определенной зоны доступности. Мой регион настроен на us-west-2, но объемы AZ us-west-2a не отображаются.