Network Performance Monitoring (NPM) and Diagnostics | Application Performance Monitoring (APM) | Application-Aware Network Performance Monitoring (AA NPM) | Network Fault Management | Information Security | Network Security

Как использовать балансировщики нагрузки ALB и NLB с сервисом управления Amazon EC2 Container Service

Как использовать балансировщики нагрузки ALB и NLB с сервисом управления Amazon EC2 Container Service

Application Load Balancer (ALB) и Network Load Balancer (NLB) — это балансировщики нагрузки второго поколения от коммерческой публичной облачной платформы Amazon Web Services (AWS). В предыдущей статье мы рассмотрели, на что способны эти новые продукты и как они работают. В этой статье мы рассмотрим, как полноценно воспользоваться всеми преимуществами их новой функциональности, такой, к примеру, как маршрутизация трафика на ваши контейнерные приложения Docker, работающие в облаке.

Еще одной из самых интересных и полезных новых функций, доступных как для Application Load Balancer, так и Network Load Balancer, является возможность отправлять сетевой трафик на динамические порты. Для балансировщика нагрузки прошлого поколения традиционная схема работы с портами выглядела так: на каждом экземпляре используемой группы бэкенд-серверов, расположенной за балансировщиком нагрузки, запускалась идентичная копия приложения, работающего на хорошо всем известном статическом номере порта. При этом задача балансировщика нагрузки прошлого поколения ограничивалась только равномерным распределением любых полученных запросов по одному и тому же номеру порта между группой бэкенд-серверов (смотрите рисунок 1).

Традиционная схема работы с портами для балансировщиков нагрузки

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

Однако, с наступлением эры контейнерных приложений Docker и началом активного использования стратегий упаковки в контейнеры (bin packing) для запуска нескольких приложений на одном инстансе Amazon EC2, изменился и подход к организации многих архитектур программного обеспечения. В этом случае один инстанс Amazon EC2 может работать с несколькими контейнерами, каждому из которых был случайным образом назначен порт (смотрите рисунок 2). Эти номера портов не являются статичными. Контейнерам приложения может быть назначен другой номер порта после остановки их работы и перезапуска.

 один инстанс Amazon EC2 может работать с несколькими контейнерами

Рисунок 2. При новом подходе к организации архитектуры приложений один инстанс Amazon EC2 может работать с несколькими контейнерами, каждому из которых был случайным образом назначен номер динамичного порта.

Как Application Load Balancer, так и Network Load Balancer поддерживают этот новый шаблон динамических портов, используя функциональность «Целевая группа» («Target Group»). Этот ресурс облачной платформы AWS позволяет отслеживать список портов, которые принимают сетевой трафик в каждом инстансе, и, следоательно, предоставляет балансировщику нагрузки возможность равномерно распределять трафик между портами.

Таким образом, в вышеприведенном примере, проиллюстрированном на рисунке 11, Network Load Balancer 40 % сетевого трафика отправит первому инстансу, в котором контейнеры размещены на двух портах, а остальные 60 % сетевого трафика будут отправлены другому инстансу, у которого есть три открытых порта.

В свою очередь, Application Load Balancer, который осуществляет маршрутизацию на основе HTTP на прикладном уровне сетевой модели OSI, при подобной конфигурации будет в одной целевой группе по 50 % всего сетевого трафика, который соответствует шаблону пути «/api/users*», распределять между двумя динамическими портами, а для другой целевой группы с шаблоном пути «/api/auth*» по трети сетевого трафика будет распределено между тремя другими портами (смотрите рисунок 3).

Пример распределения сетевого трафика балансировщиком нагрузки Application Load Balancer для веб-приложения

Рисунок 3. Пример распределения сетевого трафика балансировщиком нагрузки Application Load Balancer для веб-приложения, использующего несколько динамических портов на разных инстансах.

Интеграция Application Load Balancer и Network Load Balancer с Amazon EC2 Container Service

Благодаря поддержке динамических портов ALB и NLB идеально подходят для маршрутизации сетевого трафика в сервисах управления контейнерами. Существует бесшовная интеграция между балансировщиками нагрузки второго поколения и сервисом управления контейнерами Amazon EC2 Container Service (ECS).

ECS — это управляемая система оркестровки для платформы облачных вычислений Amazon Web Services, используемая для развертывания и эксплуатации контейнерных приложений Docker на множестве инстансов. Она предназначена для обеспечения простого способа подключения широкой экосистемы сервисов AWS к контейнерам.

Развертывание контейнерного приложения за Application Load Balancer или Network Load Balancer начинается с самого приложения. Возьмем, к примеру, простое веб-приложение на Node.js, которое подключается к порту 8081 и ожидает весь трафик, который поступит на этот порт (смотрите рисунок 4). Если бы это приложение развертывалось без контейнеров, оно было бы запущено на нескольких инстансах, и балансировщик нагрузки направлял бы весь трафик на статический порт 8081 в каждом инстансе.

Интеграция Application Load Balancer и Network Load Balancer с Amazon EC2 Container Service

Рисунок 4. Пример простого веб-приложения на Node.js, которое подключается к порту 8081 и ожидает весь трафик, который поступит на этот порт.

Но, поскольку мы внедряем это приложение в Docker-контейнер, у нас появляется возможность использовать функциональность Docker для сопоставления портов внутри контейнера с различными портами на хосте, на котором запущен данный контейнер. Это достигается с помощью простой настройки, которая передается в Docker при запуске контейнера. В Amazon EC2 Container Service мы можем использовать ресурс, который называется «Назначение задачи» («Task Definition»), с помощью которого и назначается необходимая нам конфигурация. «Task Definition» — это облегченный вариант документа с метаданными, который сообщает сервису управления контейнерами ECS информацию о том, с какими параметрами запускать ваш Docker-контейнер. Пример «Task Definition», который мы можем использовать для запуска веб-приложения на Node.js, описанного чуть выше, представлен на рисунке 5.

Пример Task Definition для запуска веб-приложения на Node.js, упакованного в Docker-контейнере

Рисунок 5. Пример «Task Definition» для запуска веб-приложения на Node.js, «упакованного» в Docker-контейнере.

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

При такой конфигурации несколько экземпляров контейнера могут быть развернуты на одном компьютере (смотрите рисунок 6).

Запуск нескольких экземпляров контейнера на одном компьютере

Рисунок 6. Запуск нескольких экземпляров контейнера на одном компьютере

Как мы можем видеть, любой сетевой трафик, поступающий на порт 32768, направляется на порт 8081 в одном контейнере, а любой сетевой трафик, поступающий на порт 33487, направляется на порт 8081 в другом контейнере.

Таким образом, ресурс «Task Definition» с конфигурацией перенаправления динамических портов может быть использован для запуска сервисов в EC2 Container Service (смотрите рисунок 7).

Использование Task Definition для запуска сервисов в EC2 Container Service

Рисунок 7. Использование ресурса «Task Definition» с конфигурацией перенаправления динамических портов для запуска сервисов в EC2 Container Service

Каждый сервис ECS, подключенный к балансировщику нагрузки, использует функциональность «Целевая группа», которая поддерживает автоматическую синхронизацию при запуске новой задачи или ее изменении. Целевая группа предоставляет список каждого инстанса и всех портов, которые принимают сетевой трафик на этом инстансе (смотрите рисунок 8).

Целевая группа использует каждый сервис ECS, подключенный к балансировщику нагрузки

Рисунок 8. Ресурс «Целевая группа», который использует каждый сервис ECS, подключенный к балансировщику нагрузки, предоставляет список каждого инстанса и всех портов, которые принимают сетевой трафик на этом инстансе

Application Load Balancer или Network Load Balancer, подключенный к «Целевой группе», будет использовать этот список, чтобы сделать выбор инстанса и порта, на который будет отправлен сетевой трафик.

ALB или NLB используют Целевую группу, чтобы выбрать инстанс и порт

ALB или NLB используют «Целевую группу», чтобы выбрать инстанс и порт, на который будет отправлен сетевой трафик.

Таким образом, весь процесс маршрутизации сетевого трафика в сервисах управления контейнерами выглядит следующим образом:

  1. Клиентское приложение инициирует новое соединение с балансировщиком нагрузки.
  2. Балансировщик нагрузки получает сетевой трафик и выбирает «цель» из «Целевой группы», прикрепленной к балансировщику нагрузки. Эта «Целевая группа» была сконфигурирована сервисом управления контейнерами Amazon EC2 Container Service и включает в себя список доступных инстансов и портов.
  3. Балансировщик нагрузки отправляет сетевой трафик на выбранный инстанс и порт.
  4. Docker принимает сетевой трафик и перенаправляет его на сконфигурированный порт внутри нужного контейнера.
  5. Ваше приложение, работающее внутри контейнера, получает сетевой трафик через порт, к которому оно привязано.

Заключение

Как Application Load Balancer, так и Network Load Balancer спроектированы с нуля для современной парадигмы конфигурации динамических портов, которые обычно используются при развертывании современных контейнеризированных приложений. Выбор правильного балансировщика нагрузки будет зависеть от конкретных потребностей вашего приложения, таких как: является ли сетевой трафик HTTP или нет, нужно ли вам сквозное шифрование SSL/TLS, а также хотите ли вы маршрутизировать сетевой трафик на основе хоста и пути или нет.

Если вы развертываете Docker-контейнеры и используете балансировщик нагрузки для отправки в них сетевого трафика, сервис управления контейнерами Amazon EC2 Container Service обеспечит вам тесную интеграцию как с Application Load Balancer, так и с Network Load Balancer. Благодаря этому вы можете легко синхронизировать балансировщики нагрузки при запуске, обновлении, а также остановке любого из ваших контейнеров.

 

Появились вопросы или нужна консультация? Обращайтесь!

Вечный параноик, Антон Кочуков.

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

См. также:
Заказать звонок

- Email
- Confirm
Имя *
Телефон *
Комментарий
Согласие на отправку персональных данных *

* - Обязательное для заполнения