Tutorial: Equilibrio de carga de máquinas virtuales Linux en Azure para crear una aplicación de alta disponibilidad con la CLI de AzureTutorial: Load balance Linux virtual machines in Azure to create a highly available application with the Azure CLI

El equilibrio de carga proporciona un mayor nivel de disponibilidad al distribuir las solicitudes entrantes entre varias máquinas virtuales.Load balancing provides a higher level of availability by spreading incoming requests across multiple virtual machines. En este tutorial, aprenderá sobre los distintos componentes de Azure Load Balancer que distribuyen el tráfico y proporcionan una alta disponibilidad.In this tutorial, you learn about the different components of the Azure load balancer that distribute traffic and provide high availability. Aprenderá a:You learn how to:

  • Creación de un equilibrador de carga de AzureCreate an Azure load balancer
  • Creación del sondeo de estado de un equilibrador de cargaCreate a load balancer health probe
  • Crear reglas de tráfico del equilibrador de cargaCreate load balancer traffic rules
  • Usar cloud-init para crear una aplicación básica de Node.jsUse cloud-init to create a basic Node.js app
  • Crear máquinas virtuales y conectarlas a un equilibrador de cargaCreate virtual machines and attach to a load balancer
  • Ver un equilibrador de carga en acciónView a load balancer in action
  • Agregar y quitar las máquinas virtuales de un equilibrador de cargaAdd and remove VMs from a load balancer

Uso de Azure Cloud ShellUse Azure Cloud Shell

En Azure se hospeda Azure Cloud Shell, un entorno de shell interactivo que puede utilizar mediante el explorador.Azure hosts Azure Cloud Shell, an interactive shell environment that you can use through your browser. Cloud Shell le permite usar bash o PowerShell para trabajar con servicios de Azure.Cloud Shell lets you use either bash or PowerShell to work with Azure services. Puede usar los comandos preinstalados de Cloud Shell para ejecutar el código de este artículo sin tener que instalar nada en su entorno local.You can use the Cloud Shell pre-installed commands to run the code in this article without having to install anything on your local environment.

Para iniciar Azure Cloud Shell:To launch Azure Cloud Shell:

OpciónOption Ejemplo o vínculoExample/Link
Seleccione Probarlo en la esquina superior derecha de un bloque de código.Select Try It in the upper-right corner of a code block. Solo con seleccionar Probar no se copia automáticamente el código en Cloud Shell.Selecting Try It doesn't automatically copy the code to Cloud Shell. Ejemplo de Probarlo para Azure Cloud Shell
Vaya a https://shell.azure.com o seleccione el botón Iniciar Cloud Shell para abrir Cloud Shell en el explorador.Go to https://shell.azure.com or select the Launch Cloud Shell button to open Cloud Shell in your browser. Iniciar Cloud Shell en una nueva ventanaLaunch Cloud Shell in a new window
Seleccione el botón Cloud Shell en la barra de menús de la esquina superior derecha de Azure Portal.Select the Cloud Shell button on the top-right menu bar in the Azure portal. Botón Cloud Shell en Azure Portal

Para ejecutar el código de este artículo en Azure Cloud Shell:To run the code in this article in Azure Cloud Shell:

  1. Abra Cloud Shell.Open Cloud Shell.
  2. Seleccione el botón Copiar de un bloque de código para copiar el código.Select the Copy button on a code block to copy the code.
  3. Pegue el código en la sesión de Cloud Shell con Ctrl+Mayús+V en Windows y Linux, o Cmd+Mayús+V en macOS.Paste the code into the Cloud Shell session with Ctrl+Shift+V on Windows and Linux, or Cmd+Shift+V on macOS.
  4. Presione ENTRAR para ejecutar el código.Press Enter to run the code.

Si decide instalar y usar la CLI localmente, en este tutorial es preciso que ejecute la CLI de Azure de la versión 2.0.30, u otra posterior.If you choose to install and use the CLI locally, this tutorial requires that you are running the Azure CLI version 2.0.30 or later. Ejecute az --version para encontrar la versión.Run az --version to find the version. Si necesita instalarla o actualizarla, vea Instalación de la CLI de Azure.If you need to install or upgrade, see Install Azure CLI.

Información general sobre Azure Load BalancerAzure load balancer overview

Un equilibrador de carga de Azure es un equilibrador de carga de nivel 4 (TCP, UDP) que proporciona una alta disponibilidad mediante la distribución del tráfico entrante entre máquinas virtuales con un estado correcto.An Azure load balancer is a Layer-4 (TCP, UDP) load balancer that provides high availability by distributing incoming traffic among healthy VMs. Un sondeo de estado de equilibrador de carga supervisa un puerto determinado en cada máquina virtual y solo distribuye tráfico a una máquina virtual operativa.A load balancer health probe monitors a given port on each VM and only distributes traffic to an operational VM.

Se define una configuración de IP de front-end que contiene una o varias direcciones IP públicas.You define a front-end IP configuration that contains one or more public IP addresses. Esta configuración de IP de front-end permite que el equilibrador de carga y las aplicaciones sean accesibles a través de Internet.This front-end IP configuration allows your load balancer and applications to be accessible over the Internet.

Las máquinas virtuales se conectarán a un equilibrador de carga mediante su tarjeta de interfaz de red (NIC) virtual.Virtual machines connect to a load balancer using their virtual network interface card (NIC). Para distribuir el tráfico a las máquinas virtuales, un grupo de direcciones de back-end contiene las direcciones IP de las tarjetas de interfaz de red (NIC) virtual conectadas al equilibrador de carga.To distribute traffic to the VMs, a back-end address pool contains the IP addresses of the virtual (NICs) connected to the load balancer.

Para controlar el flujo de tráfico, se definen reglas de equilibrador de carga para determinados puertos y protocolos que se asignan a las máquinas virtuales.To control the flow of traffic, you define load balancer rules for specific ports and protocols that map to your VMs.

Si siguió el tutorial anterior para crear un conjunto de escalado de máquinas virtuales, se creó un equilibrador de carga automáticamente.If you followed the previous tutorial to create a virtual machine scale set, a load balancer was created for you. Todos estos componentes se configuraron automáticamente como parte del conjunto de escalado.All these components were configured for you as part of the scale set.

Creación del equilibrador de carga de AzureCreate Azure load balancer

En esta sección se detalla cómo se puede crear y configurar cada componente del equilibrador de carga.This section details how you can create and configure each component of the load balancer. Antes de poder crear el equilibrador de carga, cree un grupo de recursos con az group create.Before you can create your load balancer, create a resource group with az group create. En el ejemplo siguiente, se crea un grupo de recursos denominado myResourceGroupLoadBalancer en la ubicación eastus:The following example creates a resource group named myResourceGroupLoadBalancer in the eastus location:

az group create --name myResourceGroupLoadBalancer --location eastus

Crear una dirección IP públicaCreate a public IP address

Para obtener acceso a la aplicación en Internet, necesita una dirección IP pública para el equilibrador de carga.To access your app on the Internet, you need a public IP address for the load balancer. Cree una dirección IP pública con az network public-ip create.Create a public IP address with az network public-ip create. En el ejemplo siguiente se crea una dirección IP pública denominada myPublicIP en el grupo de recursos myResourceGroupLoadBalancer:The following example creates a public IP address named myPublicIP in the myResourceGroupLoadBalancer resource group:

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

Creación de un equilibrador de cargaCreate a load balancer

Cree un equilibrador de carga con az network lb create.Create a load balancer with az network lb create. En el ejemplo siguiente se crea un equilibrador de carga llamado myLoadBalancer y se asigna la dirección myPublicIP a la configuración de IP de front-end:The following example creates a load balancer named myLoadBalancer and assigns the myPublicIP address to the front-end IP configuration:

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

Creación de un sondeo de estadoCreate a health probe

Para permitir que el equilibrador de carga supervise el estado de la aplicación, utilice un sondeo de estado.To allow the load balancer to monitor the status of your app, you use a health probe. El sondeo de estado agrega o quita de forma dinámica las máquinas virtuales de la rotación del equilibrador de carga en base a su respuesta a las comprobaciones de estado.The health probe dynamically adds or removes VMs from the load balancer rotation based on their response to health checks. De forma predeterminada, una máquina virtual se quita de la distribución del equilibrador de carga después de dos errores consecutivos en un intervalo de 15 segundos.By default, a VM is removed from the load balancer distribution after two consecutive failures at 15-second intervals. Cree un sondeo de estado en función de un protocolo o una página de comprobación de mantenimiento específica para la aplicación.You create a health probe based on a protocol or a specific health check page for your app.

En el ejemplo siguiente se crea un sondeo de TCP.The following example creates a TCP probe. También se pueden crear sondeos HTTP personalizados para comprobaciones de estado más específicas.You can also create custom HTTP probes for more fine grained health checks. Al usar un sondeo HTTP personalizado, debe crear la página de comprobación de estado, por ejemplo healthcheck.js.When using a custom HTTP probe, you must create the health check page, such as healthcheck.js. El sondeo debe devolver una respuesta HTTP 200 OK para que el equilibrador de carga mantenga el host en rotación.The probe must return an HTTP 200 OK response for the load balancer to keep the host in rotation.

Para crear un sondeo de estado TCP, debe usar el comando az network lb probe create.To create a TCP health probe, you use az network lb probe create. En el ejemplo siguiente se crea un sondeo de TCP denominado myHealthProbe:The following example creates a health probe named myHealthProbe:

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

Creación de una regla de equilibrador de cargaCreate a load balancer rule

Las reglas de equilibrador de carga se utilizan para definir cómo se distribuye el tráfico a las máquinas virtuales.A load balancer rule is used to define how traffic is distributed to the VMs. Se define la configuración de IP front-end para el tráfico entrante y el grupo IP de back-end para recibir el tráfico, junto con el puerto de origen y destino requeridos.You define the front-end IP configuration for the incoming traffic and the back-end IP pool to receive the traffic, along with the required source and destination port. Para asegurarse de que solo las máquinas virtuales correctas reciban tráfico, también hay que definir el sondeo de estado que se va usar.To make sure only healthy VMs receive traffic, you also define the health probe to use.

Cree una regla de equilibrador de carga con az network lb rule create.Create a load balancer rule with az network lb rule create. En el ejemplo siguiente se crea una regla denominada myLoadBalancerRule, se usa el sondeo de estado myHealthProbe y se equilibra el tráfico en el puerto 80:The following example creates a rule named myLoadBalancerRule, uses the myHealthProbe health probe, and balances traffic on port 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 la red virtualConfigure virtual network

Antes de implementar algunas máquinas virtuales y poder probar el equilibrador, cree los recursos de red virtual auxiliares.Before you deploy some VMs and can test your balancer, create the supporting virtual network resources. Para más información sobre las redes virtuales, consulte el tutorial Administración de Azure Virtual Networks.For more information about virtual networks, see the Manage Azure Virtual Networks tutorial.

Crear recursos de redCreate network resources

Cree la red virtual con el comando az network vnet create.Create a virtual network with az network vnet create. En el ejemplo siguiente se crea una red virtual denominada myVnet con una subred mySubnet:The following example creates a virtual network named myVnet with a subnet named mySubnet:

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

Para agregar un grupo de seguridad de red, use el comando az network nsg create.To add a network security group, you use az network nsg create. En el ejemplo siguiente se crea un grupo de seguridad de red denominado myNetworkSecurityGroup:The following example creates a network security group named myNetworkSecurityGroup:

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

Cree una regla de grupo de seguridad de red con el comando az network nsg rule create.Create a network security group rule with az network nsg rule create. En el ejemplo siguiente se crea una regla grupo de seguridad de red denominada myNetworkSecurityGroupRule:The following example creates a network security group rule named myNetworkSecurityGroupRule:

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

Las NIC virtuales se crean con el comando az network nic create.Virtual NICs are created with az network nic create. En el ejemplo siguiente se crean tres NIC.The following example creates three virtual NICs. (Una NIC virtual para cada máquina virtual que cree para la aplicación en los pasos siguientes).(One virtual NIC for each VM you create for your app in the following steps). Puede crear NIC virtuales y máquinas virtuales adicionales en cualquier momento y agregarlas al equilibrador de carga:You can create additional virtual NICs and VMs at any time and add them to the load balancer:

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

Tras crear los tres NIC virtuales, continúe con el paso siguiente.When all three virtual NICs are created, continue on to the next step

Creación de máquinas virtualesCreate virtual machines

Creación de cloud-init configCreate cloud-init config

En un tutorial anterior sobre cómo personalizar una máquina virtual Linux en el primer arranque, aprendió a automatizar la personalización de máquinas virtuales con cloud-init.In a previous tutorial on How to customize a Linux virtual machine on first boot, you learned how to automate VM customization with cloud-init. El mismo archivo de configuración cloud-init puede usarse para instalar NGINX y ejecutar una aplicación sencilla Node.js "Hola mundo" en el siguiente paso.You can use the same cloud-init configuration file to install NGINX and run a simple 'Hello World' Node.js app in the next step. Para ver el equilibrador de carga en acción, al final del tutorial accederá a esta sencilla aplicación en un explorador web.To see the load balancer in action, at the end of the tutorial you access this simple app in a web browser.

En el shell actual, cree un archivo denominado "cloud-init.txt" y pegue la siguiente configuración.In your current shell, create a file named cloud-init.txt and paste the following configuration. Por ejemplo, cree el archivo en Cloud Shell, no en la máquina local.For example, create the file in the Cloud Shell not on your local machine. Escriba sensible-editor cloud-init.txt para crear el archivo y ver una lista de editores disponibles.Enter sensible-editor cloud-init.txt to create the file and see a list of available editors. Asegúrese de que todo el archivo cloud-init se copia correctamente, especialmente la primera línea:Make sure that the whole cloud-init file is copied correctly, especially the first line:

#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

Creación de máquinas virtualesCreate virtual machines

Para mejorar la alta disponibilidad de la aplicación, coloque las máquinas virtuales en un conjunto de disponibilidad.To improve the high availability of your app, place your VMs in an availability set. Para más información sobre los conjuntos de disponibilidad, consulte el tutorial anterior Creación de máquinas virtuales de alta disponibilidad.For more information about availability sets, see the previous How to create highly available virtual machines tutorial.

Cree el conjunto de disponibilidad con az vm availability-set create.Create an availability set with az vm availability-set create. En el ejemplo siguiente se crea un conjunto de disponibilidad denominado myAvailabilitySet:The following example creates an availability set named myAvailabilitySet:

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

Ahora puede crear las máquinas virtuales con el comando az vm create.Now you can create the VMs with az vm create. El siguiente ejemplo crea tres máquinas virtuales y genera claves SSH si aún no existen:The following example creates three VMs and generates SSH keys if they do not already exist:

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

Hay tareas en segundo plano que continúan ejecutándose después de que la CLI de Azure vuelve a abrir el símbolo del sistema.There are background tasks that continue to run after the Azure CLI returns you to the prompt. El parámetro --no-wait no espera a que se completen todas las tareas.The --no-wait parameter does not wait for all the tasks to complete. Es posible que tenga que esperar otros dos minutos antes de poder acceder a la aplicación.It may be another couple of minutes before you can access the app. El sondeo de estado del equilibrador de carga detecta automáticamente cuándo la aplicación se está ejecutando en cada máquina virtual.The load balancer health probe automatically detects when the app is running on each VM. Una vez que la aplicación se esté ejecutando, la regla del equilibrador de carga empieza a distribuir el tráfico.Once the app is running, the load balancer rule starts to distribute traffic.

Prueba del equilibrador de cargaTest load balancer

Obtenga la dirección IP pública del equilibrador de carga con az network public-ip show.Obtain the public IP address of your load balancer with az network public-ip show. En el ejemplo siguiente se obtiene la dirección IP de myPublicIP que se ha creado anteriormente:The following example obtains the IP address for myPublicIP created earlier:

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

A continuación, puede escribir la dirección IP pública en un explorador web.You can then enter the public IP address in to a web browser. Recuerde que tendrán que pasar unos minutos para que las máquinas virtuales estén listas antes de que el equilibrador de carga comience a distribuir el tráfico entre ellas.Remember - it takes a few minutes for the VMs to be ready before the load balancer starts to distribute traffic to them. Se muestra la aplicación, incluido el nombre de host de la máquina virtual a la que el equilibrador de carga distribuye el tráfico como en el ejemplo siguiente:The app is displayed, including the hostname of the VM that the load balancer distributed traffic to as in the following example:

Ejecución de la aplicación Node.js

Para ver cómo el equilibrador de carga distribuye el tráfico entre las tres máquinas virtuales que ejecutan la aplicación, puede realizar una actualización forzada del explorador web.To see the load balancer distribute traffic across all three VMs running your app, you can force-refresh your web browser.

Agregar y quitar máquinas virtualesAdd and remove VMs

Puede que tenga que realizar labores de mantenimiento de las máquinas virtuales que ejecutan la aplicación, como la instalación de actualizaciones del sistema operativo.You may need to perform maintenance on the VMs running your app, such as installing OS updates. Para gestionar un aumento de tráfico a la aplicación, tiene que agregar más máquinas virtuales.To deal with increased traffic to your app, you may need to add additional VMs. Esta sección le muestra cómo quitar o agregar una máquina virtual desde el equilibrador de carga.This section shows you how to remove or add a VM from the load balancer.

Eliminación de una máquina virtual del equilibrador de cargaRemove a VM from the load balancer

Puede quitar una máquina virtual del grupo de direcciones de back-end con el comando az network nic ip-config address-pool remove.You can remove a VM from the backend address pool with az network nic ip-config address-pool remove. En el ejemplo siguiente se quita la NIC virtual para myVM2 de myLoadBalancer:The following example removes the virtual NIC for myVM2 from 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 cómo el equilibrador de carga distribuye el tráfico entre las dos máquinas virtuales que quedan ejecutando la aplicación, puede realizar una actualización forzada del explorador web.To see the load balancer distribute traffic across the remaining two VMs running your app you can force-refresh your web browser. Ahora puede realizar tareas de mantenimiento en la máquina virtual, como instalar actualizaciones del sistema operativo o realizar un reinicio de máquina virtual.You can now perform maintenance on the VM, such as installing OS updates or performing a VM reboot.

Para ver una lista de las máquinas virtuales con NIC virtuales conectados al equilibrador de carga, use az network lb address-pool show.To view a list of VMs with virtual NICs connected to the load balancer, use az network lb address-pool show. Consulte y filtre por identificador de NIC virtual de la siguiente manera:Query and filter on the ID of the virtual NIC as follows:

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

El resultado es similar al ejemplo siguiente, que muestra que la NIC virtual de VM 2 ya no forma parte del grupo de direcciones de back-end:The output is similar to the following example, which shows that the virtual NIC for VM 2 is no longer part of the backend address pool:

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

Incorporación de una máquina virtual al equilibrador de cargaAdd a VM to the load balancer

Después de realizar el mantenimiento en una máquina virtual, o si necesita expandir la capacidad, puede agregar una máquina virtual al grupo de direcciones de back-end con el comando az network nic ip-config address-pool add.After performing VM maintenance, or if you need to expand capacity, you can add a VM to the backend address pool with az network nic ip-config address-pool add. En el ejemplo siguiente se agrega la NIC virtual para myVM2 a myLoadBalancer:The following example adds the virtual NIC for myVM2 to 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 comprobar que la NIC virtual está conectada al grupo de direcciones de back-end, vuelva a usar az network lb address-pool show del paso anterior.To verify that the virtual NIC is connected to the backend address pool, use az network lb address-pool show again from the preceding step.

Pasos siguientesNext steps

En este tutorial, ha creado un equilibrador de carga y conectó máquinas virtuales a él.In this tutorial, you created a load balancer and attached VMs to it. Ha aprendido a:You learned how to:

  • Creación de un equilibrador de carga de AzureCreate an Azure load balancer
  • Creación del sondeo de estado de un equilibrador de cargaCreate a load balancer health probe
  • Crear reglas de tráfico del equilibrador de cargaCreate load balancer traffic rules
  • Usar cloud-init para crear una aplicación básica de Node.jsUse cloud-init to create a basic Node.js app
  • Crear máquinas virtuales y conectarlas a un equilibrador de cargaCreate virtual machines and attach to a load balancer
  • Ver un equilibrador de carga en acciónView a load balancer in action
  • Agregar y quitar las máquinas virtuales de un equilibrador de cargaAdd and remove VMs from a load balancer

Prosiga con el siguiente tutorial para aprender más sobre los componentes de red virtual de Azure.Advance to the next tutorial to learn more about Azure virtual network components.