Предоставление общего доступа к более чем 1 порту с помощью сервиса AWS ECS и Elastic LoadBalancer

У меня есть сервис, который предоставляет несколько портов, и он отлично работал с кубернетами, но теперь мы переносим его на AWS ECS. Кажется, я могу открывать порты только через Load Balancer, и я ограничен одним портом для каждой службы / задач, даже когда докер определяет несколько портов, мне нужно выбрать один порт

введите описание изображения здесь

Кнопка Add to load balancer позволяет добавить один порт. После добавления нет кнопки для добавления второго порта.

Есть ли более приятный обходной путь, чем создание второй прокси-службы для открытия второго порта?

ОБНОВЛЕНИЕ: я использую сервис на основе Fargate.


person user3130782    schedule 29.08.2019    source источник
comment
Вы хотите направлять запросы от одной целевой группы к этой службе?   -  person m0hit    schedule 03.09.2019
comment
Я хотел, чтобы служба выставила порты 80 и 443 и балансировщик нагрузки на этих портах. В противном случае мне нужна дополнительная услуга для дублирования порта 80, который перенаправляет на 443.   -  person user3130782    schedule 04.09.2019
comment
Ты можешь это сделать. На самом деле не имеет значения, какой порт у вашего контейнера, если вы используете динамические порты хоста. Кроме того, необходимо, чтобы оба порта были разными, потому что вы хотите сделать это в одной службе ECS. Пожалуйста, следуйте моему ответу, чтобы достичь своей цели.   -  person m0hit    schedule 04.09.2019


Ответы (3)


Обновление: мне удалось настроить целевую группу с помощью Terraform, но пока не нашел эту опцию на консоли AWS.

resource "aws_ecs_service" "multiple_target_example" {
  name            = "multiple_target_example1"
  cluster         = "${aws_ecs_cluster.main.id}"
  task_definition = "${aws_ecs_task_definition.with_lb_changes.arn}"
  desired_count   = 1
  iam_role        = "${aws_iam_role.ecs_service.name}"

  load_balancer {
    target_group_arn = "${aws_lb_target_group.target2.id}"
    container_name   = "ghost"
    container_port   = "3000"
  }

  load_balancer {
    target_group_arn = "${aws_lb_target_group.target2.id}"
    container_name   = "ghost"
    container_port   = "3001"
  }

  depends_on = [
    "aws_iam_role_policy.ecs_service",
  ]
}

Примечание к версии: поддержка нескольких блоков конфигурации load_balancer была добавлена ​​в Terraform AWS Provider версии 2.22.0.

ecs_service_terraform

Я не могу сказать, что это будет хороший обходной путь, но я работал над проектом, в котором мне нужно было запустить Ejabberd с помощью AWS ECS, но та же проблема возникла, когда пришло время привязать порт службы к балансировщику нагрузки.

Я работал с terraform, и из-за этого ограничения AWS ECS мы соглашаемся запускать один контейнер для каждого экземпляра, чтобы решить проблему с портом, поскольку мы должны были открыть два порта.

Если вы не хотите назначать динамический порт своему контейнеру и хотите запускать один контейнер на экземпляр, решение определенно сработает.

  1. Создайте целевую группу и укажите второй порт контейнера.

  2. Перейдите в AutoScalingGroups вашего кластера ECS.

  3. Отредактируйте и добавьте вновь созданную целевую группу в группу Autoscaling кластера ECS.

Таким образом, если вы масштабируете до двух контейнеров, это означает, что будет два экземпляра, поэтому новый запускаемый экземпляр будет регистрироваться во второй целевой группе, а группа автомасштабирования позаботится об этом. В моем случае этот подход работает нормально, но нужно учитывать несколько моментов.

Не привязывайте основной порт к цели, лучше привязать основной порт к службе ALB. Основным преимуществом этого подхода будет то, что если ваш контейнер не ответил на проверку работоспособности AWS, контейнер будет перезапущен автоматически. Поскольку проверка работоспособности целевой группы не будет воссоздавать ваш контейнер.

Этот подход не будет работать, если в контейнере Docker есть динамический порт.

AWS следует обновить свой агент ECS для обработки такого сценария.

person Adiii    schedule 29.08.2019
comment
Вы пользовались услугами EC2 или Fargate? Пользуюсь Фаргейтом. instance Экземпляр EC2? - person user3130782; 29.08.2019
comment
Да, мы использовали службу типа EC2, у Fargate больше ограничений, поэтому мы перешли на службу EC2 типа. - person Adiii; 29.08.2019
comment
@Adiii Что насчет CodeDeploy, как мы можем интегрировать с ним сине-зеленое развертывание. Поскольку codeDeploy по-прежнему не поддерживает несколько целевых групп - person iamwebkalakaar; 22.07.2020
comment
при сине-зеленом развертывании вы можете вместо этого попробовать динамический порт. - person Adiii; 17.12.2020

Никакого обходного пути не требуется, теперь AWS ECS поддерживает несколько целевых групп в рамках одного сервиса ECS. Это будет полезно в тех случаях, когда вы хотите открыть несколько портов контейнеров.

В настоящее время, если вы хотите создать сервис с указанием нескольких целевых групп, вы должны создать сервис, используя Amazon ECS API, SDK, AWS CLI или шаблон AWS CloudFormation. После создания сервиса вы можете просмотреть сервис и зарегистрированные в нем целевые группы с помощью Консоли управления AWS.

Например, контейнер Jenkins может предоставлять порт 8080 для веб-интерфейса Jenkins и порт 50000 для API.

Ссылка:

https://docs.aws.amazon.com/AmazonECS/latest/developerguide/register-multiple-targetgroups.html

https://aws.amazon.com/about-aws/whats-new/2019/07/amazon-ecs-services-now-support-multiple-load-balancer-target-groups/

person m0hit    schedule 03.09.2019
comment
Это не работает для сине-зеленых развертываний ECS, только для скользящих обновлений. См. здесь в разделе "Рекомендации по использованию нескольких целевых групп" - person forrestmid; 26.05.2021

Я столкнулся с этой проблемой при создании более одного контейнера для каждого экземпляра, и второй контейнер не подходил, потому что он использовал тот же порт, что и в определении задачи.

Мы создали балансировщик нагрузки приложений поверх этих контейнеров и удалили жестко запрограммированные порты. Что делает балансировщик нагрузки приложений, когда он не получает предопределенных портов, так это: Используйте функциональность динамического сопоставления портов. Контейнеры будут появляться на случайных портах и ​​находиться в одной целевой группе, и балансировщик нагрузки автоматически отправит запрос на эти порты.

Более подробную информацию можно найти здесь

person Pacifist    schedule 29.08.2019