Развертывание контейнеров в AWS упругой контейнерной службе (ECS) прямой, особенно при использовании облачной информации. Как только у вас есть базовый кластер ECS развернута, важно подумать о том, как предоставить высокая доступность вашего сервиса, чтобы ваши клиенты не испытывают никаких времен.
В этой статье мы будем расширять пример, предусмотренный в Автоматизация развертывания контейнера Docker для AWS ECS с использованием CloudFormation , чтобы включить несколько реплик, которые автоматически регистрируются в балансировщик нагрузки приложения.
Для достижения высокая доступность С ECS мы можем развернуть несколько реплик задачи ECS, поэтому, если одна задача умирает, мы можем Переключение другому, чтобы продолжить служение трафика.
Мы можем предоставить дополнительную защиту, обеспечивая развернутую задачи наших ECS для нескольких AWS зоны доступности Отказ Это означает, что если наличие Зона 1 становится скомпрометированным, тогда у нас есть географически и оперативно отдельная доступность Зона 2 падать назад.
Представляя балансировщик нагрузки на приложение
Балансировщик нагрузки приложения — это аромат ресурса балансировщика нагрузки AWS. Это балансировщик нагрузки на уровне 7, что означает, что он может создавать решения для маршрутизации на более высоком уровне HTTP. Мы можем иметь правила, которые прямые трафик на основе параметров HTTP-запроса, такие как заголовки, методы запроса, пути и многое другое.
Чтобы подключить ECS с прикладным нагрузки балансировщика, нам нужно понять следующие ресурсы:
- Нагрузка балансировщик слушатель : Проверяет для подключений от клиентов. Использует настраиваемые правила для определения того, как маршрутизировать запросы.
- Цель : конечное место назначения, к которым направляется запросы. Может быть идентификатор экземпляра EC2 или IP-адрес. В случае ECS это будет IP-адрес, который был связан с задачей ECS.
- Целевая группа : логическая группировка целей. Мы можем установить свойства в группе в целом, чтобы применить ко всем целям, таким как алгоритм балансировки нагрузки и проверка о состоянии здоровья.
Обратите внимание, что балансировщик нагрузки приложения должен быть создан как минимум для 2 подсетей, что помогает нам разработать высокодоступные архитектуры.
На вышеуказанной диаграмме показана настройка для соединения ECS с балансировщиком нагрузки приложения. До тех пор, пока мы указываем на службу ECS в правильную целевую группу, ECS будет обрабатывать регистрацию цели с правильным IP-адресом для нас.
Это оставляет нас обращаться к созданию следующих ресурсов:
- Балансировщик нагрузки
- Нагрузка балансировщик слушателя
- Группа безопасности балансировки нагрузки
- Целевая группа
Мы продолжим, куда мы остановились в последней статье, где мы создали службу ECS для задачи Nginx, выставленной через публичный IP. Проверьте Статья Чтобы захватить скрипт облака, который мы будем настроить в этом примере.
Расширение вверх
Наш предыдущий пример имел только 1 экземпляр Nginx, поэтому давайте масштабируемся до 2 для высокой доступности.
Несколько подсетей, несколько зон доступности
Как уже упоминалось ранее, ALB нужна 2 подсети, поэтому мы собираемся изменить шаблон Cloudbation, чтобы принять идентификаторы подсети в качестве параметров. VPC по умолчанию, созданный AWS, должен содержать несколько подсетей в разных зонах доступности, поэтому вы всегда можете использовать их.
Пока мы на этом, мы добавим VPCID Параметр также, поскольку это потребуется целевой группой позже.
Измените параметры в шаблоне CloudFormation к этому:
Parameters: Subnet1ID: Type: String Subnet2ID: Type: String VPCID: Type: String
Масштабирование до 2 реплик
Теперь, когда мы включили несколько подсетей, давайте воспользуемся этим в нашей службе ECS:
- Включая новую подсеть в определении службы ECS, поэтому он может развернуть задачи для обеих подсетей
- Масштабирование сервиса до 2 реплик
Ваша облачность для обслуживания теперь должна выглядеть так:
Service: Type: AWS::ECS::Service Properties: ServiceName: deployment-example-service Cluster: !Ref Cluster TaskDefinition: !Ref TaskDefinition DesiredCount: 2 # <--- Increase replicas to 2 LaunchType: FARGATE NetworkConfiguration: AwsvpcConfiguration: AssignPublicIp: ENABLED Subnets: - !Ref Subnet1ID # <--- Add subnet 1 - !Ref Subnet2ID # <--- Add subnet 2 SecurityGroups: - !GetAtt ContainerSecurityGroup.GroupId
Примечание : Если вы получите ошибку ниже, говоря, что облачность не может обновить стек, изменить ServiceName выше для чего-то другого, например Развертывание — Пример-SVC Отказ
Разверните изменения
Мы обновим стек Cloudbationation, который, если вы использовали вместе с примером в предыдущей статье, назывался Пример развертывания Отказ Обратите внимание, что нам нужно добавить параметры сейчас для Подсеть1ID , Подсеть2ID и VPCID .
$ aws cloudformation update-stack --stack-name example-deployment --template-body file://./ecs.yml --capabilities CAPABILITY_NAMED _IAM --parameters ParameterKey=Subnet1ID,ParameterValue=ParameterKey=Subnet2ID,ParameterValue== Para meterKey=VPCID,ParameterValue=
После того, как этот стек завершит обновление (проверьте Услуги> Область В консоли AWS, чтобы получить его статус), отправляйтесь на переход к Услуги> ECS> Развертывание — пример кластера> Задачи , и вы должны увидеть несколько задач:
Если вы нажимаете на каждую отдельную задачу и посмотрите на сетевой раздел, вы увидите, что каждая задача развернута в отдельную подсеть и имеет определенный IP-адрес:
Так что теперь, когда мы получили наши реплики, нам просто нужно подключить их к балансировке нагрузки. ✅
Добавление новых ресурсов балансировщика нагрузки приложений
Затем мы собираемся создать четырех ресурсов, упомянутые ранее, что обеспечит шлюз, через который пользователь может получить доступ к нашим контейнерам Nginx через Интернет.
Добавьте следующие ресурсы до конца шаблона вашего облака:
LoadBalancerSecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupName: LoadBalancerSecurityGroup GroupDescription: Security group for load balancer SecurityGroupIngress: - IpProtocol: tcp FromPort: 80 ToPort: 80 CidrIp: 0.0.0.0/0 LoadBalancer: Type: AWS::ElasticLoadBalancingV2::LoadBalancer Properties: Name: deployment-example-load-balancer Subnets: - !Ref Subnet1ID - !Ref Subnet2ID SecurityGroups: - !GetAtt LoadBalancerSecurityGroup.GroupId LoadBalancerListener: Type: AWS::ElasticLoadBalancingV2::Listener Properties: LoadBalancerArn: !Ref LoadBalancer Port: 80 Protocol: HTTP DefaultActions: - Type: forward TargetGroupArn: !Ref TargetGroup TargetGroup: Type: AWS::ElasticLoadBalancingV2::TargetGroup Properties: TargetType: ip Name: deployment-example-target-group Port: 80 Protocol: HTTP VpcId: !Ref VPCID
Мы настраиваем:
- Группа безопасности : позволяет входящий трафик на балансировщик нагрузки на порт 80 из любого IP
- Балансировщик нагрузки : Балансировщик нагрузки приложения (тип по умолчанию) с соответствующей группой безопасности
- Нагрузка балансировщик слушателя : Прослушивание порта 80 для HTTP-трафика, это будет пересылать запросы на целевую группу в качестве поведения по умолчанию.
- Целевая группа : Получение HTTP-трафика на порту 80 эта целевая группа готова к любым целям, которые будут зарегистрированы в нее ECS
Еще раз примените это обновление в ваш стек облака и дождитесь его завершения:
$ aws cloudformation update-stack --stack-name example-deployment --template-body file://./ecs.yml --capabilities CAPABILITY_NAMED _IAM --parameters ParameterKey=Subnet1ID,ParameterValue=ParameterKey=Subnet2ID,ParameterValue== Para meterKey=VPCID,ParameterValue=
Новая целевая группа
Если вы отправитесь к Услуги> EC2> Балансировщики нагрузки Вы сможете увидеть информацию о вашем новом балансе нагрузки, включая его имя DNS, которое нам понадобится позже. Если вы попробуйте ударить его сейчас, вы получите ошибку 503.
Если вы выберете Целевые группы В левой ручной навигации вы также можете увидеть информацию о новой целевой группе. Алгоритм балансировки нагрузки по умолчанию, выбранный AWS, является Круглый Робин Отказ 🐦 Это означает, что запросы будут распределяться на каждую цель одинаково.
Свяжите службу ECS для нового балансировщика нагрузки
У нас есть только одно изменение, чтобы сделать сейчас, и это обновить нашу службу ECS, чтобы она знала для автоматического регистрации целей для каждой задачи в нашей новой целевой группе. Это может быть достигнуто путем добавления следующих LoadBalancer раздел до конца Сервис ресурс:
Service: Type: AWS::ECS::Service Properties: ... LoadBalancers: - TargetGroupArn: !Ref TargetGroup ContainerPort: 80 ContainerName: deployment-example-container
ContureName должен соответствовать имени, определенному в Контейнерные данные раздел AWS:: ECS:: TaskDefinition ресурс.
В течение последнего времени обновите стек CloudFormation с тем же AWS CloudFormation Update-Stack
Команда раньше.
Перейдите к Услуги> EC2> Целевые группы> Цели И как только стек Cloudbation завершит обновление, вы увидите, что для нас зарегистрированы две новые цели.
IP-адреса здесь являются те, которые уже были назначены нашим двум отдельным задачам ECS. Вы можете увидеть, что статус — здоровая Поскольку проверка здоровья по умолчанию попадает в порт 80, что в случае нашего контейнера Nginx возвращает 200 ответ.
Проверьте его
Возьмите имя DNS из вашего балансировщика нагрузки на приложение, как описано выше, затем перейдите к нему в вашем браузере.
Вы получите вышеупомянутую страницу Nginx по умолчанию, доказывая, что наш балансировщик нагрузки был правильно настроен на запросы на маршрут к ECS.
У нас сейчас есть Высокодоступные Cluster ECS развернут, доступный через Интернет через балансировщик нагрузки приложения. В случае одного из наших экземпляров NGINX, у нас есть экземпляр переключения, доступный в другой зоне доступности, чтобы воспользоваться.
Это, конечно, все обработано автоматически для нас ECS. Когда один из наших экземпляров Nginx становится нездоровым, запросы больше не будут направлены к нему, а ECS в конечном итоге попробует перезапустить контейнер. Аналогично, если ECS решает предварительно удалить задачу (например, когда мы рассыпаем количество реплик), он автоматически удалит цель из целевой группы.
Следующие шаги : Этот пример представляет собой простую настройку для демонстрационных целей. Если вы хотите запустить такую настройку в производстве, убедитесь, что:
- Настройте балансировщик нагрузки для HTTPS, а не HTTP-доступ
- Ограничьте исходящий трафик от балансировщика нагрузки только на те пункты назначения, которые мы знаем, что он должен получить доступ, например, ECS. Вы можете сделать это в группе безопасности балансировщиков нагрузки Безопасностьgroupegress правила.
- Установить Назначение Publicip к ложь в AWS:: ECS:: Сервис определение
Оригинал: «https://dev.to/appfleet/how-to-route-traffic-to-your-docker-container-in-aws-ecs-using-an-application-load-balancer-24j1»