Rate this post

Практическое пошаговое руководство, в шесть шагов

В этом базовом примере демонстрируется NGINX и swarm в действии, показана основная концепция используемая в девопс.nnВ этом документе проходит несколько этапов настройки контейнерного сервера NGINX и его использования для балансировки трафика в кластере. Для ясности эти шаги разработаны как  руководство по настройке кластера с тремя узлами и запуску двух служб докеров в этом кластере; Завершив это упражнение, вы познакомитесь с общим рабочим процессом, необходимым для использования swarm режима и балансировки нагрузки между конечными точками Windows Container, используя балансировщик нагрузки NGINX.n

Базовая установка

Это упражнение требует наличия трех контейнерных хостов, два из которых будут объединены в кластер кластера с двумя узлами , а другой будет использоваться для размещения балансировщика нагрузки в контейнере NGINX. Чтобы продемонстрировать балансировщик нагрузки в действии, две кластерные службы будут развернуты в кластере swarm, а сервер NGINX будет настроен на балансировку нагрузки между экземплярами контейнера, которые определяют эти службы. Сервисы будут как веб-сервисами, так и хостингом контента, который можно просматривать через веб-браузер. С помощью этой настройки балансировщик нагрузки легко продемонстрировать в работе, поскольку трафик маршрутизируется между двумя службами каждый раз, когда просмотр веб-браузера с отображением их содержимого обновляется.nnНа рисунке ниже представлена визуализация этой установки из трех узлов. Два из узлов, узел «Swarm Manager» и узел «Swarm Worker» вместе образуют кластер двухуровневого swarm режима кластера, запускающий две веб-службы «Docker», «S1» и «S2». Третий узел («Host NGINX» на рисунке) используется для размещения контейнерного балансировщика нагрузки NGINX, а балансировщик нагрузки настроен для маршрутизации трафика через конечные точки контейнера для двух сервисов контейнера. Эта цифра включает в себя пример IP-адресов и номеров портов для двух хостов swarm и для каждой из шести конечных точек контейнера, запущенных на хостах.nnконфигурация кластераn

Системные Требования

Три или более компьютерных систем, работающих под управлением Windows 10 Creators Update (доступных сегодня для пользователей программы Windows Insiders ), настраиваются как контейнерные узлы (см. Раздел «Контейнеры Windows в Windows 10» для получения дополнительной информации о том, как начать работу с контейнерами Docker Windows 10).nnКроме того, каждая система хоста должна быть сконфигурирована со следующим:n

  • Образ контейнера microsoft windowsservercore
  • Docker Engine v1.13.0 или новее
  • Открытые порты: в режиме «SWARM» для каждого хоста должны быть доступны следующие порты.n
    • TCP-порт 2377 для обмена данными по управлению кластером
    • TCP и UDP-порт 7946 для обмена данными между узлами
    • TCP и UDP-порт 4789 для наложения сетевого трафика

* Обратите внимание на использование двух узлов, а не трех:nЭти инструкции могут быть выполнены, используя только два узла. Однако в настоящее время в Windows существует известная ошибка, которая запрещает контейнерам получать доступ к их хостам, используя localhost или даже внешний IP-адрес хоста (более подробно об этом см. Ниже в разделах Caveats and Gotchas). Это означает, что для доступа к службам докеров через их открытые порты на swarm узлах балансировщик нагрузки NGINX не должен находиться на том же хосте, что и любой из экземпляров контейнера службы.nДругими словами, если для выполнения этого упражнения вы используете только два узла, один из них должен быть выделен для размещения балансировщика нагрузки NGINX, а другой использоваться как контейнер контейнеров swarm (т. Е. У вас будет один хост swarm кластер, хост, предназначенный для размещения вашего контейнерного балансировщика нагрузки NGINX).n

Шаг 1. Построение образа контейнера NGINX

На этом этапе мы создадим образ контейнера, необходимый для вашего балансировщика нагрузки NGINX в контейнере. Позднее мы запустим этот образ на хосте, который вы указали как ваш контейнерный контейнер NGINX.nnПримечание. Чтобы избежать необходимости переноса образа контейнера позже, выполните инструкции в этом разделе на узле контейнера, который вы собираетесь использовать для вашего балансировщика нагрузки NGINX.nnNGINX доступен для скачивания с сайта nginx.org. Образ контейнера NGINX можно создать, используя простой файл Dockerfile, который устанавливает NGINX в образ базовой базы Windows и настраивает контейнер для запуска в качестве исполняемого файла NGINX. Для целей этого упражнения я сделал загрузочный файл Dockerfile из своего личного репозитория GitHub для доступа к докинговому файлу NGINX , а затем сохраните его в определенном месте (например, C:\temp\nginx) на вашей главной машине контейнера NGINX. С этого места создайте образ, используя следующую команду:n

C:\temp\nginx> docker build -t nginx .

Теперь изображение должно появиться вместе с остальными изображениями докеров в вашей системе ( docker images с помощью команды docker images ).n

(Необязательно.) Подтвердите, что ваш NGINX-образ готов

Сначала запустите контейнер:n

  C:\temp> docker run -it -p 80:80 nginx

Затем откройте новое окно командлета и используйте команду docker docker ps чтобы увидеть, что контейнер работает. Запишите его идентификатор. Идентификатором вашего контейнера является значение в команде.nnПолучить IP-адрес контейнера:n

  C:\temp>  exec  ipconfig

Например, IP-адрес вашего контейнера может быть 172.17.176.155, как в примере вывода, показанном ниже.nnконфигурация нжинкс в кластереnnЗатем откройте браузер на своем контейнере и введите IP-адрес вашего контейнера в адресную строку. Вы должны увидеть страницу подтверждения, указывающую, что NGINX успешно работает в вашем контейнере.nnпроверка работы nginxn

Шаг 2. Создание образа для двух контейнеризованных веб-служб IIS

На этом этапе мы создадим образ контейнеров для двух простых веб-приложений на базе IIS. Позже мы будем использовать эти изображения для создания двух служб докеров.nnПримечание. Выполните инструкции в этом разделе на одном из узлов контейнера, которые вы намереваетесь использовать в качестве swarm.n

Построение общего образа веб-сервера IIS

На моем личном репо GitHub я сделал простой файл Dockerfile, который можно использовать для создания образа веб-сервера IIS. Dockerfile просто включает роль веб-сервера IIS в контейнере microsoft/windowsservercore. Загрузите файл Dockerfile отсюда и сохраните его в каком-либо месте (например, C:\temp\iis) на одной из хост-машин, которые вы планируете использовать в качестве узла swarm. С этого места создайте образ, используя следующую команду:n

  C:\temp\iis> docker build -t iis-web.

(Необязательно) Убедитесь, что готов образ веб-сервера IIS

Сначала запустите контейнер:n

  C:\temp> docker run -it -p 80:80 iis-web

Затем используйте команду docker ps docker, чтобы убедиться, что контейнер работает. Запишите его идентификатор. Идентификатором вашего контейнера является значение В следующей команде.nnПолучить IP-адрес контейнера:n

  C:\temp>docker exec  ipconfig

Теперь откройте браузер на своем контейнере и введите IP-адрес вашего контейнера в адресную строку. Должна появиться страница подтверждения, указывающая на успешное выполнение роли веб-сервера IIS в контейнере.nniis в контейнере докерn

Сборка двух пользовательских образов веб-сервера IIS

На этом этапе мы заменим страницу проверки IIS, которую мы видели выше, с пользовательскими HTML-страницами — двумя разными образами, соответствующими двум различным образам веб-контейнера. На более позднем этапе мы будем использовать наш контейнер NGINX для балансировки нагрузки между экземплярами этих двух образов. Поскольку образы будут отличаться, мы легко увидим балансировку нагрузки в действии, поскольку она переключает между содержимым, которое обслуживается контейнерами, которые мы определим на этом этапе.nnСначала создайте на хост-компьютере простой файл с именем index_1.html. В файла любой текст. Например, файл index_1.html может выглядеть так:тестирование докераnnТеперь создайте второй файл index_2.html. Опять же, в файла любой текст. Например, файл index_2.html может выглядеть так:балансировка нагрузки в докерnnТеперь мы будем использовать эти HTML документы для создания двух пользовательских образов веб-сервисов.nnЕсли созданный экземпляр контейнера iis-web еще не запущен, запустите новый, затем получите идентификатор контейнера, используя:n

  C:\temp> docker exec  ipconfig

Теперь скопируйте файл index_1.html со своего хоста на экземпляр контейнера IIS, который запущен, используя следующую команду:n

  C:\temp> docker cp index_1.html : C:\inetpub\wwwroot\index.html

Затем остановите и зафиксируйте контейнер в его текущем состоянии. Это создаст образ контейнера для первой веб-службы. Давайте назовем это первый образ, «web_1».n

C:\> docker stop nC:\> docker commit  web_1

Теперь запустите контейнер снова и повторите предыдущие шаги, чтобы создать второй образ веб-службы, на этот раз используя файл index_2.html. Сделайте это, используя следующие команды:n

C:\> docker start nC:\> docker cp index_2.html :C:\inetpub\wwwroot\index.htmlnC:\> docker stop nC:\> docker commit  web_2

Теперь вы создали образы для двух уникальных веб-сервисов; Если вы просматриваете образ  Докера на вашем хосте, запустив docker images , вы должны увидеть, что у вас есть два новых образа контейнера — «web_1» и «web_2».n

Поместите образ контейнера IIS на все ваши хосты swarm

Для выполнения этого  вам понадобятся пользовательские образы веб-контейнера, которые вы только что создали, на всех хост-машинах, которые вы намереваетесь использовать в качестве узлов swarm. У вас есть два способа получить образ на дополнительные машины:Вариант 1. Повторите описанные выше шаги, чтобы создать контейнеры «web_1» и «web_2» на втором узле.nВариант 2 [рекомендуется]: вставьте образ в ваш репозиторий в Docker Hub, затем подтяните их на дополнительные хосты.n

Шаг 3. Присоединение хостов к swarm

В результате предыдущих шагов на одной из ваших хост-машин должен быть образ контейнера nginx, а на остальных хостах должны быть образы веб-сервера «web_1» и «web_2». На этом этапе мы присоединимся к последним узлам кластера swarm.nnПримечание. Хост, на котором работает балансировщик нагрузки NGINX, не может работать на том же хосте, что и конечные точки контейнера, для которых выполняется балансировка нагрузки; Хост с образом контейнера nginx должен быть зарезервирован только для балансировки нагрузки.nnВо-первых, запустите следующую команду с любого компьютера, который вы намереваетесь использовать как swarm хост. Машина, которую вы используете для выполнения этой команды, станет диспетчерским узлом для вашего кластера swarm.n

  • Замените IP-адресом вашего хоста
  C:\temp> docker swarm init --advertise-addr =  --listen-addr : 2377

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

  • Замените IP-адресом вашего хоста (то есть которое вы использовали для инициализации swarm узла-менеджера)
  • Замените рабочим -токеном, docker swarm init (вы также можете получить токен рабочего- docker swarm init )
C:\temp> docker swarm join --token  :2377

Теперь ваши узлы настроены на формирование swarm кластера ! Состояние узлов можно увидеть, выполнив следующую команду на управляющем узле:n

C:\temp> docker node lsn

Шаг 4. Развертывание служб на swarm

Примечание . Прежде чем двигаться дальше, остановите все контейнеры NGINX или IIS, запущенные на ваших компьютерах. Это поможет избежать конфликтов портов при определении служб. Для этого просто запустите следующие команды для каждого контейнера, заменив идентификатором контейнера, который вы останавливаете / удаляете:n

C:\temp> docker stop nC:\temp> docker rm

Далее мы будем использовать образ контейнеров web_1 и web_2, которые мы создали на предыдущих этапах этого упражнения, чтобы развернуть две контейнерные службы для нашего swarm кластера.nnЧтобы создать службы, выполните следующие команды из вашего диспетчера роя:n

C:\ > docker service create --name=s1 --publish mode=host,target=80 --endpoint-mode dnsrr web_1 powershell -command {echo sleep; sleep 360000;}n
C:\ > docker service create --name=s2 --publish mode=host,target=80 --endpoint-mode dnsrr web_2 powershell -command {echo sleep; sleep 360000;}n

Теперь вы должны запустить две службы, s1 и s2. Вы можете просмотреть их статус, выполнив следующую команду на вашем диспетчере swarm:n

C:\ > docker service lsn

Кроме того, вы можете просмотреть информацию о экземплярах контейнера, которые определяют конкретную службу, со следующими командами (где именем проверяемой службы (например, s1 или s2 ):n

# List all servicesnC:\ > docker service lsn# List info for a specific servicenC:\ > docker service ps

(Необязательно) Масштабируйте свои службы

Команды на предыдущем шаге будут разворачивать один контейнерный экземпляр / реплику для каждой службы, s1 и s2 . Чтобы масштабировать службы, которые будут поддерживаться несколькими репликами, выполните следующую команду:n

C:\ > docker service scale =n# e.g. docker service scale s1=3

Шаг 5. Настройте балансировщик нагрузки NGINX.

Теперь, когда службы работают на вашем swarm кластере, вы можете настроить балансировщик нагрузки NGINX для распределения трафика между экземплярами контейнеров для этих служб.nnКонечно, обычно балансировщики нагрузки используются для балансирования трафика между экземплярами одной службы, а не нескольких служб. Для ясности в этом примере используются две службы, чтобы можно было легко увидеть функцию балансировщика нагрузки; Потому что две службы обслуживают различное содержимое HTML, мы ясно увидим, как распределяющий нагрузки распределяет запросы между ними.n

Файл nginx.conf

Во-первых, файл nginx.conf для вашего балансировщика нагрузки должен быть настроен с IP-адресами и служебными портами ваших swarm узлов и служб. Пример файла nginx.conf был включен в загрузку NGINX, которая была использована для создания образа контейнера nginx на шаге 1. Для этого упражнения я скопировал и адаптировал файл примера, предоставленный NGINX, и использовал его для создания простого шаблона Для вас, чтобы адаптироваться к вашей конкретной информации о узле / контейнере.nnЗагрузите шаблон файла nginx.conf, который я подготовил для этого упражнения , из моего личного репозитория GitHub и сохраните его на вашей главной машине контейнера NGINX. На этом этапе мы адаптируем файл шаблона и используем его для замены файла nginx.conf по умолчанию, который был первоначально загружен на ваш контейнерный контейнер NGINX.nnВам нужно будет настроить файл, добавив информацию для ваших хостов и экземпляров контейнера. Предоставленный файл шаблона nginx.conf содержит следующий раздел:n

upstream appcluster {n     server :;n     server :;n     server :;n     server :;n     server :;n     server :;n }

Чтобы адаптировать файл для своей конфигурации, вам нужно будет : записи : в файле : . У вас будет запись для каждой конечной точки контейнера, которая определяет ваши веб-службы. Для любой конечной точки контейнера значение будет IP-адресом хоста контейнера, на котором этот контейнер запущен. Значение будет являться портом на узле контейнера, на котором опубликована конечная точка контейнера.nnКогда службы, s1 и s2, были --publish mode=host,target=80 на --publish mode=host,target=80 этапе этого упражнения, был включен параметр --publish mode=host,target=80 . Этот параметр указал, что экземпляры контейнеров для служб должны отображаться через опубликованные порты на узлах контейнера. Более конкретно, включив --publish mode=host,target=80 в определения служб, каждая служба была сконфигурирована для работы на порту 80 каждой из ее конечных точек контейнера, а также набор автоматически определенных портов на хостах swarm (Т.е. один порт для каждого контейнера, запущенного на данном хосте).n

Сначала определите IP-адреса хостов и опубликованные порты для конечных точек вашего контейнера

Прежде чем вы сможете настроить свой файл nginx.conf, вы должны получить необходимую информацию о конечных точках контейнера, которые определяют ваши службы. Для этого запустите следующие команды (снова запустите их из вашего узла swarm-менеджера):n

C:\ > docker service ps s1nC:\ > docker service ps s2

Вышеприведенные команды будут возвращать сведения о каждом экземпляре контейнера, запущенном для каждой из ваших служб, во всех ваших хост-компьютерах swarm.n

  • Один столбец вывода, столбец «ports», включает информацию о портах для каждого хоста в форме *:->80/tcp . Значения будут отличаться для каждого экземпляра контейнера, поскольку каждый контейнер опубликован на собственном хост-порту.
  • Другой столбец, столбец «узел», укажет, на каком компьютере работает контейнер. Таким образом, вы определите IP-информацию хоста для каждой конечной точки.

Теперь у вас есть информация порт и узел для каждой конечной точки контейнера. Затем используйте эту информацию для заполнения поля upstream вашего файла nginx.conf; Для каждой конечной точки добавьте сервер в поле файла, заменив поле IP-адресом каждого узла (если у вас его нет, запустите ipconfig на каждом хост-компьютере, чтобы его получить), а поле с Соответствующий порт хоста.nnНапример, если у вас есть два узла swarm (IP-адреса 172.17.0.10 и 172.17.0.11), каждый из которых будет запускать три контейнера, ваш список серверов будет выглядеть примерно так:n

upstream appcluster {n     server 172.17.0.10:21858;n     server 172.17.0.11:64199;n     server 172.17.0.10:15463;n     server 172.17.0.11:56049;n     server 172.17.0.11:35953;n     server 172.17.0.10:47364;n}

После того, как вы изменили свой файл nginx.conf, сохраните его. Затем мы скопируем его с вашего хоста в образ контейнера NGINX.n

Замените файл nginx.conf по умолчанию с помощью скорректированного файла

Если ваш контейнер nginx еще не запущен на своем хосте, запустите его сейчас:n

  C:\temp> docker run -it -p 80:80 nginx

Затем откройте новое окно командлета и используйте команду docker docker ps чтобы увидеть, что контейнер работает. Запишите его идентификатор. Идентификатором вашего контейнера является значение в команде.nnПолучить IP-адрес контейнера:n

  C:\temp>  exec  ipconfig

Когда контейнер запущен, используйте следующую команду, чтобы заменить файл nginx.conf по умолчанию на файл, который вы только что настроили (выполните следующую команду из каталога, в котором вы сохранили отрегулированную версию файла nginx.conf на главной машине):n

  C:\temp> docker cp nginx.conf : C:\nginx\nginx-1.10.3\conf

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

  C:\temp> docker exec  nginx.exe -s reload

Шаг 6. Посмотрим на балансировщик нагрузки в действии

Теперь ваш балансировщик нагрузки должен быть настроен таким образом, чтобы распределять трафик между различными экземплярами ваших swarm-сервисов. Чтобы увидеть его в действии, откройте браузер иn

  • При доступе с хост-машины NGINX: Введите IP-адрес контейнера nginx, запущенного на машине, в адресную строку браузера. (Это значение выше).
  • При доступе с другого хоста (с сетевым доступом к хост-машине NGINX): Введите IP-адрес хоста NGINX в адресную строку браузера.

После ввода соответствующего адреса в адресную строку браузера нажмите клавишу ввода и подождите, пока веб-страница загрузится. После загрузки вы увидите одну из HTML-страниц, созданных на шаге 2.nnТеперь нажмите обновить страницу. Возможно, вам придется обновлять несколько раз, но после нескольких раз вы должны увидеть другую HTML-страницу, созданную на шаге 2.nnЕсли вы продолжаете обновлять, вы увидите две разные HTML-страницы, которые вы использовали для определения служб, web_1 и web_2, доступ к которым осуществляется по круговой схеме (round-robin — это стратегия балансировки нагрузки по умолчанию для NGINX, но есть и другие ). Анимированное изображение ниже продемонстрировало поведение, которое вы должны увидеть.nnконтейнер докер с балансировкой нагрузкиnnНапоминаем, что ниже представлена полная конфигурация со всеми тремя узлами. Когда вы обновляете представление своей веб-страницы, вы повторно обращаетесь к узлу NGINX, который распределяет ваш запрос GET к конечным точкам контейнера, запущенным на узлах swarm. Каждый раз, когда вы повторно отправляете запрос, балансировщик нагрузки имеет возможность маршрутизировать вас к другой конечной точке, в результате чего ваш сайт будет обслуживаться на другой веб-странице в зависимости от того, был ли ваш запрос перенаправлен на конечную точку S1 или S2.nnконфигурация swarm кластераn

Нужна помощь в построении или поддержке кластера с распределением нагрузки, обращайтесь [email protected]