Как назначить publi c IP для контейнера, работающего в кластере AWS ECS в режиме EC2 - PullRequest
0 голосов
/ 27 марта 2020

Я пытаюсь внедрить мультисервисный кластер ECS, используя обнаружение служб между службами. Для этого я пытаюсь следовать инструкциям на https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-cli-tutorial-servicediscovery.html - НО ПОЧЕМУ ОНИ ПУБЛИЛИ SH ТАКИХ НЕПОЛНЫХ ИНСТРУКЦИЙ? Он не включает в себя полный рабочий пример, но является кратким описанием того, что делать.

Я определил две службы - используя docker-compose.yml и ecs-params.yml для определения служб.

Я легко могу запустить кластер ECS и две службы. Все выглядит правильно. Но одна из служб нуждается в общедоступном IP-адресе c. Поэтому в соответствующий файл ecs-params.yml я положил assign_public_ip: ENABLED. Но никакой публичный c IP-адрес не назначается. В консоли ECS в деталях службы указано Auto-assign public IP DISABLED, а для задачи - частный IP-адрес, а не общедоступный c IP-адрес.

К сожалению, это может оказаться невозможным. В документации я нахожу это (в https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-networking.html)

Сетевой режим awsvp c не предоставляет ENI задач с опубликованными c IP-адресами для задач, которые используют тип запуска EC2. Для доступа к inte rnet задачи, использующие тип запуска EC2, должны быть запущены в закрытом su bnet, настроенном для использования шлюза NAT. Дополнительную информацию см. В разделе «Шлюзы NAT» в руководстве пользователя Amazon VP C. Входящий сетевой доступ должен осуществляться из VP C с использованием частного IP-адреса или маршрутизироваться через балансировщик нагрузки из VP C. Задачи, запущенные в подсетях publi c, не имеют доступа к исходящей сети.

Вопрос заключается в том, как обойти это ограничение AWS Тип запуска ECS EC2.

Я не могу понять, почему тип запуска EC2 не поддерживает публичные c IP-адреса? Или - я использую другой сетевой режим, и тогда будет назначен публичный c IP-адрес? Почему документация AWS не является более ясной по этому поводу?

Кластер создается с использованием:

ecs-cli up --cluster-config ecs-service-discovery-stack --ecs-profile ecs-service-discovery-stack --keypair notes-app-key-pair --instance-type t2.micro --capability-iam --force --size 2

Существует две службы, определенные в соответствии с предложенным выше руководством. Службы backend (простое приложение Node.js в контейнере) и frontend (простой сервер NGINX, настроенный для прокси-сервера на бэкэнд) находятся в своем собственном каталоге. В каждом каталоге находится docker-compose.yml и ecs-params.yml файлов.

Интерфейс службы вызывается с помощью:

ecs-cli compose --project-name frontend service up --private-dns-namespace tutorial --vpc ${VPC_ID}  --enable-service-discovery --container-port 80 --cluster ecs-service-discovery-stack --force-deployment

Его docker-compose.yml:

version: '3'

services:
    nginx:
        image: USER-ID.dkr.ecr.REGION.amazonaws.com/nginx-ecs-service-discovery
        container_name: nginx
        ports:
            - '80:80'
        logging:
            driver: awslogs
            options: 
                awslogs-group: simple-stack-app
                awslogs-region: REGION
                awslogs-stream-prefix: nginx

И ecs-params.yml:

version: 1
task_definition:
    task_execution_role: ecsTaskExecutionRole
    ecs_network_mode: awsvpc
    task_size:
        mem_limit: 0.5GB
        cpu_limit: 256
run_params:
    network_configuration:
        awsvpc_configuration:
            subnets:
                - "subnet-00928d3fc1339b27b"
                - "subnet-0ad961884e5f93fb1"
            security_groups:
                - "sg-0c9c95c6f02597546"
        # assign_public_ip: ENABLED

Бэкэнд-сервис вызывается с помощью аналогичной команды и похожих файлов docker-compose.yml и ecs-params.yml.

1 Ответ

1 голос
/ 27 марта 2020

Вы правы, при использовании типа запуска EC2 невозможно назначить publi c IP для задач ECS.

Что касается сетевых режимов, отличных от awsvp c, они не помогут либо:

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

  2. Если сетевой режим является мостовым, задание использует встроенную виртуальную сеть Docker, которая работает внутри каждого экземпляра контейнера.

  3. Если сетевой режим хост, задача обходит встроенную виртуальную сеть Docker и напрямую сопоставляет порты контейнера с сетевым интерфейсом экземпляра EC2. В этом режиме вы не можете запускать несколько экземпляров одной и той же задачи на одном экземпляре контейнера, когда используются сопоставления портов.

Если вы хотите, чтобы к вашим задачам обращались из inte rnet, вы можете рассмотреть возможность создания службы ECS с интегрированным балансировщиком нагрузки, чтобы клиент мог перенаправить запрос к вашей задаче. Обратите внимание, что службы с задачами, использующими сетевой режим awsvp c, поддерживают только балансировщики нагрузки приложений и сетевые балансировщики нагрузки.

Другой вариант - настроить задачу ECS для получения публичных c IP-адресов с помощью запуска Fargate. введите:

Когда вы создаете службы / задачи ECS с использованием типа запуска Fargate, вы можете выбрать, следует ли ассоциировать IP-адрес publi c с ENI, который использует задача ECS. Вы можете обратиться к этому документу [1], чтобы узнать, как настроить publi c IP со службой типа Fargate в ECS. Основываясь на этой конфигурации, после запуска задачи ENI, который должна использовать задача, должен иметь publi c IP, он мог бы позволить вам получить доступ к задаче через inte rnet напрямую.

[1] Настройка сети - https://docs.aws.amazon.com/AmazonECS/latest/userguide/service-configure-network.html

...