Implementa servidores web IIS con balanceo de cargas

Este instructivo es la tercera parte de una serie que te ayuda a implementar una arquitectura de Windows con alta disponibilidad mediante Microsoft Active Directory, Internet Information Services (IIS) y SQL Server. En este instructivo, configuras dos servidores web IIS que se ejecutan en diferentes zonas dentro de la misma región. Luego, conecta los servidores web a los controladores de dominio y al grupo de disponibilidad de SQL Server. Cuando configuras los servidores web tras un balanceador de cargas, se reduce la carga a los servidores individuales. También puedes mantener la app en ejecución si uno de los servidores se desconecta.

La serie consta de estos instructivos:

Configura un controlador de dominio y una instancia de SQL Server en un proyecto de Google Cloud. Cada componente de esta implementación también está diseñado para integrarse de manera segura a la autenticación de Windows que proporcionan los controladores de dominio.

La arquitectura que se describe en este instructivo está diseñada para ejecutarse en Google Cloud. Sin embargo, algunos componentes, como Active Directory y SQL Server, podrían ejecutarse de forma local. En este instructivo, solo se aborda la situación de ejecución de todos los componentes en Google Cloud.

Objetivos

  • Crear dos subredes de red que abarquen dos zonas.
  • Implementar una máquina virtual (VM) de Microsoft SQL Server en cada zona.
  • Configurar cada instancia de SQL Server para unirlas a tu dominio de Active Directory.
  • Crear un clúster de conmutación por error en Windows Server.
  • Crear y configurar una base de datos de estantería de muestra de SQL Server.
  • Configurar el grupo de disponibilidad Always On de SQL Server.

Costos

En este instructivo, seguirás usando los recursos de Google Cloud que configuraste en instructivos anteriores. Usarás los siguientes componentes facturables:

La calculadora de precios estima un costo de cerca de $4 por día para este entorno.

Antes de comenzar

Para la configuración que usarás en este instructivo, se requiere que tengas acceso a un controlador de dominio de Windows y a un dominio de Active Directory en funcionamiento. Si aún no tienes este entorno, completa los pasos de los siguientes instructivos:

En algunas partes de este instructivo, realizarás tareas en una estación de trabajo de Windows. Puede ser tu computadora local. No tiene que estar dentro de la red de VPC que usas para los servidores web IIS. Asegúrate de que la estación de trabajo tenga instalado lo siguiente:

Inicializa variables comunes

En la primera parte de esta serie, definiste variables que controlan dónde se implementan los elementos de la infraestructura en Google Cloud. Verifica que las variables estén configuradas de forma correcta y que coincidan con los valores que estableciste antes.

  1. Abre Cloud Shell

    Abra Cloud Shell

  2. En Cloud Shell, crea las siguientes variables de entorno a fin de fijar valores que necesitarás más adelante en este instructivo.

    Los comandos establecen la región como us-east1. Si usaste una región diferente en los instructivos anteriores, cambia la región en esta secuencia de comandos para que coincida con la que usaste antes.

    region=us-east1
    zone_1=${region}-b
    zone_2=${region}-c
    vpc_name=webappnet
    project_id=your-project-id
    

    Reemplaza your-project-id por el ID del proyecto de Cloud que estás usando.

Crea la infraestructura de red

En esta sección, agregarás subredes a la red de nube privada virtual (VPC) existente. (Creaste la red de VPC en un instructivo anterior). Estas subredes ofrecen rangos de direcciones IP únicos que se asignan para las instancias del servidor web y que, luego, pueden ofrecer políticas de firewall opcionales basadas en las subredes.

  1. En Cloud Shell, agrega una subred a la red de VPC existente:

    gcloud compute networks subnets create public-webapp-zone \
        --network $vpc_name \
        --region $region \
        --range 10.5.0.0/24 \
        --project $project_id
    
  2. Crea una regla de firewall interna para permitir el tráfico entre direcciones IP internas:

    gcloud compute firewall-rules create  allow-internal-ports-public-webapp \
        --network $vpc_name \
        --allow tcp:1-65535,udp:1-65535,icmp \
        --source-ranges 10.5.0.0/24 \
        --project $project_id
    

Inicia los servidores web

Usas una imagen de Google Cloud Marketplace para aprovisionar tus servidores web. Después de aprovisionar los servidores web, puedes usarlos como destinos para implementar aplicaciones web.

Crea el primer servidor

  1. Ve a Google Cloud Marketplace.

    Ir a Google Cloud Marketplace

  2. En Google Cloud Console, selecciona el proyecto de Cloud en el que deseas que se ejecute el servidor web. Debido a que este instructivo se basa en el conjunto anterior, usa el mismo proyecto que usaste en los instructivos anteriores.

  3. Establece los siguientes valores en la página:

    • Nombre de la implementación: webserver1
    • Zona: zone_1
    • Versión del SO de Windows Server: 2016
    • Tipo de inicio: disco persistente SSD
    • Tamaño del disco: 200 GB
    • Nombre de la red: vpc_name
    • Nombre de la subred: public-webapp-zone
    • Firewall: Permitir el tráfico de WebDeploy, Permitir el tráfico de HTTP

    Reemplaza zone_1 y vpc_name por los valores que usaste cuando inicializaste las variables antes.

  4. Haz clic en Implementar y espera a que Cloud Console indique que se completó la implementación.

Conéctate a la instancia del servidor

  1. En Cloud Shell, crea una contraseña para la instancia webserver1:

    gcloud compute reset-windows-password webserver1 \
        --zone $zone_1 \
        --project $project_id \
        --quiet
    
  2. Conéctate a la nueva instancia de Windows mediante el protocolo de escritorio remoto (RDP). Usa las credenciales que creaste en el paso anterior.

Configura la instancia del servidor

  1. En la instancia webserver1, abre la terminal de PowerShell como administrador.

  2. Configura las variables para las direcciones IP de DNS y el nombre de dominio:

    $DNS1 = "10.1.0.100"
    $DNS2 = "10.2.0.100"
    $DomainName = "example-gcp.com"
    
  3. Crea una cuenta de servicio local llamada webapp.service, que usarás más adelante para publicar la aplicación web:

    net user webapp.service * /add
    

    Cuando se te solicite, ingresa una contraseña. Usa una contraseña segura y guárdala en una ubicación segura para usarla en el futuro.

  4. Habilita la cuenta y agrégala al grupo administradores locales:

    net user webapp.service /active:yes
    net localgroup administrators webapp.service /add
    
  5. Configura los servidores DNS:

    netsh interface ip set dns Ethernet static $DNS1
    netsh interface ip add dns Ethernet $DNS2 index=2
    
  6. Une el servidor web al dominio example-gcp.com:

    Add-Computer -DomainName $DomainName -Credential (Get-Credential "example\Administrator")
    

    Cuando se te solicite, ingresa una contraseña para la Cuenta de administrador. Esta es la cuenta de dominio que usaste cuando creaste un bosque de Active Directory en el primer instructivo de esta serie. Usa una contraseña segura y guárdala en una ubicación segura para usarla en el futuro.

    Puedes ignorar el siguiente mensaje de error:

    WARNING: The changes will take effect after you restart the computer webserver1.
    
  7. Reinicia la VM:

    Restart-Computer
    

    Esto cierra la sesión de RDP que tienes abierta.

Crea la segunda instancia de servidor y configúrala

Ahora repite los procedimientos anteriores para crear una segunda instancia de servidor.

  1. Repite el procedimiento para crear el servidor con los siguientes valores:

    • Nombre de la implementación: webserver2
    • Zona: zone_2
    • Tipo de máquina: 2 CPU virtuales
    • Versión del SO de Windows Server: 2016
    • Tipo de inicio: disco persistente SSD
    • Tamaño del disco: 200 GB
    • Nombre de la red: vpc_name
    • Nombre de la subred: public-webapp-zone
    • Firewall: Permitir el tráfico de WebDeploy, Permitir el tráfico de HTTP

    Reemplaza zone_2 y vpc_name por los valores que usaste cuando inicializaste las variables antes.

  2. Crea una contraseña para la instancia de Windows webserver2:

    gcloud compute reset-windows-password webserver2 \
        --zone $zone_2\
        --project $project_id \
        --quiet
    

    En este paso, estableces la contraseña de tu cuenta de usuario para conectarte con RDP. El nombre de usuario es el nombre de tu Cuenta de Google (es decir, el nombre de usuario que muestra el comando gcloud config get-value core/account). Toma nota del nombre de usuario y la contraseña para usarlos más adelante en este instructivo.

  3. Conéctate a la instancia mediante RDP. Usa las credenciales que creaste en el paso anterior.

  4. Conéctate a la instancia de webserver2. Sigue los pasos que usaste para la primera instancia, pero usa la contraseña que creaste para la segunda instancia del servidor.

  5. Configura la instancia webserver2 Sigue los pasos que usaste para configurar la primera instancia. Crea la misma cuenta de servicio con la misma contraseña.

Clona la aplicación web

La siguiente tarea es configurar cada servidor IIS y, luego, implementar una app de ASP.NET de muestra en él. La aplicación web tiene credenciales para conectarse de forma automática a la instancia de SQL Server que configuraste en el instructivo anterior.

  1. Asegúrate de haber accedido a la estación de trabajo de Windows en la que están instalados Visual Studio y Git.

  2. En una ventana de comandos en la estación de trabajo de Windows, clona el repositorio de código fuente de muestra en la estación de trabajo:

    cd c:\
    git clone https://github.com/GoogleCloudPlatform/getting-started-dotnet.git
    cd getting-started-dotnet
    git checkout ad49d787eec88fb30a4b45b4146f5cb63c0519e
    
  3. Ve a la siguiente carpeta:

    C:\getting-started-dotnet\aspnet\2-structured-data
    
  4. Para abrir la solución de la app de muestra en Visual Studio, haz doble clic en el archivo 2-structured-data.sln.

  5. En el panel Explorador de soluciones, haz doble clic en el archivo Web.config para abrirlo.

  6. Configura la clave GoogleCloudSamples:ProjectId en el ID del proyecto.

    Para el ID del proyecto webapp-sql-ad, la línea es similar a la siguiente:

    <add key="GoogleCloudSamples:ProjectId" value="webapp-sql-ad" />
    
  7. Establece el valor GoogleCloudSamples:BookStore en sqlserver:

    <add key="GoogleCloudSamples:BookStore" value="sqlserver" />
    
  8. Cerca del final del archivo, en <connectionStrings>, busca el subelemento XML connectionStrings que tiene el atributo name="LocalSqlServer". A continuación, sigue estos pasos:

    • Actualiza el valor connectionString mediante el nombre del objeto de escucha del grupo de disponibilidad de SQL Server, que es sql-listener. (Configuraste este objeto de escucha en Implementa un SQL Server de varias subredes de esta serie de instructivos).
    • Cambia Initial Catalog a bookshelf.
    • Establece Integrated Security en True.
    • Usa el nombre de usuario y la contraseña de acceso que creaste para la cuenta de servicio de base de datos cuando configuraste la base de datos.
  9. Guarda el archivo Web.config y ciérralo.

  10. Para compilar la solución, en el menú de Visual Studio, haz clic en Compilación > Compilación de la solución.

Implementa la app de ASP.NET

En esta sección, implementas la aplicación web en ambos servidores web.

  1. En la estación de trabajo, si cerraste el archivo 2-structured-data.sln, vuelve a abrirlo. Busca el archivo en la siguiente carpeta y haz doble clic en él:

    C:\getting-started-dotnet\aspnet\2-structured-data
    
  2. En Visual Studio, haz clic en Herramientas > Herramientas de Google Cloud > Google Cloud Explorer.

  3. Selecciona el proyecto en el que estás trabajando y, luego, expande Google Compute Engine.

  4. Haz clic con el botón derecho en la instancia webserver1.

  5. Selecciona Administrar credenciales de Windows.

  6. Haz clic en Agregar credenciales.

  7. Ingresa el nombre de usuario webapp.service.

  8. Selecciona Tengo contraseña para este usuario y, luego, ingresa la contraseña que creaste antes cuando iniciaste los servidores web.

  9. Verifica que la opción Crear una contraseña para mí no esté seleccionada y, luego, haz clic en Guardar.

  10. Para cerrar la ventana Credenciales de Windows, haz clic en Cerrar.

  11. Cierra Google Cloud Explorer.

  12. En Visual Studio, haz clic en Herramientas > Herramientas de Google Cloud > Publicar 2 datos estructurados en Google Cloud.

  13. En el cuadro de diálogo Publicar, selecciona Compute Engine.

  14. Selecciona la VM webserver1 y, luego, establece Credenciales en webapp.service.

  15. Para compilar y, luego, implementar la aplicación de ejemplo, haz clic en Publicar.

    Una vez que se publica la app de muestra, Visual Studio la abre en tu navegador web predeterminado.

  16. Repite este procedimiento para webserver2.

Configura el balanceo de cargas

Ahora puedes configurar el balanceo de cargas de red para los servidores web. Como parte de este procedimiento, agregas una verificación de estado al balanceador de cargas. El balanceador de cargas global reparte las solicitudes entre los servidores IIS de forma automática. Además, si uno de los servidores IIS falla las verificaciones de estado y se encuentra sin conexión, el balanceador de cargas dirige el tráfico al otro servidor de manera automática.

  1. En Cloud Shell, crea una dirección IP externa estática para el balanceador de cargas:

    gcloud compute addresses create webapp-lb-ip \
        --region $region \
        --project $project_id
    

    Las instancias de VM reciben paquetes destinados a esta dirección IP.

  2. Agrega un objeto de verificación de estado HTTP:

    gcloud compute http-health-checks create bookshelf-check \
        --project $project_id \
        --request-path /Books
    

    En este ejemplo, se usa la configuración predeterminada para el mecanismo de verificación de estado. Puedes personalizar esta configuración. Debes especificar la ruta de acceso de la solicitud /Books porque esa es la ruta de acceso que usa la aplicación web de muestra.

  3. Agrega un grupo de destino que esté en la misma región que las instancias de VM. Los grupos de destino requieren un servicio de verificación de estado para funcionar. Usa el objeto de verificación de estado que creaste en el paso 2 para este grupo de destino.

    gcloud compute target-pools create books-lb \
        --region $region \
        --http-health-check bookshelf-check \
        --project $project_id
    
  4. Agrega las instancias del servidor IIS al grupo de destino:

    gcloud compute target-pools add-instances books-lb \
        --instances webserver1 \
        --instances-zone $zone_1 \
        --project $project_id
    
    gcloud compute target-pools add-instances books-lb \
        --instances webserver2 \
        --instances-zone $zone_2 \
        --project $project_id
    

    Las instancias dentro de un grupo de destino deben estar en la misma región. Sin embargo, las instancias pueden estar en diferentes zonas en la misma región.

  5. Agrega una regla de reenvío en nombre de una dirección IP externa y un rango de puertos que apunte a tu grupo de destino:

    gcloud compute forwarding-rules create www-rule \
        --region $region \
        --ports 80 \
        --address webapp-lb-ip \
        --target-pool books-lb \
        --project $project_id
    

Envía tráfico a las instancias

Después de configurar el servicio de balanceo de cargas, puedes comenzar a enviar tráfico al balanceador de cargas.

  1. Espera al menos un minuto después de configurar el balanceo de cargas para permitir que la configuración se cargue por completo.
  2. En Cloud Shell, verifica el estado de las instancias dentro del balanceador de cargas:

    gcloud compute target-pools get-health books-lb \
        --region $region \
        --project $project_id
    

    El resultado es similar a este:

    ---
    healthStatus:
    - healthState: HEALTHY
    instance: https://www.googleapis.com/compute/v1/projects/sales-enablement-support/zones/us-east1-c/instances/webserver1
    ipAddress: 35.190.170.76
    kind: compute#targetPoolInstanceHealth
    ---
    healthStatus:
    - healthState: HEALTHY
    instance: https://www.googleapis.com/compute/v1/projects/sales-enablement-support/zones/us-east1-b/instances/webserver2
    ipAddress: 35.190.170.76
    
  3. Copia el valor ipAddress, que es la dirección IP del balanceador de cargas.

  4. En una ventana del navegador, ingresa la dirección IP del balanceador de cargas.

    Si todo funciona, verás la página predeterminada de la aplicación web de ASP.NET que implementaste:

    Página web predeterminada para la app de Bookshelf.

Prueba el balanceo de cargas y la redundancia

Ahora puedes verificar cómo se comporta el clúster cuando los componentes se desconectan. Puedes probar el balanceo de cargas y la redundancia en varios niveles si cierras de forma selectiva una instancia de Active Directory, SQL Server y los servidores IIS.

  1. En Cloud Console, ve a la página Instancias de VM:

    Ir a la página Instancias de VM

  2. Selecciona una instancia para Active Directory, SQL Server o IIS. Puedes elegir cualquiera de estas instancias para simular un componente que se queda sin conexión.

    Lista de imágenes que se crearon para esta arquitectura.

  3. Haz clic en Stop (Detener).

  4. En una ventana del navegador, vuelve a ingresar la dirección IP del balanceador de cargas.

    Verás la página predeterminada de la app de Bookshelf. Esto indica que la app aún se está ejecutando a pesar de que los componentes de la infraestructura ya no están disponibles.

  5. De manera opcional, repite los pasos 2 y 3 para otros componentes. Por ejemplo, si antes cerraste una instancia de SQL Server, esta vez cierra una instancia de IIS.

    Mientras una instancia de cada componente esté en ejecución, la app seguirá funcionando.

Realiza una limpieza

Una vez que hayas terminado el instructivo, puedes limpiar los recursos de Google Cloud que creaste para asegurarte de no se te facturarán en el futuro. Puedes borrar todo el proyecto o los recursos. En las siguientes secciones, se describe cómo borrar estos recursos.

Borra el proyecto

  • En Cloud Console, ve a la página Administrar recursos.

    Ir a Administrar recursos

  • En la lista de proyectos, elige el proyecto que quieres borrar y haz clic en Borrar.
  • En el diálogo, escribe el ID del proyecto y, luego, haz clic en Cerrar para borrar el proyecto.
  • Borra los recursos dentro del proyecto

    Al comienzo del instructivo, definiste variables que controlan dónde se implementan los elementos de la infraestructura. Usarás esas variables en esta sección para la limpieza. Asegúrate de que las siguientes variables estén configuradas:

    region=us-east1
    zone_1=${region}-b
    zone_2=${region}-c
    vpc_name=webappnet
    project_id=your-project-id
    

    Reemplaza your-project-id por el ID del proyecto de Cloud que usas.

    1. Borra las VM que creaste en este instructivo:

      gcloud compute instances delete ad-dc1 \
          --zone $zone_1 \
          --project $project_id \
          --quiet
      
      gcloud compute instances delete ad-dc2 \
          --zone $zone_2 \
          --project $project_id \
          --quiet
      
      gcloud compute instances delete cluster-sql1 \
          --zone $zone_1 \
          --project $project_id \
          --quiet
      
      gcloud compute instances delete cluster-sql2 \
          --zone $zone_2 \
          --project $project_id \
          --quiet
      
      gcloud compute instances delete webserver1 \
          --zone $zone_1 \
          --project $project_id \
          --quiet
      
      gcloud compute instances delete webserver2 \
          --zone $zone_2 \
          --project $project_id \
          --quiet
      
    2. Borra las reglas de firewall y las rutas que creaste en este instructivo:

      gcloud compute firewall-rules delete \
          allow-internal-ports-private-ad \
          allow-internal-ports-private-sql \
          allow-internal-ports-public-webapp \
          allow-rdp \
        --project $project_id \
        --quiet
      
      gcloud compute firewall-rules delete \
          webserver1-tcp-80 \
          webserver1-tcp-8172 \
          webserver2-tcp-80 \
          webserver2-tcp-8172 \
        --project $project_id \
        --quiet
      
      gcloud compute routes delete \
          cluster-sql1-route \
          cluster-sql1-route-listener \
          cluster-sql2-route \
          cluster-sql2-route-listener \
        --project $project_id \
        --quiet
      
    3. Borra las subredes en la red de VPC:

      gcloud compute networks subnets delete \
          --region $region \
          private-ad-zone-a \
          private-ad-zone-b \
          private-sql-zone-a \
          private-sql-zone-b \
          public-webapp-zone \
        --project $project_id \
        --quiet
      
    4. Borra la red de VPC

      gcloud compute networks delete $vpc_name \
          --project $project_id \
          --quiet
      
    5. Borra la dirección IP estática del balanceador de cargas que creaste:

      gcloud compute addresses delete webapp-lb-ip \
          --region $region \
          --project $project_id \
          --quiet
      
    6. Borra la infraestructura del balanceador de cargas:

      gcloud compute forwarding-rules delete www-rule \
          --region $region \
          --project $project_id \
          --quiet
      gcloud compute target-pools delete books-lb \
          --region $region \
          --project $project_id \
          --quiet
      gcloud compute http-health-checks delete bookshelf-check \
          --project $project_id \
          --quiet
      

    ¿Qué sigue?