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:
- Implementa un entorno de Microsoft Active Directory tolerante a errores
- Implementa SQL Server de varias subredes
- Implementa servidores web IIS con balanceo de cargas (este documento)
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:
- Implementa un entorno de Microsoft Active Directory tolerante a errores
- Implementa SQL Server de varias subredes
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:
- Visual Studio 2013 o posterior
- Git
- Tools for Visual Studio. Puedes descargar estas herramientas desde la página vinculada.
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.
Abre Cloud Shell
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 Google 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.
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
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
Ve a Google Cloud Marketplace.
En Google Cloud Console, selecciona el proyecto de Google 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.
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.
- Nombre de la implementación:
Haz clic en Implementar y espera a que la consola de Google Cloud indique que se completó la implementación.
Conéctate a la instancia del servidor
En Cloud Shell, crea una contraseña para la instancia
webserver1
:gcloud compute reset-windows-password webserver1 \ --zone $zone_1 \ --project $project_id \ --quiet
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
En la instancia
webserver1
, abre la terminal de PowerShell como administrador.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"
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.
Habilita la cuenta y agrégala al grupo administradores locales:
net user webapp.service /active:yes net localgroup administrators webapp.service /add
Configura los servidores DNS:
netsh interface ip set dns Ethernet static $DNS1 netsh interface ip add dns Ethernet $DNS2 index=2
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.
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.
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.
- Nombre de la implementación:
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.Conéctate a la instancia mediante RDP. Usa las credenciales que creaste en el paso anterior.
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.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.
Asegúrate de haber accedido a la estación de trabajo de Windows en la que están instalados Visual Studio y Git.
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
Ve a la siguiente carpeta:
C:\getting-started-dotnet\aspnet\2-structured-data
Para abrir la solución de la app de muestra en Visual Studio, haz doble clic en el archivo
2-structured-data.sln
.En el panel Explorador de soluciones, haz doble clic en el archivo
Web.config
para abrirlo.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" />
Establece el valor
GoogleCloudSamples:BookStore
ensqlserver
:<add key="GoogleCloudSamples:BookStore" value="sqlserver" />
Cerca del final del archivo, en
<connectionStrings>
, busca el subelemento XMLconnectionStrings
que tiene el atributoname="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 essql-listener
. (Configuraste este objeto de escucha en Implementa un SQL Server de varias subredes de esta serie de instructivos). - Cambia
Initial Catalog
abookshelf
. - Establece
Integrated Security
enTrue
. - 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.
- Actualiza el valor
Guarda el archivo
Web.config
y ciérralo.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.
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
En Visual Studio, haz clic en Herramientas > Herramientas de Google Cloud > Google Cloud Explorer.
Selecciona el proyecto en el que estás trabajando y, luego, expande Google Compute Engine.
Haz clic con el botón derecho en la instancia
webserver1
.Selecciona Administrar credenciales de Windows.
Haz clic en Agregar credenciales.
Ingresa el nombre de usuario
webapp.service
.Selecciona Tengo contraseña para este usuario y, luego, ingresa la contraseña que creaste antes cuando iniciaste los servidores web.
Verifica que la opción Crear una contraseña para mí no esté seleccionada y, luego, haz clic en Guardar.
Para cerrar la ventana Credenciales de Windows, haz clic en Cerrar.
Cierra Google Cloud Explorer.
En Visual Studio, haz clic en Herramientas > Herramientas de Google Cloud > Publicar 2 datos estructurados en Google Cloud.
En el cuadro de diálogo Publicar, selecciona Compute Engine.
Selecciona la VM
webserver1
y, luego, establece Credenciales enwebapp.service
.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.
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.
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.
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.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
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.
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.
- Espera al menos un minuto después de configurar el balanceo de cargas para permitir que la configuración se cargue por completo.
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
Copia el valor
ipAddress
, que es la dirección IP del balanceador de cargas.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:
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.
En la consola de Google Cloud, ve a la página Instancias de VM.
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.
Haz clic en Stop (Detener).
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.
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.
Limpia
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
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 Google Cloud que usas.
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
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
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
Borra la red de VPC
gcloud compute networks delete $vpc_name \ --project $project_id \ --quiet
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
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?
- Revisa las prácticas recomendadas para diseñar cargas de trabajo escalables y con alta disponibilidad.
- Explora arquitecturas de referencia, diagramas y prácticas recomendadas sobre Google Cloud. Consulta nuestro Cloud Architecture Center.