Используйте существующий том 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 не отображаются.

Другие вопросы по тегам