Partilhar via


Tutorial: VMs de balanceamento de carga para elevada disponibilidade

Aplica-se a: ✔️ Conjuntos de dimensionamento flexíveis de VMs ✔️ do Linux

O balanceamento de carga fornece um nível mais elevado de disponibilidade ao propagar os pedidos recebidos por várias máquinas virtuais. Neste tutorial, vai conhecer os diferentes componentes do balanceador de carga do Azure que distribuem o tráfego e oferecem elevada disponibilidade. Saiba como:

  • Criar um balanceador de carga
  • Criar uma sonda de estado de funcionamento
  • Criar regras de tráfego
  • Utilizar o cloud-init para instalar uma aplicação de Node.js básica
  • Criar máquinas virtuais e anexá-las ao balanceador de carga
  • Ver o balanceador de carga em ação
  • Adicionar e remover VMs do balanceador de carga

Este tutorial utiliza a CLI na Cloud Shell do Azure, que é constantemente atualizada para a versão mais recente. Para abrir o Cloud Shell, selecione Experimentar na parte superior de qualquer bloco de código.

Se optar por instalar e utilizar a CLI localmente, este tutorial requer que execute uma versão da CLI do Azure que seja a 2.0.30 ou posterior. Executar az --version para localizar a versão. Se precisar de instalar ou atualizar, veja Install Azure CLI (Instalar o Azure CLI).

Descrição geral do balanceador de carga do Azure

Um balanceador de carga do Azure é um balanceador de carga de Camada 4 (TCP, UDP) que fornece elevada disponibilidade ao distribuir o tráfego de entrada entre VMs em bom estado de funcionamento. Uma sonda de estado de funcionamento do balanceador de carga monitoriza uma porta especificada em cada VM e apenas distribui o tráfego para uma VM operacional.

Pode definir uma configuração de IP de front-end com um ou mais endereços IP públicos. Esta configuração de IP de front-end permite ao balanceador de carga e às aplicações estarem acessíveis através da Internet.

As máquinas virtuais ligam a um balanceador de carga através da respetiva placa de interface de rede virtual (NIC). Para distribuir o tráfego pelas VMs, um conjunto de endereços de back-end contém os endereços IP das placas virtuais (NICs) ligadas ao balanceador de carga.

Para controlar o fluxo de tráfego, pode definir regras de balanceador de carga para portas específicas e protocolos que mapeiam para as suas VMs.

Se seguiu o tutorial anterior para criar um conjunto de dimensionamento de máquinas virtuais, foi criado um balanceador de carga. Todos estes componentes foram configurados como parte do conjunto de dimensionamento.

Criar um balanceador de carga do Azure

Esta secção descreve como pode criar e configurar cada componente do balanceador de carga. Antes de poder criar o balanceador de carga, tem de criar um grupo de recursos com az group create. O exemplo seguinte cria um grupo de recursos com o nome myResourceGroupLoadBalancer na localização eastus:

az group create --name myResourceGroupLoadBalancer --location eastus

Crie um endereço IP público

Para aceder à sua aplicação na Internet, precisa de um endereço IP público para o balanceador de carga. Criar um endereço IP público com az network public-ip create. O exemplo seguinte cria um endereço IP público designado myPublicIP no grupo de recursos myResourceGroupLoadBalancer:

az network public-ip create \
    --resource-group myResourceGroupLoadBalancer \
    --name myPublicIP

Criar um balanceador de carga

Crie um balanceador de carga com az network lb create. O exemplo seguinte cria um balanceador de carga com o nome myLoadBalancer e atribui o endereço myPublicIP à configuração de IP de front-end:

az network lb create \
    --resource-group myResourceGroupLoadBalancer \
    --name myLoadBalancer \
    --frontend-ip-name myFrontEndPool \
    --backend-pool-name myBackEndPool \
    --public-ip-address myPublicIP

Criar uma sonda de estado de funcionamento

Para permitir ao balanceador de carga monitorizar o estado da aplicação, pode utilizar uma sonda de estado de funcionamento. A sonda de estado de funcionamento adiciona ou remove dinamicamente VMs da rotação do balanceador de carga com base na respetiva resposta às verificações de estado de funcionamento. Por predefinição, uma VM é removida da distribuição do balanceador de carga após duas falhas consecutivas em intervalos de 15 segundos. Pode criar uma sonda de estado de funcionamento com base num protocolo ou numa página de verificação de estado de funcionamento específica da aplicação.

O exemplo seguinte cria uma sonda TCP. Também pode criar sondas HTTP personalizadas para obter verificações de estado de funcionamento mais detalhadas. Quando utilizar uma sonda HTTP personalizada, tem de criar a página de verificação de estado de funcionamento, tal como healthcheck.js. A sonda tem de devolver uma resposta HTTP 200 OK para o balanceador de carga manter o anfitrião na rotação.

Para criar uma sonda de estado de funcionamento TCP, utilize az network lb probe create. O exemplo seguinte cria uma sonda de estado de funcionamento com o nome myHealthProbe:

az network lb probe create \
    --resource-group myResourceGroupLoadBalancer \
    --lb-name myLoadBalancer \
    --name myHealthProbe \
    --protocol tcp \
    --port 80

Criar uma regra de balanceador de carga

É utilizada uma regra de balanceador de carga para definir a forma como o tráfego é distribuído pelas VMs. Pode definir a configuração de IP de front-end do tráfego de entrada e o conjunto de IPs de back-end para receber o tráfego, juntamente com a porta de origem e de destino necessárias. Para garantir que apenas as VMs em bom estado de funcionamento recebem o tráfego, também pode definir a sonda de estado de funcionamento a utilizar.

Crie uma regra de balanceador de carga com az network lb rule create. O exemplo seguinte cria uma regra com o nome myLoadBalancerRule, utiliza a sonda de estado de funcionamento myHealthProbe e faz o balanceamento de carga do tráfego na porta 80:

az network lb rule create \
    --resource-group myResourceGroupLoadBalancer \
    --lb-name myLoadBalancer \
    --name myLoadBalancerRule \
    --protocol tcp \
    --frontend-port 80 \
    --backend-port 80 \
    --frontend-ip-name myFrontEndPool \
    --backend-pool-name myBackEndPool \
    --probe-name myHealthProbe

Configurar uma rede virtual

Antes de implementar algumas VMs e testar o balanceador, crie os recursos de rede virtual. Para obter mais informações sobre redes virtuais, veja o tutorial Gerir Redes Virtuais do Azure.

Criar recursos de rede

Crie uma rede virtual com az network vnet create. O exemplo seguinte cria uma rede virtual com o nome myVnet com uma sub-rede denominada mySubnet:

az network vnet create \
    --resource-group myResourceGroupLoadBalancer \
    --name myVnet \
    --subnet-name mySubnet

Para adicionar um grupo de segurança de rede, utilize az network nsg create. O exemplo seguinte cria um grupo de segurança de rede com o nome myNetworkSecurityGroup:

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

Crie uma regra de grupo de segurança de rede com az network nsg rule create. O exemplo seguinte cria uma regra de grupo de segurança de rede com o nome myNetworkSecurityGroupRule:

az network nsg rule create \
    --resource-group myResourceGroupLoadBalancer \
    --nsg-name myNetworkSecurityGroup \
    --name myNetworkSecurityGroupRule \
    --priority 1001 \
    --protocol tcp \
    --destination-port-range 80

As NICs virtuais são criadas com az network nic create. O exemplo seguinte cria três NICs virtuais. (Uma NIC virtual para cada VM que criar para a aplicação nos passos seguintes). Pode criar NICs virtuais e VMs adicionais em qualquer altura e adicioná-las ao balanceador de carga:

for i in `seq 1 3`; do
    az network nic create \
        --resource-group myResourceGroupLoadBalancer \
        --name myNic$i \
        --vnet-name myVnet \
        --subnet mySubnet \
        --network-security-group myNetworkSecurityGroup \
        --lb-name myLoadBalancer \
        --lb-address-pools myBackEndPool
done

Quando as três NICs virtuais estiverem criadas, avance para o passo seguinte

Criar máquinas virtuais

Criar configuração de inicialização da cloud

Num tutorial anterior sobre Como personalizar uma máquina virtual do Linux no primeiro arranque, aprendeu a automatizar a personalização de VMs com inicialização da cloud. Pode utilizar o mesmo ficheiro de configuração de inicialização da cloud para instalar o NGINX e executar uma aplicação Node.js "Hello World" simples no próximo passo. Para ver o balanceador de carga em ação, no final do tutorial, pode aceder a esta aplicação simples num browser.

Na shell atual, crie um ficheiro com o nome cloud-init.txt e cole a seguinte configuração. Por exemplo, crie o ficheiro no Cloud Shell, não no seu computador local. Introduza sensible-editor cloud-init.txt para criar o ficheiro e ver uma lista dos editores disponíveis. Certifique-se de que o ficheiro de inicialização da cloud é copiado corretamente, especialmente a primeira linha:

#cloud-config
package_upgrade: true
packages:
  - nginx
  - nodejs
  - npm
write_files:
  - owner: www-data:www-data
  - path: /etc/nginx/sites-available/default
    content: |
      server {
        listen 80;
        location / {
          proxy_pass http://localhost:3000;
          proxy_http_version 1.1;
          proxy_set_header Upgrade $http_upgrade;
          proxy_set_header Connection keep-alive;
          proxy_set_header Host $host;
          proxy_cache_bypass $http_upgrade;
        }
      }
  - owner: azureuser:azureuser
  - path: /home/azureuser/myapp/index.js
    content: |
      var express = require('express')
      var app = express()
      var os = require('os');
      app.get('/', function (req, res) {
        res.send('Hello World from host ' + os.hostname() + '!')
      })
      app.listen(3000, function () {
        console.log('Hello world app listening on port 3000!')
      })
runcmd:
  - service nginx restart
  - cd "/home/azureuser/myapp"
  - npm init
  - npm install express -y
  - nodejs index.js

Criar máquinas virtuais

Para melhorar a elevada disponibilidade da aplicação, coloque as VMs num conjunto de disponibilidade. Para obter mais informações sobre conjuntos de disponibilidade, veja o tutorial anterior Como criar máquinas virtuais de elevada disponibilidade.

Crie um conjunto de disponibilidade com az vm availability-set create. O exemplo seguinte cria um conjunto de disponibilidade com o nome myAvailabilitySet:

az vm availability-set create \
    --resource-group myResourceGroupLoadBalancer \
    --name myAvailabilitySet

Agora, pode criar as VMs com az vm create. O exemplo seguinte cria três VMs e gera chaves SSH, caso não existam:

for i in `seq 1 3`; do
    az vm create \
        --resource-group myResourceGroupLoadBalancer \
        --name myVM$i \
        --availability-set myAvailabilitySet \
        --nics myNic$i \
        --image UbuntuLTS \
        --admin-username azureuser \
        --generate-ssh-keys \
        --custom-data cloud-init.txt \
        --no-wait
done

Existem tarefas em segundo plano que continuam em execução após a CLI do Azure o devolver à linha de comandos. O parâmetro --no-wait não aguarda a conclusão de todas as tarefas. Poderão ser necessários mais alguns minutos antes de poder aceder à aplicação. A sonda de estado de funcionamento do balanceador de carga deteta automaticamente quando a aplicação está em execução em cada VM. Assim que a aplicação estiver em execução, a regra de balanceador de carga começa a distribuir o tráfego.

Testar o balanceador de carga

Pode obter o endereço IP público do balanceador de carga com az network public-ip show. O exemplo seguinte obtém o endereço IP para myPublicIP criado anteriormente:

az network public-ip show \
    --resource-group myResourceGroupLoadBalancer \
    --name myPublicIP \
    --query [ipAddress] \
    --output tsv

Em seguida, pode introduzir o endereço IP público num browser. Não se esqueça de que demora alguns minutos até as VMs estarem prontas antes de o balanceador de carga começar a distribuir o tráfego pelas mesmas. A aplicação é apresentada, incluindo o nome do anfitrião da VM para a qual o balanceador de carga distribuiu tráfego, como no seguinte exemplo:

Executar aplicação Node.js

Para ver o balanceador de carga a distribuir tráfego pelas três VMs que estão a executar a aplicação, pode forçar a atualização do browser.

Adicionar e remover VMs

Pode ter de realizar a manutenção nas VMs que estão a executar a aplicação, como instalar atualizações do SO. Para lidar com maior volume de tráfego para a aplicação, pode ter de adicionar mais VMs. Esta secção mostra como adicionar ou remover uma VM do balanceador de carga.

Remover uma VM do balanceador de carga

Pode remover uma VM do conjunto de endereços de back-end com az network nic ip-config address-pool remove. O exemplo seguinte remove a NIC virtual para myVM2 de myLoadBalancer:

az network nic ip-config address-pool remove \
    --resource-group myResourceGroupLoadBalancer \
    --nic-name myNic2 \
    --ip-config-name ipConfig1 \
    --lb-name myLoadBalancer \
    --address-pool myBackEndPool 

Para ver o balanceador de carga a distribuir tráfego pelas duas VMs restantes que estão a executar a aplicação, pode forçar a atualização do browser. Pode agora efetuar a manutenção da VM, como instalar atualizações do SO ou reiniciar.

Para ver uma lista de VMs com NICs virtuais ligadas ao balanceador de carga, utilize az network lb address-pool show. Consulte e filtre pelo ID da NIC virtual da seguinte forma:

az network lb address-pool show \
    --resource-group myResourceGroupLoadBalancer \
    --lb-name myLoadBalancer \
    --name myBackEndPool \
    --query backendIpConfigurations \
    --output tsv | cut -f5

O resultado é semelhante ao exemplo seguinte, que mostra que a NIC virtual para a VM 2 já não faz parte do conjunto de endereços de back-end:

/subscriptions/<guid>/resourceGroups/myResourceGroupLoadBalancer/providers/Microsoft.Network/networkInterfaces/myNic1/ipConfigurations/ipconfig1
/subscriptions/<guid>/resourceGroups/myResourceGroupLoadBalancer/providers/Microsoft.Network/networkInterfaces/myNic3/ipConfigurations/ipconfig1

Adicionar uma VM ao balanceador de carga

Depois de efetuar a manutenção da VM, ou se tiver de expandir a capacidade, pode adicionar uma VM ao conjunto de endereços de back-end com az network nic ip-config address-pool add. O exemplo seguinte adiciona a NIC virtual para myVM2 a myLoadBalancer:

az network nic ip-config address-pool add \
    --resource-group myResourceGroupLoadBalancer \
    --nic-name myNic2 \
    --ip-config-name ipConfig1 \
    --lb-name myLoadBalancer \
    --address-pool myBackEndPool

Para verificar se a NIC virtual está ligada ao conjunto de endereços de back-end, utilize novamente az network lb address-pool show do passo anterior.

Passos seguintes

Neste tutorial, criou um balanceador de carga e anexou VMs ao mesmo. Aprendeu a:

  • Criar um balanceador de carga do Azure
  • Criar uma sonda de estado de funcionamento do balanceador de carga
  • Criar regras de tráfego do balanceador de carga
  • Utilizar a inicialização da cloud para criar uma aplicação Node.js básica
  • Criar máquinas virtuais e anexar a um balanceador de carga
  • Ver um balanceador de carga em ação
  • Adicionar e remover VMs de um balanceador de carga

Avance para o próximo tutorial para saber mais sobre os componentes de rede virtual do Azure.