Эффективный Load Balancing в Microsoft Azure

faefe3a384f538dea09574832b4ebdcb.png

1d34a6181dbf493f4127f00264985f7a.jpgАвтор статьи: Рустем Галиев

IBM Senior DevOps Engineer & Integration Architect. Официальный DevOps ментор и коуч в IBM

Привет, Хабр! Сегодня поговорим про балансировку нагрузки в Microsoft Azure.

Microsoft Azure — это сервис облачных вычислений, предлагаемая и управляемая Microsoft, которую можно использовать для размещения ваших данных и приложений в облаке.

Давайте начнем.

Используем учетные данные для входа в Azure CLI. Из интерфейса командной строки мы можем создавать ресурсы Azure и управлять ими. Выполним эту команду, чтобы войти в учетную запись Azure:

az login -u 

После входа в систему вы должны получить блок JSON с подробной информацией о вашем входе.

$ az login -u $username -p $password
[
  {
	"cloudName": "AzureCloud",
	"homeTenantId": "9a8cd433-6113-49e5-aa7f-42788a01a246",
	"id": "dac10b38-92f3-4492-85f4-4f5006fa0c22",
	"isDefault": true,
	"managedByTenants": [],
	"name": "clouders50",
	"state": "Enabled",
	"tenantId": "9a8cd433-6113-49e5-aa7f-42788a01a246",
	"user": {
  	"name": "user-plzpmayewlum@ibm.com",
  	"type": "user"
	}
  }
]

Мы можем просмотреть имя пользователя и пароль учетной записи Azure с помощью этих команд:

echo $username

echo $password

Создадим виртуальную сеть

Балансировка нагрузки означает равномерное распределение входящего трафика по группе внутренних ресурсов для обработки этих запросов. Это помогает масштабировать нагрузки по трафику и эффективно их обрабатывать. Мы создадим общедоступный балансировщик нагрузки, который обеспечит исходящие соединения доступом к сбалансированному набору виртуальных машин. Частные IP-адреса преобразуются в общедоступные IP-адреса и эффективно обрабатывают интернет-трафик.

Мы собираемся создать балансировщик нагрузки между двумя виртуальными машинами, как показано здесь:

787bf5cc6296c1f37cd1498b5547861a.png

Сначала создадим группу ресурсов с именем $resource:

az group create \
    --name $resource \
    --location eastus

ce36eb9d7eacb5b5cef060ea67211b03.png

Обычно мы хотим использовать standart SKU для балансировщиков нагрузки, но на этот раз мы будем использовать basic SKU. Разница в том, что мы будем создавать виртуальные машины в сете доступности, а не в нескольких зонах доступности.

Давайте сначала создадим виртуальную сеть myVirtualNetwork с внутренней подсетью с именем myBESubnet:

az network vnet create \
    --name myVirtualNetwork \
    --resource-group $resource \
    --location eastus \
    --subnet-name myBESubnet \
    --address-prefixes 10.1.0.0/16 \
    --subnet-prefixes 10.1.0.0/24

0567d12b10fc703a0dd37c7ee507f819.png

Создаем Bastion и Security Group

Здесь все немного сложнее. Мы собираемся создать бастион, который обеспечивает подключение протокола удаленного рабочего стола (RDP) или SSH (Secure Shell) к вашим виртуальным машинам по протоколу TLS. Это защищает ваши виртуальные машины от уязвимости, открывая порты RDP/SSH для общедоступного Интернета, но предоставляя средства для подключения через RDP/SSH. Это сохранит конфиденциальность наших виртуальных машин.

Давайте сначала создадим общедоступный IP-адрес для бастиона, который мы собираемся создать. Из соображений безопасности и доступности на практике мы, скорее всего, будем использовать SKU Standard вместо Basic.

az network public-ip create \
    --name publicBastionIp \
    --resource-group $resource \
    --sku Standard

48df71b934b90e093351b65e1eb86dd4.png

После этого мы создаем подсеть с именем AzureBastionSubnet внутри нашей виртуальной сети для службы-бастиона. Обратите внимание, что это имя подсети требуется для службы бастиона, которую мы собираемся создать:

az network vnet subnet create \
    --name AzureBastionSubnet \
    --vnet-name myVirtualNetwork \
    --address-prefixes 10.1.1.0/24 \
    --resource-group $resource

dd7a802283194158aa67ac73d7227931.png

Мы создаем службу-бастион. Обратите внимание, что это может занять несколько минут:

az network bastion create \
    --name myBastionHost \
    --resource-group $resource \
    --public-ip-address publicBastionIp \
    --vnet-name myVirtualNetwork \
    --location eastus

c66d643fcedc6c9781a3ceabd5f812a5.png

Затем нам нужно создать группу безопасности сети (NSG), которая фильтрует трафик и имеет правила для входящего и исходящего трафика:

az network nsg create \
    --name myNetworkSecurityGroup \
    --resource-group $resource

a5139cea0c46effdf3c66e7394f6008f.png

Теперь добавим правило для фильтрации трафика. Это делается с помощью команды az network nsg rule create

az network nsg rule create \
    --name myHTTPRule \
    --nsg-name myNetworkSecurityGroup \
    --resource-group $resource \
    --protocol '*' \
    --direction inbound \
    --source-address-prefix '*' \
    --source-port-range '*' \
    --destination-address-prefix '*' \
    --destination-port-range 80 \
    --access allow \
    --priority 200

9605144debad9c9ff5a8945c518468c0.png

Настройка виртуальных машин

Теперь нам нужно изменить наши сетевые интерфейсы для двух виртуальных машин. Мы добьемся этого с помощью команды az network nic. Как указывалось ранее, для этого мы собираемся балансировать нагрузку между двумя машинами:

az network nic create \
    --name myVMNic1 \
    --resource-group $resource \
    --vnet-name myVirtualNetwork \
    --subnet myBESubnet \
    --network-security-group myNetworkSecurityGroup

az network nic create \
    --name myVMNic2 \
    --resource-group $resource \
    --vnet-name myVirtualNetwork \
    --subnet myBESubnet \
    --network-security-group myNetworkSecurityGroup

a52682ddb86cab5ed020e36a9b470f46.png

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

az vm availability-set create \
    --name myAvailabilitySet \
    --location eastus \
    --resource-group $resource

1f31ef214813e7bc8d1134dbccd82ae0.png

Давайте создадим две виртуальные машины. Обратите внимание, что мы настраиваем сетевые интерфейсы для каждого с помощью аргумента --nics. Это прикрепит наши виртуальные машины к нашей myBESubnet, которую мы создали ранее:

az vm create \
    --resource-group $resource \
    --name myVirtualMachine1 \
    --nics myVMNic1 \
    --image UbuntuLTS \
    --admin-username azureuser \
    --public-ip-sku Standard \
    --availability-set myAvailabilitySet \
    --custom-data vm_settings.yaml \
    --no-wait

az vm create \
    --resource-group $resource \
    --name myVirtualMachine2 \
    --nics myVMNic2 \
    --image UbuntuLTS \
    --admin-username azureuser \
    --public-ip-sku Standard \
    --custom-data vm_settings.yaml \
    --availability-set myAvailabilitySet

764650b43833954fd25ab9279ea1a294.png

Настройка балансировщика нагрузки

Мы достигли финального захода на посадку нашего самолета. После всех этих других административных задач пришло время запустить общедоступный балансировщик нагрузки. Во-первых, мы создаем общедоступный IP-адрес для балансировщика нагрузки:

az network public-ip create \
    --name myPublicIP \
    --resource-group $resource \
    --sku Basic

7df38512993fb17fabc7b3862a964144.png

Теперь давайте создадим ресурс балансировщика нагрузки:

az network lb create \
    --name myPublicLoadBalancer \
    --resource-group $resource \
    --public-ip-address myPublicIP \
    --sku Basic \
    --frontend-ip-name myFrontEnd \
    --backend-pool-name myBackEndPool

541b4fc119d1d26e5bb31ca3b71cd4a0.png

Прежде чем использовать балансировщик нагрузки, нам нужно создать для него правило, указывающее протокол tcp, а также порты и политику тайм-аута, которую мы установим на 20 секунд:

az network lb rule create \
    --resource-group $resource \
    --lb-name myPublicLoadBalancer \
    --name myLoadBalancerRule \
    --protocol tcp \
    --frontend-port 80 \
    --backend-port 80 \
    --frontend-ip-name myFrontEnd \
    --backend-pool-name myBackEndPool \
    --idle-timeout 20

fa263ff9b71138526ded8ada8231afe1.png

Затем давайте настроим виртуальные машины в бэкэнд-пуле и подключим эти конфигурации к балансировщику нагрузки:

az network nic ip-config address-pool add \
    --address-pool myBackendPool \
    --ip-config-name ipconfig1 \
    --nic-name myVMNic1 \
    --resource-group $resource \
    --lb-name myPublicLoadBalancer

az network nic ip-config address-pool add \
    --address-pool myBackendPool \
    --ip-config-name ipconfig1 \
    --nic-name myVMNic2 \
    --resource-group $resource \
    --lb-name myPublicLoadBalancer

26463a70e5b6112190079af2862dc024.png

Давайте также применим расширение CustomScript к нашим виртуальным машинам. Это позволяет нам легко запускать сценарии на наших виртуальных машинах, которые в этом случае будут использоваться для установки NGINX в качестве веб-службы. Мы сделаем это с помощью этого скрипта и применим его с помощью команды az vm extension set:

az vm extension set \
  --publisher Microsoft.Azure.Extensions \
  --name CustomScript \
  --resource-group $resource \
  --vm-name myVirtualMachine1 \
  --settings '{ "fileUris": ["https://raw.githubusercontent.com/Azure-Samples/compute-automation-configurations/master/automate_nginx.sh"], "commandToExecute": "./automate_nginx.sh"}'

az vm extension set \
  --publisher Microsoft.Azure.Extensions \
  --name CustomScript \
  --resource-group $resource \
  --vm-name myVirtualMachine2 \
  --settings '{ "fileUris": ["https://raw.githubusercontent.com/Azure-Samples/compute-automation-configurations/master/automate_nginx.sh"], "commandToExecute": "./automate_nginx.sh"}'

7c7850969ead726f10a1d89e96939345.png

Выведите IP-адрес и скопируйте его в браузер. Вы должны попасть на страницу, которой вас приветствует одна из виртуальных машин:

az network public-ip show \
    --resource-group $resource \
    --name myPublicIP \
    --query ipAddress \
    --output tsv

a0d83b16af87897c58ee5751ad5073ea.png9f0aaf20c07448d5225b7192f8112c04.png

Было много работы, но мы дошли до конца! Вы видите, что ваши виртуальные машины работают и обслуживают веб-страницы. Балансировщик нагрузки выступает в роли прокси и обслуживает страницу с одной из двух виртуальных машин в группе доступности. Если балансировщик нагрузки испытывает большую нагрузку запросов, он максимально эффективно распределяет эти запросы между выделенными виртуальными машинами.

В заключение рекомендую к посещению открытый урок «Введение в высокие нагрузки». На этом занятии участники проанализируют, в каких единицах можно измерять нагрузку, рассмотрят преимущества и недостатки различных подходов к масштабированию, а также проблемы высоконагруженных проектов. Записаться можно на странице курса «Highload Architect».

© Habrahabr.ru