Como implantar servidores da Web do IIS com balanceamento de carga

Este tutorial é a terceira parte de uma série que ajuda a implantar uma arquitetura do Windows altamente disponível com o Microsoft Active Directory, o SQL Server e os Serviços de Informações da Internet (IIS). Neste tutorial, você configura dois servidores da Web do IIS que são executados em diferentes zonas dentro da mesma região. Em seguida, conecte os servidores da Web ao grupo de disponibilidade do SQL Server e aos controladores de domínio. Ao configurar os servidores da Web por trás de um balanceador de carga, você reduz a carga dos servidores individuais. Você também pode manter o app em execução se um dos servidores ficar off-line.

A série consiste nestes tutoriais:

Você configura um controlador de domínio e uma instância do SQL Server em um projeto do Google Cloud. Cada componente nesta implantação também foi projetado para se integrar com segurança à autenticação do Windows fornecida pelos controladores de domínio.

A arquitetura descrita neste tutorial foi projetada para ser executada no Google Cloud. No entanto, alguns componentes, como o Active Directory e o SQL Server, podem ser executados no local. Este tutorial aborda apenas o cenário de execução de todos os componentes no Google Cloud.

Objetivos

  • Criar duas sub-redes da rede abrangendo duas zonas.
  • Implantar uma máquina virtual (VM) do Microsoft SQL Server em cada zona.
  • Configurar cada instância do SQL Server para participar do domínio do Active Directory.
  • Criar um cluster de failover do Windows Server.
  • Criar e configurar um banco de dados de amostra da estante do SQL Server.
  • Configurar o grupo de disponibilidade "Sempre ativada" do SQL Server.

Custos

Neste tutorial, você continuará usando os recursos do Google Cloud que configurou nos tutoriais anteriores. Você usa os seguintes componentes faturáveis:

A calculadora de preços estima o custo desse ambiente em cerca de US$ 4 por dia.

Antes de começar

Para a configuração usada neste tutorial, é preciso que você tenha acesso a um controlador de domínio do Windows e a um domínio ativo do Active Directory. Se você ainda não tiver esse ambiente, conclua as etapas nos seguintes tutoriais:

Para partes deste tutorial, você executará tarefas em uma estação de trabalho do Windows. Pode ser seu computador local. Ele não precisa estar dentro da rede VPC que você usa para os servidores da Web do IIS. Verifique se a estação de trabalho tem o seguinte instalado:

Inicializar variáveis comuns

Na primeira parte desta série, você definiu variáveis que controlam onde os elementos da infraestrutura são implantados no Google Cloud. Verifique se as variáveis ainda estão definidas corretamente e se correspondem aos valores definidos anteriormente.

  1. Abra o Cloud Shell.

    Abra o Cloud Shell

  2. No Cloud Shell, crie as variáveis de ambiente a seguir para definir valores de que você precisará posteriormente no tutorial.

    Os comandos definem a região como us-east1. Se você usou uma região diferente nos tutoriais anteriores, altere-a nesse script para corresponder à região que você usou antes.

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

    Substitua your-project-id pelo ID do projeto do Cloud que você está usando.

Como criar a infraestrutura de rede

Nesta seção, adicione sub-redes à rede de nuvem privada virtual (VPC). Você criou a rede VPC em um tutorial anterior. Essas sub-redes oferecem intervalos de endereços IP exclusivos que são alocados para as instâncias do servidor da Web e que podem oferecer políticas de firewall opcionais com base nas sub-redes.

  1. No Cloud Shell, adicione uma sub-rede à rede VPC:

    gcloud compute networks subnets create public-webapp-zone \
        --network $vpc_name \
        --region $region \
        --range 10.5.0.0/24 \
        --project $project_id
    
  2. Crie uma regra de firewall interna para permitir o tráfego entre endereços IP internos:

    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
    

Como iniciar os servidores da Web

Você usa uma imagem do Google Cloud Marketplace para provisionar seus servidores da Web. Depois de provisionar os servidores da Web, você poderá usá-los como destinos para implantar apps da Web.

Criar o primeiro servidor

  1. Acesse o Google Cloud Marketplace.

    Acesse o Google Cloud Marketplace

  2. No Console do Google Cloud, selecione o projeto do Cloud em que você quer que o servidor da Web seja executado. Como este tutorial se baseia no conjunto anterior, use o mesmo projeto que você usou nos tutoriais anteriores.

  3. Defina os seguintes valores na página:

    • Nome da implantação: webserver1
    • Zona: zone_1
    • Versão do sistema operacional Windows Server: 201
    • Tipo de inicialização: disco permanente SSD
    • Tamanho do disco: 200 GB
    • Nome da rede: vpc_name
    • Nome da sub-rede: public-webapp-zone
    • Firewall: Permitir tráfego do WebDeploy, Permitir tráfego HTTP

    Substitua zone_1 e vpc_name pelos valores que você usou ao inicializar variáveis anteriormente.

  4. Clique em Implantar e aguarde o Console do Cloud indicar que a implantação foi concluída.

Conectar-se à instância do servidor

  1. No Cloud Shell, crie uma senha para a instância webserver1:

    gcloud compute reset-windows-password webserver1 \
        --zone $zone_1 \
        --project $project_id \
        --quiet
    
  2. Conecte-se à nova instância do Windows usando o Remote Desktop Protocol (RDP). Use as credenciais que você criou na etapa anterior.

Configurar a instância do servidor

  1. Na instância webserver1, abra o terminal do PowerShell como administrador.

  2. Defina variáveis para os endereços IP do DNS e para o nome de domínio:

    $DNS1 = "10.1.0.100"
    $DNS2 = "10.2.0.100"
    $DomainName = "example-gcp.com"
    
  3. Crie uma conta de serviço local chamada webapp.service, que você usará posteriormente para publicar o app da Web:

    net user webapp.service * /add
    

    Quando solicitado, insira uma senha. Use uma senha forte e armazene-a em um local seguro para uso futuro.

  4. Ative a conta e adicione-a ao grupo local Administradores:

    net user webapp.service /active:yes
    net localgroup administrators webapp.service /add
    
  5. Configure os servidores DNS:

    netsh interface ip set dns Ethernet static $DNS1
    netsh interface ip add dns Ethernet $DNS2 index=2
    
  6. Associe o servidor da Web ao domínio example-gcp.com:

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

    Quando solicitado, digite uma senha para a conta de administrador. Esta é a conta de domínio que você usou ao criar uma floresta do Active Directory no primeiro tutorial desta série. Use uma senha forte e armazene-a em um local seguro para uso futuro.

    Ignore a seguinte mensagem de erro:

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

    Restart-Computer
    

    Isso fecha a sessão RDP que você abriu.

Criar a segunda instância do servidor e configurá-la

Agora, repita os procedimentos anteriores para criar uma segunda instância do servidor.

  1. Repita o procedimento para criar o servidor usando os seguintes valores:

    • Nome da implantação: webserver2
    • Zona: zone_2
    • Tipo de máquina: 2 vCPU
    • Versão do sistema operacional Windows Server: 201
    • Tipo de inicialização: disco permanente SSD
    • Tamanho do disco: 200 GB
    • Nome da rede: vpc_name
    • Nome da sub-rede: public-webapp-zone
    • Firewall: Permitir tráfego do WebDeploy, Permitir tráfego HTTP

    Substitua zone_2 e vpc_name pelos valores que você usou ao inicializar variáveis anteriormente.

  2. Crie uma senha para a instância do Windows webserver2:

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

    Esta etapa define a senha da sua conta de usuário para se conectar ao RDP. O nome de usuário é o nome da sua Conta do Google (ou seja, o nome de usuário retornado pelo comando gcloud config get-value core/account). Anote o nome de usuário e a senha para uso posterior neste tutorial.

  3. Conecte-se à instância usando o RDP. Use as credenciais que você criou na etapa anterior.

  4. Conecte-se à instância webserver2. Siga as etapas usadas para a primeira instância, mas use a senha que você criou para a segunda instância do servidor.

  5. Configure a instância webserver2. Siga as etapas usadas para configurar a primeira instância. Crie a mesma conta de serviço usando a mesma senha.

Como clonar o app da Web

A próxima tarefa é configurar cada servidor IIS e implantar um app ASP.NET de amostra nele. O app da Web tem credenciais para se conectar automaticamente à instância do SQL Server configurada no tutorial anterior.

  1. Verifique se você fez login na estação de trabalho do Windows em que o Visual Studio e o Git estão instalados.

  2. Em uma janela de comando na estação de trabalho do Windows, clone o repositório de código-fonte de amostra para a estação de trabalho:

    cd c:\
    git clone https://github.com/GoogleCloudPlatform/getting-started-dotnet.git
    cd getting-started-dotnet
    git checkout ad49d787eec88fb30a4b45b4146f5cb63c0519e
    
  3. Acesse a seguinte pasta:

    C:\getting-started-dotnet\aspnet\2-structured-data
    
  4. Para abrir a solução de app de amostra no Visual Studio, clique duas vezes no arquivo 2-structured-data.sln.

  5. No painel Gerenciador de Soluções, clique duas vezes no arquivo Web.config para abri-lo.

  6. Defina a chave GoogleCloudSamples:ProjectId como o ID do projeto.

    Para o ID do projeto webapp-sql-ad, a linha é semelhante a esta:

    <add key="GoogleCloudSamples:ProjectId" value="webapp-sql-ad" />
    
  7. definir o valor GoogleCloudSamples:BookStore como sqlserver

    <add key="GoogleCloudSamples:BookStore" value="sqlserver" />
    
  8. Próximo ao final do arquivo, em <connectionStrings>, localize o subelemento XML connectionStrings que tem o atributo name="LocalSqlServer". Em seguida, faça o seguinte:

    • Atualize o valor connectionString com o nome do listener do grupo de disponibilidade do SQL Server, que é sql-listener. Você configurou esse listener em Como implantar um SQL Server de várias sub-redes nesta série de tutoriais.
    • Altere Initial Catalog para bookshelf.
    • Defina Integrated Security como True.
    • Use o nome de usuário e a senha de login que você criou para a conta de serviço do banco de dados ao configurar o banco de dados.
  9. Salve e feche o arquivo Web.config.

  10. Para criar a solução, no menu do Visual Studio, clique em Compilar > Compilar solução.

Como implantar o app ASP.NET

Nesta seção, você implantará o app da Web nos dois servidores da Web.

  1. Na estação de trabalho, se você fechou o arquivo 2-structured-data.sln, abra-o novamente. Encontre o arquivo na seguinte pasta e clique duas vezes nele:

    C:\getting-started-dotnet\aspnet\2-structured-data
    
  2. No Visual Studio, clique em Ferramentas, Ferramentas do Google Cloud e Cloud Explorer.

  3. Selecione o projeto em que você está trabalhando e expanda o Google Compute Engine.

  4. Clique com o botão direito do mouse na instância webserver1.

  5. Selecione Gerenciar credenciais do Windows.

  6. Clique em Adicionar credenciais.

  7. Digite o nome de usuário webapp.service.

  8. Selecione Tenho senha para este usuário e digite a senha criada anteriormente quando você iniciou os servidores da Web.

  9. Verifique se a opção Criar uma senha para mim não está selecionada e clique em Salvar.

  10. Para fechar a janela "Credenciais do Windows", clique em Fechar.

  11. Feche o Google Cloud Explorer.

  12. No Visual Studio, clique em Ferramentas, Ferramentas do Google Cloud, Publicar dados estruturados no Google Cloud.

  13. Na caixa de diálogo Publicar, selecione Compute Engine.

  14. Selecione a VM webserver1 e defina Credenciais como webapp.service.

  15. Para criar e implantar o app de amostra, clique em Publicar.

    Depois que o app de amostra é publicado, o Visual Studio abre o app no navegador da Web padrão.

  16. Repita esse procedimento para webserver2.

Como configurar o balanceamento de carga

Agora configure o balanceamento de carga de rede para os servidores da Web. Como parte desse procedimento, você adiciona a verificação de integridade ao balanceador de carga. O balanceador de carga global distribui as solicitações entre os servidores IIS automaticamente. Além disso, se um dos servidores IIS falhar nas verificações de integridade e estiver off-line, o balanceador de carga direcionará automaticamente o tráfego para o outro servidor.

  1. No Cloud Shell, crie um endereço IP externo estático para o balanceador de carga:

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

    As instâncias de VM recebem pacotes destinados a esse endereço IP.

  2. Adicione um objeto de verificação de integridade de HTTP.

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

    Este exemplo usa as configurações padrão do mecanismo de verificação de integridade. Personalize essas configurações. Você especifica o caminho da solicitação /Books porque esse é o caminho usado pelo app da Web de amostra.

  3. Adicione um pool de destino que esteja na mesma região das instâncias de VM. Os pools de destino exigem um serviço de verificação de integridade para funcionar. use o objeto de verificação de integridade criado na etapa 2 para esse pool de destino.

    gcloud compute target-pools create books-lb \
        --region $region \
        --http-health-check bookshelf-check \
        --project $project_id
    
  4. Adicione as instâncias do servidor IIS ao pool 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
    

    As instâncias em um pool de destino precisam estar na mesma região. No entanto, as instâncias podem estar em zonas diferentes na mesma região.

  5. Adicione uma regra de encaminhamento em nome de um endereço IP externo e um intervalo de portas que aponte para o pool de destino:

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

Como enviar tráfego às instâncias

Depois que o serviço de balanceamento de carga estiver configurado, comece a enviar tráfego para o balanceador de carga.

  1. Aguarde pelo menos um minuto depois de configurar o balanceamento de carga para permitir que a configuração seja totalmente carregada.
  2. No Cloud Shell, verifique a integridade das instâncias no balanceador de carga:

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

    A saída será assim:

    ---
    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. Copie o valor ipAddress, que é o endereço IP do balanceador de carga.

  4. Em uma janela do navegador, insira o endereço IP do balanceador de carga.

    Se tudo estiver funcionando, você verá a página padrão do app da Web ASP.NET implantado:

    Página da Web padrão do app Bookshelf.

Como testar balanceamento de carga e redundância

Agora é possível verificar como o cluster se comporta quando os componentes são colocados off-line. Teste o balanceamento de carga e a redundância em vários níveis encerrando seletivamente uma instância do Active Directory, do SQL Server e dos servidores IIS.

  1. No Console do Cloud, acesse a página de instâncias de VM:

    Acessar a página "Instâncias de VM"

  2. Selecione uma instância para o Active Directory, para o SQL Server ou para o IIS. Escolha qualquer uma dessas instâncias para simular um componente que fique off-line.

    Lista de imagens que foram criadas para essa arquitetura.

  3. Clique em Interromper.

  4. Em uma janela do navegador, insira o endereço IP do balanceador de carga novamente.

    Você verá a página padrão do app Bookshelf. Isso indica que o app ainda está em execução, embora os componentes da infraestrutura não estejam mais disponíveis.

  5. Como opção, repita as etapas 2 e 3 para outros componentes. Por exemplo, se você encerrou a instância do SQL Server anteriormente, encerre uma instância do IIS desta vez.

    Enquanto uma instância de cada componente estiver em execução, o app continuará funcionando.

Limpar

Depois de concluir o tutorial, limpe os recursos do Google Cloud criados para garantir que não seja cobrado por eles no futuro. Exclua todo o projeto ou os recursos. Nas seções a seguir, descrevemos como excluir esses recursos.

Excluir o projeto

  • No Console do Cloud, acesse a página Gerenciar recursos:

    Acessar "Gerenciar recursos"

  • Na lista de projetos, selecione o projeto que você quer excluir e clique em Excluir .
  • Na caixa de diálogo, digite o ID do projeto e clique em Encerrar para excluí-lo.
  • Como excluir os recursos do projeto

    No início do tutorial, você definiu variáveis que controlam onde os elementos da infraestrutura são implantados. Você usa essas variáveis nesta seção para limpeza. Verifique se as seguintes variáveis estão definidas:

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

    Substitua your-project-id pelo ID do projeto do Cloud que você está usando.

    1. Exclua as VMs que você criou neste tutorial:

      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. Exclua as regras de firewall e as rotas que você criou neste tutorial:

      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. Exclua as sub-redes na rede 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. Exclua a rede VPC:

      gcloud compute networks delete $vpc_name \
          --project $project_id \
          --quiet
      
    5. Exclua o endereço IP estático do balanceador de carga que você criou:

      gcloud compute addresses delete webapp-lb-ip \
          --region $region \
          --project $project_id \
          --quiet
      
    6. Exclua a infraestrutura do balanceador de carga:

      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
      

    A seguir