Эффективный Load Balancing в Microsoft Azure
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-адреса и эффективно обрабатывают интернет-трафик.
Мы собираемся создать балансировщик нагрузки между двумя виртуальными машинами, как показано здесь:
Сначала создадим группу ресурсов с именем $resource
:
az group create \
--name $resource \
--location eastus
Обычно мы хотим использовать 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
Создаем 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
После этого мы создаем подсеть с именем AzureBastionSubnet
внутри нашей виртуальной сети для службы-бастиона. Обратите внимание, что это имя подсети требуется для службы бастиона, которую мы собираемся создать:
az network vnet subnet create \
--name AzureBastionSubnet \
--vnet-name myVirtualNetwork \
--address-prefixes 10.1.1.0/24 \
--resource-group $resource
Мы создаем службу-бастион. Обратите внимание, что это может занять несколько минут:
az network bastion create \
--name myBastionHost \
--resource-group $resource \
--public-ip-address publicBastionIp \
--vnet-name myVirtualNetwork \
--location eastus
Затем нам нужно создать группу безопасности сети (NSG), которая фильтрует трафик и имеет правила для входящего и исходящего трафика:
az network nsg create \
--name myNetworkSecurityGroup \
--resource-group $resource
Теперь добавим правило для фильтрации трафика. Это делается с помощью команды 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
Настройка виртуальных машин
Теперь нам нужно изменить наши сетевые интерфейсы для двух виртуальных машин. Мы добьемся этого с помощью команды 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
Мы еще не совсем готовы билдить две виртуальные машины. Давайте создадим группу доступности, которая является резервной конфигурацией, если одна виртуальная машина падает, то ее нагрузку может взять на себя другая. Мы создадим их с помощью команды создания набора доступности az vm
:
az vm availability-set create \
--name myAvailabilitySet \
--location eastus \
--resource-group $resource
Давайте создадим две виртуальные машины. Обратите внимание, что мы настраиваем сетевые интерфейсы для каждого с помощью аргумента --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
Настройка балансировщика нагрузки
Мы достигли финального захода на посадку нашего самолета. После всех этих других административных задач пришло время запустить общедоступный балансировщик нагрузки. Во-первых, мы создаем общедоступный IP-адрес для балансировщика нагрузки:
az network public-ip create \
--name myPublicIP \
--resource-group $resource \
--sku Basic
Теперь давайте создадим ресурс балансировщика нагрузки:
az network lb create \
--name myPublicLoadBalancer \
--resource-group $resource \
--public-ip-address myPublicIP \
--sku Basic \
--frontend-ip-name myFrontEnd \
--backend-pool-name myBackEndPool
Прежде чем использовать балансировщик нагрузки, нам нужно создать для него правило, указывающее протокол 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
Затем давайте настроим виртуальные машины в бэкэнд-пуле и подключим эти конфигурации к балансировщику нагрузки:
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
Давайте также применим расширение 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"}'
Выведите IP-адрес и скопируйте его в браузер. Вы должны попасть на страницу, которой вас приветствует одна из виртуальных машин:
az network public-ip show \
--resource-group $resource \
--name myPublicIP \
--query ipAddress \
--output tsv
Было много работы, но мы дошли до конца! Вы видите, что ваши виртуальные машины работают и обслуживают веб-страницы. Балансировщик нагрузки выступает в роли прокси и обслуживает страницу с одной из двух виртуальных машин в группе доступности. Если балансировщик нагрузки испытывает большую нагрузку запросов, он максимально эффективно распределяет эти запросы между выделенными виртуальными машинами.
В заключение рекомендую к посещению открытый урок «Введение в высокие нагрузки». На этом занятии участники проанализируют, в каких единицах можно измерять нагрузку, рассмотрят преимущества и недостатки различных подходов к масштабированию, а также проблемы высоконагруженных проектов. Записаться можно на странице курса «Highload Architect».