Эластичная балансировка нагрузки как внутри, так и через Интернет
Мы пытаемся использовать балансировку эластичной нагрузки в AWS с автомасштабированием, чтобы мы могли масштабироваться и выходить по мере необходимости.
Наше приложение состоит из нескольких небольших приложений, все они находятся в одной подсети и той же VPC.
Мы хотим поставить наш ELB между одним из наших приложений и остальными.
Проблема заключается в том, что мы хотим, чтобы балансировщик нагрузки работал как внутри между различными приложениями с использованием API, так и с помощью Интернета, потому что наше приложение все еще имеет некоторое использование, которое должно выполняться извне, а не через API.
Я читал этот question, но я не мог точно понять, как это сделать, там не указано никаких шагов или, может быть, я сделал хорошо это понимают.
У нас есть ELB, который является внутренним и внешним?
Для записи я могу получить доступ к этой сети только через VPN.
Ответы
Ответ 1
Невозможно, чтобы балансировщик эластичной нагрузки имел как общедоступный IP-адрес, так и частный IP-адрес. Это тот или другой, но не оба.
Если вы хотите, чтобы ваш ELB имел частный IP-адрес, он не может слушать запросы из Интернета.
Если ваш ELB открыт для общественности, вы все равно можете позвонить ему из своих внутренних экземпляров EC2 с помощью общедоступной конечной точки. Однако есть некоторые оговорки, которые касаются этого:
- Трафик выйдет из VPC и снова войдет в него. Это не будет прямым соединением между экземпляром и ELB, которое предоставит вам частный IP-адрес.
- Вы также не можете использовать группы безопасности в своих правилах группы безопасности.
Существует 3 альтернативных сценария:
- Дублируйте экземпляры ELB и EC2, один из которых посвящен частному трафику, один предназначен для общего трафика.
- У вас есть 2 ELB (один открытый, один закрытый), которые используют одни и те же исходные экземпляры EC2.
- Не используйте ELB для частного или общедоступного трафика и вместо этого используйте для этого один экземпляр EC2 Elastic IP-адрес (если он публичен) или частный IP-адрес (если частный).
Ответ 2
Я не согласен с ответом @MattHouser. Фактически, в VPC ваш ELB имеет все свои внутренние интерфейсы, перечисленные в сетевых интерфейсах с Public IP и Primary private IP.
Я протестировал частный IP-адрес своего публичного ELB, и он работает точно так же, как и внешний.
Проблема заключается в следующем: эти IP-адреса не перечислены нигде в обновленном виде, например, на частном DNS-сервере ELB. Поэтому вы должны сделать это самостоятельно.
Я сделал немного POC script на этом, с внутренней зоной, размещенной в Route53: https://gist.github.com/darylounet/3c6253c60b7dc52da927b80a0ae8d428
Ответ 3
Стандартное решение AWS должно иметь для этого дополнительный внутренний ELB.
Похоже, у @DaryL есть интересное обходное решение, но он может выйти из строя в течение 5 минут, если DNS не будет обновлен. Также нет возможности иметь отдельную группу безопасности для внутренних IP-адресов, поскольку они совместно используют ENI и безопасность внешнего IP-адреса ELB.
Ответ 4
Я сделал лямбда-функцию, которая проверяет, какие частные IP-адреса установлены для loadbalancer, и будет обновлять запись Route53 при ее изменении: https://github.com/Bramzor/lambda-sync-private-elb-ips
Используя эту функцию, вы можете легко использовать ELB для частного трафика. Я лично использую его для соединения нескольких регионов друг с другом через межрегиональный пиринг VPC без необходимости дополнительного ELB.
Ответ 5
Я столкнулся с той же проблемой, и я могу подтвердить, что лучшее решение на данный момент - это иметь два разных ALB, один с выходом в Интернет, а другой с внутренним. Вы можете присоединить оба ALB к одной группе автоматического масштабирования, чтобы иметь доступ к одному кластеру.
Убедитесь, что параметры сети (подсети, группы безопасности) обоих ALB одинаковы, чтобы оба получили доступ к одним и тем же экземплярам кластера. Автоматическое масштабирование и настройка запуска работают без проблем, когда оба ALB подключены к одной группе AutoSacling. Это также работает с ALB, созданными из сред ElasticBeanstalk.