Jak nasadit zónově redundantní aplikaci v Azure infrastruktuře

V jednom z předchozích článků jsem se věnoval SLA VM v Azure: https://tomaskubica.cz/sla-a-vysoka-dostupnost-vm-v-azure/

Dnes návážu s ukázkou jak nasadit aplikaci do zónově redundantních VM a balancovat přes ně provoz. Cílem je zajistit si ještě vyšší dostupnost - jak je uvedeno ve zmíněném článku při použití Availability Set dostáváte 99,95%, ale jakmile budou Availabity Zones uvedené do plné dostupnosti, čeká na vás 99,99%.

Availability zóny jsou v preview v regionu West Europe.

Nasazujeme VM v zónách

Nejprve si vytvoříme Resource Group.

az group create -n zoneapp -l westeurope

Dále si připravíme síť.

az network vnet create -g zoneapp -n mynet --address-prefix 10.0.0.0/16 --subnet-name sub --subnet-prefix 10.0.0.0/24

Moje aplikace je webová a poběží na portu 3000. Musíme si proto vytvořit Network Security Group. Je to nutné i protože zónově redundantní Load Balancer to vyžaduje (nemůžete balancovat na stoje, na kterých není NSG ať už per-VM nebo na subnetu).

az network nsg create -g zoneapp -n vmzone1nsg
az network nsg create -g zoneapp -n vmzone2nsg

az network nsg rule create -g zoneapp --nsg-name vmzone1nsg -n myweb3000 --priority 120 --source-address-prefixes "*" --source-port-ranges "*" --destination-address-prefixes "*" --destination-port-ranges 3000 --access Allow --protocol Tcp
az network nsg rule create -g zoneapp --nsg-name vmzone2nsg -n myweb3000 --priority 120 --source-address-prefixes "*" --source-port-ranges "*" --destination-address-prefixes "*" --destination-port-ranges 3000 --access Allow --protocol Tcp

Nastartuji si teď dvě VM a každou v jiné zóně. Jediný rozdíl oproti běžnému příkazu je přepínač --zone a u něj číslo. Máme k dispozici tři oddělené zóny, já mám dvě VM, tak je dám do jedničky a do dvojky.

az vm create -n vmzone1 -g zoneapp --image UbuntuLTS --admin-username tomas --ssh-key-value "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDFhm1FUhzt/9roX7SmT/dI+vkpyQVZp3Oo5HC23YkUVtpmTdHje5oBV0LMLBB1Q5oSNMCWiJpdfD4VxURC31yet4mQxX2DFYz8oEUh0Vpv+9YWwkEhyDy4AVmVKVoISo5rAsl3JLbcOkSqSO8FaEfO5KIIeJXB6yGI3UQOoL1owMR9STEnI2TGPZzvk/BdRE73gJxqqY0joyPSWOMAQ75Xr9ddWHul+v//hKjibFuQF9AFzaEwNbW5HxDsQj8gvdG/5d6mt66SfaY+UWkKldM4vRiZ1w11WlyxRJn5yZNTeOxIYU4WLrDtvlBklCMgB7oF0QfiqahauOEo6m5Di2Ex" --size Standard_A1_v2 --storage-sku Standard_LRS --zone 1 --public-ip-address "" --nsg vmzone1nsg

az vm create -n vmzone2 -g zoneapp --image UbuntuLTS --admin-username tomas --ssh-key-value "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDFhm1FUhzt/9roX7SmT/dI+vkpyQVZp3Oo5HC23YkUVtpmTdHje5oBV0LMLBB1Q5oSNMCWiJpdfD4VxURC31yet4mQxX2DFYz8oEUh0Vpv+9YWwkEhyDy4AVmVKVoISo5rAsl3JLbcOkSqSO8FaEfO5KIIeJXB6yGI3UQOoL1owMR9STEnI2TGPZzvk/BdRE73gJxqqY0joyPSWOMAQ75Xr9ddWHul+v//hKjibFuQF9AFzaEwNbW5HxDsQj8gvdG/5d6mt66SfaY+UWkKldM4vRiZ1w11WlyxRJn5yZNTeOxIYU4WLrDtvlBklCMgB7oF0QfiqahauOEo6m5Di2Ex" --size Standard_A1_v2 --storage-sku Standard_LRS --zone 2 --public-ip-address "" --nsg vmzone2nsg

Abych se nemusel na VM připojovat a svou webovou aplikaci instalovat, připravil jsem si pro ni instalační skript a provedu to automaticky s využitím VM extension.

az vm extension set -n CustomScriptForLinux --publisher Microsoft.OSTCExtensions -g zoneapp --settings '{"fileUris": ["https://tomuvstore.blob.core.windows.net/provision/provision.sh", "https://tomuvstore.blob.core.windows.net/provision/web", "https://tomuvstore.blob.core.windows.net/provision/web.service"],"commandToExecute": "sh provision.sh"}' --vm-name vmzone1

az vm extension set -n CustomScriptForLinux --publisher Microsoft.OSTCExtensions -g zoneapp --settings '{"fileUris": ["https://tomuvstore.blob.core.windows.net/provision/provision.sh", "https://tomuvstore.blob.core.windows.net/provision/web", "https://tomuvstore.blob.core.windows.net/provision/web.service"],"commandToExecute": "sh provision.sh"}' --vm-name vmzone2

Po nějaké době budou obě VM včetně aplikace nahoře a běží nám v oddělených zónách dostupnosti.

Balancing na aplikace v různých zónách

Teď bych potřeboval použít Azure Load Balancer, který by měl virtuální IP a balancoval provoz na tyto VM (a současně měřil, která z VM žije). Klasický Load Balancer je ale omezený na jednu zónu a totéž platí i pro veřejnou IP. Z toho důvodu se klasický LB a IP nyní označují za Basic SKU a nově v preview jsou nové Standard verze SKU, které jsou zónově redundantní.

Vytvořbe si balancer, health probe, backend pool a službu.

az network public-ip create -n lbip -g zoneapp --sku Standard

az network lb create -n mylb -g zoneapp --sku Standard --public-ip-address lbip --
backend-pool-name mypool

az network lb probe create -g zoneapp --lb-name mylb -n myprobe --protocol http --port 3000 --path /

az network lb rule create -g zoneapp --lb-name mylb -n mylbrules --protocol Tcp --frontend-port 80 --backend-port 3000 --probe-name myprobe

Teď potřebujeme do backend poolu zařadit naše VM. To se provádí na úrovni jejich síťové karty, kde musíme modifikovat jejich konfiguraci. Abych nemusel klikat v GUI, nejprve si přes CLI vyparsuji potřebné identifikátory a následně přidám backend pool k těmto kartám.

export nic1id=$(az vm nic list --vm-name vmzone1 -g zoneapp --query [0].id -o tsv)

export nic2id=$(az vm nic list --vm-name vmzone2 -g zoneapp --query [0].id -o tsv)

export nic1config=$(az network nic ip-config list --ids $nic1id --query [0].id -o tsv)

export nic2config=$(az network nic ip-config list --ids $nic2id --query [0].id -o tsv)

az network nic ip-config address-pool add --address-pool mypool --lb-name mylb --ids $nic1config

az network nic ip-config address-pool add --address-pool mypool --lb-name mylb --ids $nic2config

Co se týče cen, zónově redundantní Load Balancer bude na rozdíl od klasického zpoplatněn. Stejně tak cena zónově redundantní IP bude o něco vyšší, než stávající standardní. Cenové podmínky zatím stanoveny nebyly a budou oznámeny později.

Otestujeme

Připojíme se na IP adresu balanceru a párkrát si vyzkoušíme. Moje aplikace vrací identifikátor specifický pro instanci, takže si dokážeme, že se provoz skutečně balancuje na obě instance.

export ip=$(az network public-ip show -n lbip -g zoneapp --query ipAddress -o tsv)
curl $ip

curl $ip
<h1>My MAC address is 00:0d:3a:20:ff:69</h1>$ 
curl $ip
<h1>My MAC address is 00:0d:3a:21:10:fe</h1>$ 
curl $ip
<h1>My MAC address is 00:0d:3a:20:ff:69</h1>$ 
curl $ip
<h1>My MAC address is 00:0d:3a:21:10:fe</h1>$ 
curl $ip
<h1>My MAC address is 00:0d:3a:20:ff:69</h1>$

 

A to je všechno!

Jak vidíte používat zónově redundantní VM je velmi jednoduché. Vyzkoušejte si, v regionu West Europe už je v preview k dispozici.



GitHub Codespaces - vývojářské prostředí od stroje po knihovny a kompilátor, které naběhne za 15 vteřin Compute
Microsoft Dev Box - virtuální pecko pro vývojáře a kdy použít vs. GitHub Codespaces, Windows365 nebo Azure Virtual Desktop Compute
ARM64 v Azure a jak používat s Kubernetes, Terraform a GitHub Actions a multi-arch image Compute
On-demand capacity reservation vs. reserved instances v Azure - kdy co a proč nejčastěji oboje Compute
Confidential Computing - zabezpečení dat při jejich používání, kdy ani root systému nemá šanci je rozlousknout Compute