Я ищу способ добавить доменное имя к сервису ECS (EC2, а не Fargate).
Чтобы быть точным, я ищу решение, которое DNS разрешает доменное имя A или AAAA.(возможно CNAME, если он указывает на A или AAAA). Мне не важно, в каком сетевом режиме это работает. Контейнер можно разместить в любом из host
, bridge
,awsvpc
если решение работает!
awsvpc
нежизнеспособен за пределами Фаргейта
Решения, требующие AWS VPC, по-видимому, несовместимы с ECS/EC2 и подходят только для Fargate. Причиназдесь:
Каждая задача Amazon ECS, использующая сетевой режим awsvpc, получает собственный эластичный сетевой интерфейс (ENI), который подключается к экземпляру Amazon EC2, на котором она размещена.Существует квота по умолчанию на количество сетевых интерфейсов.который можно подключить к экземпляру Amazon EC2 Linux.Основной сетевой интерфейс учитывается в этой квоте..
Таким образом, a t3.medium
может выполнять только 2 задачи, а a t3.2xlarge
может выполнять только 3 (ограниченияздесь)
Обнаружение услуг нецелесообразно
Service Discovery добавит только записи DNS типа SRV для сетевых контейнеров типа host
и bridge
типа. Большая часть программного обеспечения, которое мы используем, не понимает записи SRV. Нам нужны записи A и AAAA.
Service Discovery создаст записи A и AAAA для awsvpc
контейнеров сетевого типа... и они снова awsvpc
станут нежизнеспособными.
AWS App Mesh нежизнеспособен
Мы попытались настроить сетку приложений, и нам почти сразу сказали, что наши задачи нужноawsvpc
¯\(ツ)/¯
Балансировщики нагрузки кажутся нежизнеспособными
Это может работать для некоторых сервисов. Но затем мы проваливаемся в большие ямы, где сервис не HTTP или сервис требует, чтобы клиенты были аутентифицированы с помощью клиентских сертификатов SSL.
Создание большого количества балансировщиков нагрузки IP для не-HTTP/клиентских SSL-сервисов обходится слишком дорого.
<брань>
AFAIK, Kubernetes сделал бы это тривиальным. Даже в Docker Swarm это есть. Я действительно в шоке, сколько часов мы потратили на поиски этой тривиальной вещи.<\рант>
Вопрос
Как добавить доменное имя в контейнер ECS/EC2 без балансировщика нагрузки?
решение1
Для ясности: вам не нужно иметь уникальный эластичный сетевой интерфейс, подключенный к контейнеру ECS (из-за ограничений на экземпляр), поскольку его будет легко терраформировать или сделать что-то еще.
Создайте собственное решение AppMesh с помощью systemd:
Используйте скрипт bash, запущенный через запуск systemd, чтобы получить доступ к IMDS, найдите публичный ip-адрес для службы ECS, а затем используйте AWS CLI для обновления записи dns. Это очевиднооченьпозднее связывание, поэтому убедитесь, что вы установили TTL очень низким.
- https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instancedata-data-retrieval.html
- https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-metadata-endpoint-v4.html
Следующий ответ: «Не делай этого»
решение2
Я не совсем понимаю этот вопрос. Service Discovery поддерживает доменное имя (пространство имен). Насколько я могу судить, это на самом деле обязательно. Другими словами, если вы хотите использовать SD для службы ECS, myservice
вы должны ссылаться на нее как myservice.<domain>
где <domain>
— произвольное пространство имен, которое вы должны определить (например, .local или .my.domain).Вот примерстека, использующего SD.
Обратите внимание, что все этовнутреннийк кластеру и как работает внутреннее обнаружение служб (например, как служба ECS обнаруживает другую службу ECS).
[Изменить] ЕСЛИ вы хотите предоставить доступ к своим службам ECS, но НЕ хотите использовать балансировщик нагрузки, другим вариантом будет использование API GW в качествеописанный в этом сообщении в блоге. В общем случае вы не хотите регистрировать случайные публичные IP-адреса задач Fargate в R53, потому что они эфемерны, и вам нужно будет создать сложный механизм, чтобы поддерживать их соответствие, когда задачи Fargate приходят и уходят. Вы также рассматривалиПриложение Runner?
решение3
Как насчетhttps://aws.amazon.com/cloud-map/?
Как работает docker-compose с этим: