Deployment di server web IIS con bilanciamento del carico


Questo tutorial è la terza parte di una serie che ti aiuta a eseguire il deployment di un'architettura Windows ad alta disponibilità con Microsoft Active Directory, SQL Server e Internet Information Services (IIS). In questo tutorial, configurerai due server web IIS eseguiti in diverse zone all'interno della stessa regione. Quindi connetti i server web al gruppo di disponibilità SQL Server e ai controller di dominio. Configurando i server web dietro un bilanciatore del carico, riduci il carico ai singoli server. Puoi anche mantenere l'app in esecuzione se uno dei server risulta offline.

La serie è costituita da questi tutorial:

Configura un controller di dominio e un'istanza SQL Server su un progetto Google Cloud. Ogni componente di questo deployment è progettato anche per un'integrazione sicura con l'autenticazione di Windows fornita dai controller di dominio.

L'architettura descritta in questo tutorial è progettata per essere eseguita su Google Cloud. Tuttavia, alcuni componenti, come Active Directory e SQL Server, potrebbero essere eseguiti on-premise. Questo tutorial riguarda solo lo scenario di esecuzione di tutti i componenti su Google Cloud.

Obiettivi

  • Crea due subnet di rete che si estendono su due zone.
  • Eseguire il deployment di una macchina virtuale (VM) Microsoft SQL Server in ciascuna zona.
  • Configura ogni istanza SQL Server in modo che entri nel dominio Active Directory.
  • Creare un cluster di failover di Windows Server.
  • Creare e configurare un database di esempio di libreria SQL Server.
  • Configurare il gruppo di disponibilità SQL Server Always On.

Costi

In questo tutorial, continuerà a utilizzare le risorse Google Cloud configurate nei tutorial precedenti. Utilizzi i seguenti componenti fatturabili:

Il Calcolatore prezzi stima il costo di questo ambiente a circa 4 $al giorno.

Prima di iniziare

La configurazione utilizzata in questo tutorial richiede l'accesso a un controller di dominio Windows e un dominio Active Directory funzionante. Se non disponi già di questo ambiente, completa i passaggi dei seguenti tutorial:

Per alcune parti di questo tutorial, esegui le attività su una workstation Windows. Può essere il tuo computer locale; non deve necessariamente essere all'interno della rete VPC che utilizzi per i server web IIS. Assicurati che sulla workstation sia installato quanto segue:

Inizializzazione delle variabili comuni

Nella prima parte di questa serie, hai definito le variabili che controllano dove viene eseguito il deployment degli elementi dell'infrastruttura in Google Cloud. Verifica che le variabili siano ancora impostate correttamente e che corrispondano ai valori che hai impostato in precedenza.

  1. Apri Cloud Shell.

    Apri Cloud Shell

  2. In Cloud Shell, crea le seguenti variabili di ambiente per impostare i valori necessari più avanti nel tutorial.

    I comandi impostano la regione su us-east1. Se hai utilizzato un'area geografica diversa nei tutorial precedenti, modifica l'area geografica in questo script in modo che corrisponda a quella utilizzata in precedenza.

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

    Sostituisci your-project-id con l'ID del progetto Google Cloud che stai utilizzando.

Creazione dell'infrastruttura di rete

In questa sezione aggiungerai le subnet alla rete VPC (Virtual Private Cloud) esistente. Hai creato la rete VPC in un tutorial precedente. Queste subnet offrono intervalli di indirizzi IP univoci allocati per le istanze del server web e in un secondo momento possono offrire criteri firewall facoltativi in base alle subnet.

  1. In Cloud Shell, aggiungi una subnet alla rete VPC esistente:

    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 regola firewall interna per consentire il traffico tra indirizzi IP interni:

    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
    

Avvio dei server web

Utilizzi un'immagine di Google Cloud Marketplace per eseguire il provisioning dei tuoi server web. Dopo aver eseguito il provisioning dei server web, puoi utilizzarli come destinazioni per eseguire il deployment delle app web.

Crea il primo server

  1. Vai a Google Cloud Marketplace.

    Vai a Google Cloud Marketplace

  2. Nella console Google Cloud, seleziona il progetto Google Cloud in cui vuoi eseguire il server web. Poiché questo tutorial si basa sul set precedente, utilizza per questo tutorial lo stesso progetto che hai utilizzato nei tutorial precedenti.

  3. Imposta i seguenti valori nella pagina:

    • Nome deployment: webserver1
    • Zona: zone_1
    • Versione del sistema operativo Windows Server: 2016
    • Tipo di avvio: disco permanente SSD
    • Dimensioni disco: 200 GB
    • Nome rete: vpc_name
    • Nome subnet: public-webapp-zone
    • Firewall: Consenti traffico WebDeploy, Consenti traffico HTTP

    Sostituisci zone_1 e vpc_name con i valori che hai utilizzato durante l'inizializzazione delle variabili.

  4. Fai clic su Esegui il deployment e attendi che la console Google Cloud indichi che il deployment è stato completato.

Connettiti all'istanza server

  1. In Cloud Shell, crea una password per l'istanza webserver1:

    gcloud compute reset-windows-password webserver1 \
        --zone $zone_1 \
        --project $project_id \
        --quiet
    
  2. Connettiti alla nuova istanza di Windows utilizzando il protocollo Remote Desktop Protocol (RDP). Usa le credenziali che hai creato nel passaggio precedente.

Configura l'istanza del server

  1. Sull'istanza webserver1, apri il terminale PowerShell come amministratore.

  2. Imposta le variabili per gli indirizzi IP DNS e per il nome di dominio:

    $DNS1 = "10.1.0.100"
    $DNS2 = "10.2.0.100"
    $DomainName = "example-gcp.com"
    
  3. Crea un account di servizio locale chiamato webapp.service, che utilizzerai in seguito per pubblicare l'app web:

    net user webapp.service * /add
    

    Quando viene richiesto, inserisci una password. Usa una password efficace e conservala in un luogo sicuro per uso futuro.

  4. Attiva l'account e aggiungilo al gruppo locale Amministratore:

    net user webapp.service /active:yes
    net localgroup administrators webapp.service /add
    
  5. Configura i server DNS:

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

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

    Quando viene richiesto, inserisci una password per l'account amministratore. Si tratta dell'account di dominio che hai utilizzato durante la creazione di una foresta Active Directory nel primo tutorial di questa serie. Usa una password efficace e conservala in un luogo sicuro per uso futuro.

    Puoi ignorare il seguente messaggio di errore:

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

    Restart-Computer
    

    La sessione RDP aperta viene chiusa.

Crea la seconda istanza del server e configurala

Ora ripeti le procedure precedenti per creare una seconda istanza di server.

  1. Ripeti la procedura per la creazione del server utilizzando i seguenti valori:

    • Nome deployment: webserver2
    • Zona: zone_2
    • Tipo di macchina: 2 vCPU
    • Versione del sistema operativo Windows Server: 2016
    • Tipo di avvio: disco permanente SSD
    • Dimensioni disco: 200 GB
    • Nome rete: vpc_name
    • Nome subnet: public-webapp-zone
    • Firewall: Consenti traffico WebDeploy, Consenti traffico HTTP

    Sostituisci zone_2 e vpc_name con i valori che hai utilizzato durante l'inizializzazione delle variabili.

  2. Crea una password per l'istanza Windows di webserver2:

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

    Questo passaggio imposta la password per il tuo account utente per la connessione con RDP. Il nome utente è il nome del tuo Account Google (ovvero il nome utente restituito dal comando gcloud config get-value core/account). Prendi nota del nome utente e della password da utilizzare più avanti in questo tutorial.

  3. Connettiti all'istanza utilizzando RDP. Utilizza le credenziali che hai creato nel passaggio precedente.

  4. Connettiti all'istanza webserver2. Segui i passaggi che hai utilizzato per la prima istanza, ma utilizza la password che hai creato per la seconda istanza del server.

  5. Configura l'istanza webserver2. Segui i passaggi che hai utilizzato per la configurazione della prima istanza. Crea lo stesso account di servizio utilizzando la stessa password.

Clonazione dell'app web

L'attività successiva consiste nel configurare ogni server IIS ed eseguirvi il deployment di un'app ASP.NET di esempio. L'app web dispone delle credenziali per connettersi automaticamente all'istanza SQL Server configurata nel tutorial precedente.

  1. Assicurati di aver eseguito l'accesso alla workstation Windows in cui sono installati Visual Studio e Git.

  2. In una finestra di comando sulla workstation Windows, clona il repository del codice sorgente di esempio nella workstation:

    cd c:\
    git clone https://github.com/GoogleCloudPlatform/getting-started-dotnet.git
    cd getting-started-dotnet
    git checkout ad49d787eec88fb30a4b45b4146f5cb63c0519e
    
  3. Vai alla cartella seguente:

    C:\getting-started-dotnet\aspnet\2-structured-data
    
  4. Per aprire la soluzione dell'app di esempio in Visual Studio, fai doppio clic sul file 2-structured-data.sln.

  5. Nel riquadro Esplora soluzioni, fai doppio clic sul file Web.config per aprirlo.

  6. Imposta la chiave GoogleCloudSamples:ProjectId sull'ID progetto.

    Per l'ID progetto webapp-sql-ad, la riga è simile alla seguente:

    <add key="GoogleCloudSamples:ProjectId" value="webapp-sql-ad" />
    
  7. Imposta il valore GoogleCloudSamples:BookStore su sqlserver:

    <add key="GoogleCloudSamples:BookStore" value="sqlserver" />
    
  8. Verso la fine del file, in <connectionStrings>, trova il sottoelemento XML connectionStrings con l'attributo name="LocalSqlServer". Quindi:

    • Aggiorna il valore connectionString con il nome del listener del gruppo di disponibilità SQL Server, che è sql-listener. (Questo set di strumenti è configurato in Deployment di un server SQL con più subnet in questa serie di tutorial.)
    • Modifica Initial Catalog in bookshelf.
    • Imposta Integrated Security su True.
    • Utilizza il nome utente e la password di accesso che hai creato per l'account di servizio di database durante la configurazione del database.
  9. Salva e chiudi il file Web.config.

  10. Per creare la soluzione, nel menu di Visual Studio, fai clic su Build > Build Solution.

Deployment dell'app ASP.NET

In questa sezione eseguirai il deployment dell'app web su entrambi i server web.

  1. Sulla workstation, se hai chiuso il file 2-structured-data.sln, riaprilo. Individua il file nella seguente cartella e fai doppio clic:

    C:\getting-started-dotnet\aspnet\2-structured-data
    
  2. In Visual Studio, fai clic su Strumenti > Strumenti Google Cloud > Google Cloud Explorer.

  3. Seleziona il progetto su cui stai lavorando, quindi espandi Google Compute Engine.

  4. Fai clic con il tasto destro del mouse sull'istanza webserver1.

  5. Seleziona Gestisci le credenziali Windows.

  6. Fai clic su Aggiungi credenziali.

  7. Inserisci il nome utente webapp.service.

  8. Seleziona Ho la password per questo utente, quindi inserisci la password che hai creato in precedenza quando hai avviato i server web.

  9. Verifica che l'opzione Crea una password per me non sia selezionata, quindi fai clic su Salva.

  10. Per chiudere la finestra Credenziali di Windows, fai clic su Chiudi.

  11. Chiudi Google Cloud Explorer.

  12. In Visual Studio, fai clic su Strumenti > Strumenti di Google Cloud > Pubblica dati strutturati 2 in Google Cloud.

  13. Nella finestra di dialogo Pubblica, seleziona Compute Engine.

  14. Seleziona la VM webserver1, quindi imposta Credenziali su webapp.service.

  15. Per creare ed eseguire il deployment dell'app di esempio, fai clic su Pubblica.

    Dopo aver pubblicato l'app di esempio, Visual Studio apre l'app nel browser web predefinito.

  16. Ripeti questa procedura per webserver2.

Configurazione del bilanciamento del carico

Ora puoi configurare il bilanciamento del carico di rete per i server web. Nell'ambito di questa procedura, aggiungi il controllo di integrità al bilanciatore del carico. Il bilanciatore del carico globale distribuisce automaticamente le richieste tra i server IIS. Inoltre, se uno dei server IIS non supera i controlli di integrità ed è offline, il bilanciatore del carico indirizza automaticamente il traffico all'altro server.

  1. In Cloud Shell, crea un indirizzo IP esterno statico per il bilanciatore del carico:

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

    Le istanze VM ricevono i pacchetti destinati a questo indirizzo IP.

  2. Aggiungi un oggetto del controllo di integrità HTTP:

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

    Questo esempio utilizza le impostazioni predefinite per il meccanismo di controllo di integrità. Puoi personalizzare queste impostazioni. Devi specificare il percorso di richiesta /Books perché è il percorso utilizzato dall'app web di esempio.

  3. Aggiungi un pool di destinazione nella stessa area geografica delle istanze VM. I pool di destinazione richiedono un servizio di controllo di integrità per funzionare; utilizza l'oggetto del controllo di integrità che hai creato nel passaggio 2 per questo pool di destinazione.

    gcloud compute target-pools create books-lb \
        --region $region \
        --http-health-check bookshelf-check \
        --project $project_id
    
  4. Aggiungi le istanze del server IIS al pool di destinazione:

    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
    

    Le istanze all'interno di un pool di destinazione devono trovarsi nella stessa regione. Tuttavia, le istanze possono trovarsi in zone diverse nella stessa area geografica.

  5. Aggiungi una regola di forwarding per conto di un indirizzo IP esterno e di un intervallo di porte che indirizzi al tuo pool di destinazione:

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

Invio del traffico alle istanze

Dopo aver configurato il servizio di bilanciamento del carico, puoi iniziare a inviare traffico al bilanciatore del carico.

  1. Attendi almeno un minuto dopo aver configurato il bilanciamento del carico per consentire il caricamento completo della configurazione.
  2. In Cloud Shell, controlla l'integrità delle istanze all'interno del bilanciatore del carico:

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

    L'output è simile al seguente:

    ---
    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 il valore ipAddress, ovvero l'indirizzo IP del bilanciatore del carico.

  4. In una finestra del browser, inserisci l'indirizzo IP del bilanciatore del carico.

    Se tutto funziona correttamente, viene visualizzata la pagina predefinita per l'app web ASP.NET di cui hai eseguito il deployment:

    Pagina web predefinita dell'app Bookshelf.

Test del bilanciamento del carico e della ridondanza

Ora puoi verificare il comportamento del cluster quando i componenti vengono offline. Puoi testare il bilanciamento del carico e la ridondanza a più livelli, disattivando selettivamente l'istanza di Active Directory, SQL Server e i server IIS.

  1. Nella console Google Cloud, vai alla pagina Istanze VM:

    Vai alla pagina Istanze VM

  2. Seleziona un'istanza per Active Directory, SQL Server o IIS. Puoi scegliere una di queste istanze per simulare un componente offline.

    Elenco delle immagini create per questa architettura.

  3. Fai clic su Arresta.

  4. In una finestra del browser, inserisci di nuovo l'indirizzo IP del bilanciatore del carico.

    Viene visualizzata la pagina predefinita dell'app Libri. Ciò indica che l'app è ancora in esecuzione anche se i componenti dell'infrastruttura non sono più disponibili.

  5. Se vuoi, ripeti i passaggi 2 e 3 per gli altri componenti. Ad esempio, se hai chiuso prima l'istanza SQL Server, questa volta dovrai arrestarla.

    Finché un'istanza di ogni componente è in esecuzione, l'app continua a funzionare.

Esegui la pulizia

Dopo aver completato il tutorial, puoi eseguire la pulizia delle risorse Google Cloud che hai creato per assicurarti di non ricevere addebiti in futuro. Puoi eliminare l'intero progetto o le risorse. Le seguenti sezioni descrivono come eliminare queste risorse.

Elimina il progetto

  • Nella console Google Cloud, vai alla pagina Gestisci risorse.

    Vai a Gestisci risorse

  • Nell'elenco dei progetti, seleziona il progetto che vuoi eliminare, quindi fai clic su Elimina.
  • Nella finestra di dialogo, digita l'ID del progetto e fai clic su Chiudi per eliminare il progetto.
  • Eliminazione delle risorse all'interno del progetto

    All'inizio del tutorial, hai definito le variabili che controllano il deployment degli elementi dell'infrastruttura. Utilizza queste variabili in questa sezione per la pulizia. Assicurati che siano impostate le seguenti variabili:

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

    Sostituisci your-project-id con l'ID del progetto Google Cloud che stai utilizzando.

    1. Elimina le VM che hai creato in questo 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. Elimina le regole firewall e le route che hai creato in questo 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. Elimina le subnet nella rete 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. Elimina la rete VPC:

      gcloud compute networks delete $vpc_name \
          --project $project_id \
          --quiet
      
    5. Elimina l'indirizzo IP statico del bilanciatore del carico che hai creato:

      gcloud compute addresses delete webapp-lb-ip \
          --region $region \
          --project $project_id \
          --quiet
      
    6. Elimina l'infrastruttura del bilanciatore del carico:

      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
      

    Passaggi successivi