Esercitazione: Distribuire un'applicazione .NET in un contenitore Windows in Azure Service Fabric

Questa esercitazione mostra come aggiungere un'applicazione ASP.NET esistente a contenitori e assemblarla in un pacchetto come applicazione di Service Fabric. Eseguire i contenitori in locale nel cluster di sviluppo di Service Fabric e quindi distribuire l'applicazione in Azure. L'applicazione salva i dati in modo permanente nel database SQL di Azure.

In questa esercitazione verranno illustrate le procedure per:

  • Aggiungere un'applicazione esistente in un contenitore con Visual Studio
  • Creare un database in Database SQL di Azure
  • Creare un Registro Azure Container
  • Distribuire un'applicazione di Service Fabric in Azure

Nota

È consigliabile usare il modulo Azure Az PowerShell per interagire con Azure. Per iniziare, vedere Installare Azure PowerShell. Per informazioni su come eseguire la migrazione al modulo AZ PowerShell, vedere Eseguire la migrazione di Azure PowerShell da AzureRM ad Az.

Prerequisiti

  1. Se non si ha una sottoscrizione di Azure, creare un account gratuito.
  2. Abilitare le funzionalità di Windows Hyper-V e contenitori.
  3. Installare Docker Desktop per Windows in modo da poter eseguire contenitori in Windows 10.
  4. Installare il runtime di Service Fabric versione 6.2 o successiva e Service Fabric SDK versione 3.1 o versioni successive.
  5. Installare Visual Studio e abilitare i carichi di lavoro sviluppo e ASP.NET e sviluppo Web di Azure.
  6. Installare Azure PowerShell

Scaricare ed eseguire Fabrikam Fiber CallCenter

  1. Scaricare l'applicazione di esempio Fabrikam Fiber CallCenter da GitHub.

  2. Verificare che l'applicazione di Fabrikam Fiber CallCenter venga compilata ed eseguita senza errori. Avviare Visual Studio come amministratore e aprire il file VS2015\FabrikamFiber.CallCenter.sln . Premere F5 per eseguire ed eseguire il debug dell'applicazione.

    Screenshot della home page dell'applicazione Fabrikam Fiber CallCenter in esecuzione nell'host locale. La pagina mostra un dashboard con un elenco di chiamate di supporto.

Creare un database SQL di Azure

Quando si esegue l'applicazione Fabrikam Fiber CallCenter nell'ambiente di produzione, i dati devono essere salvati in modo permanente in un database. Al momento non c'è modo di garantire la persistenza dei dati in un contenitore, pertanto non è possibile archiviare i dati di produzione in SQL Server in un contenitore.

È consigliabile usare database SQL di Azure. Per configurare ed eseguire un database di SQL Server gestito in Azure, eseguire lo script seguente. Modificare le variabili dello script in base alle necessità. clientIP è l'indirizzo IP del computer di sviluppo. Prendere nota del nome del server restituito dallo script.

$subscriptionID="<subscription ID>"

# Sign in to your Azure account and select your subscription.
Login-AzAccount -SubscriptionId $subscriptionID

# The data center and resource name for your resources.
$dbresourcegroupname = "fabrikam-fiber-db-group"
$location = "southcentralus"

# The server name: Use a random value or replace with your own value (do not capitalize).
$servername = "fab-fiber-$(Get-Random)"

# Set an admin login and password for your database.
# The login information for the server.
$adminlogin = "ServerAdmin"
$password = "Password@123"

# The IP address of your development computer that accesses the SQL DB.
$clientIP = "<client IP>"

# The database name.
$databasename = "call-center-db"

# Create a new resource group for your deployment and give it a name and a location.
New-AzResourceGroup -Name $dbresourcegroupname -Location $location

# Create the SQL server.
New-AzSqlServer -ResourceGroupName $dbresourcegroupname `
    -ServerName $servername `
    -Location $location `
    -SqlAdministratorCredentials $(New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $adminlogin, $(ConvertTo-SecureString -String $password -AsPlainText -Force))

# Create the firewall rule to allow your development computer to access the server.
New-AzSqlServerFirewallRule -ResourceGroupName $dbresourcegroupname `
    -ServerName $servername `
    -FirewallRuleName "AllowClient" -StartIpAddress $clientIP -EndIpAddress $clientIP

# Create the database in the server.
New-AzSqlDatabase  -ResourceGroupName $dbresourcegroupname `
    -ServerName $servername `
    -DatabaseName $databasename `
    -RequestedServiceObjectiveName "S0"

Write-Host "Server name is $servername"

Suggerimento

Se si è protetti da un firewall aziendale, l'indirizzo IP del computer di sviluppo potrebbe non essere l'indirizzo IP esposto a Internet. Per verificare che il database abbia l'indirizzo IP corretto per la regola del firewall, passare al portale di Azure e trovare il database nella sezione Database SQL. Fare clic sul relativo nome e, nella sezione Panoramica, fare clic su "Imposta firewall server". "Indirizzo IP del client" è l'indirizzo IP del computer di sviluppo. Verificare che corrisponda all'indirizzo IP nella regola "AllowClient".

Aggiornare il file di configurazione Web

Tornare al progetto FabrikamFiber.Web e aggiornare la stringa di connessione nel file web.config in modo che punti all'istanza di SQL Server nel contenitore. Aggiornare la parte Server della stringa di connessione in modo che corrisponda al nome del server creato dallo script precedente. Il nome dovrebbe essere simile a "fab-fiber-751718376.database.windows.net". Nel codice XML seguente è necessario aggiornare solo l'attributo connectionString; gli attributi providerName e name non devono essere cambiati.

<add name="FabrikamFiber-Express" connectionString="Server=<server name>,1433;Initial Catalog=call-center-db;Persist Security Info=False;User ID=ServerAdmin;Password=Password@123;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;" providerName="System.Data.SqlClient" />
<add name="FabrikamFiber-DataWarehouse" connectionString="Server=<server name>,1433;Initial Catalog=call-center-db;Persist Security Info=False;User ID=ServerAdmin;Password=Password@123;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;" providerName="System.Data.SqlClient" />
  

Nota

Per il debug locale è possibile usare un'istanza di SQL Server a scelta, a condizione che sia raggiungibile dall'host. localdb, tuttavia, non supporta la comunicazione container -> host. Se si vuole usare un database SQL diverso durante la creazione di una compilazione di rilascio dell'applicazione Web, aggiungere un'altra stringa di connessione al file web.release.config.

Distribuire l'applicazione in un contenitore

  1. Fare clic con il pulsante destro del mouse sul progetto >FabrikamFiber.WebAggiungi>supporto dell'agente di orchestrazione contenitori. Selezionare Service Fabric come agente di orchestrazione del contenitore e fare clic su OK.

  2. Se richiesto, fare clic su per impostare adesso Docker sui contenitori Windows.

    Nella soluzione viene creato un nuovo progetto di applicazione di Service Fabric FabrikamFiber.CallCenterApplication. Viene aggiunto un Dockerfile al progetto FabrikamFiber.Web esistente. Viene anche aggiunta una directory PackageRoot al progettoFabrikamFiber.Web, che contiene il manifesto del servizio e le impostazioni per il nuovo servizio FabrikamFiber.Web.

    Il contenitore è ora pronto per la compilazione e l'inserimento come pacchetto in un'applicazione di Service Fabric. Dopo aver creato l'immagine del contenitore sul computer, è possibile eseguirne il push in qualsiasi registro contenitori e quindi estrarla in qualsiasi host per l'esecuzione.

Eseguire l'applicazione in un contenitore in locale

Premere F5 per eseguire l'applicazione ed eseguirne il debug in un contenitore nel cluster di sviluppo locale di Service Fabric. Fare clic su se viene visualizzata una finestra di messaggio che richiede di concedere al gruppo "ServiceFabricAllowedUsers" le autorizzazioni di lettura ed esecuzione per la directory del progetto di Visual Studio.

Se L'esecuzione di F5 genera un'eccezione come indicato di seguito, l'indirizzo IP corretto non è stato aggiunto al firewall del database di Azure.

System.Data.SqlClient.SqlException
HResult=0x80131904
Message=Cannot open server 'fab-fiber-751718376' requested by the login. Client with IP address '123.456.789.012' is not allowed to access the server.  To enable access, use the Windows Azure Management Portal or run sp_set_firewall_rule on the master database to create a firewall rule for this IP address or address range.  It may take up to five minutes for this change to take effect.
Source=.Net SqlClient Data Provider
StackTrace:
<Cannot evaluate the exception stack trace>

Per aggiungere l'indirizzo IP appropriato al firewall del database di Azure, eseguire il comando seguente.

# The IP address of your development computer that accesses the SQL DB.
$clientIPNew = "<client IP from the Error Message>"

# Create the firewall rule to allow your development computer to access the server.
New-AzSqlServerFirewallRule -ResourceGroupName $dbresourcegroupname `
    -ServerName $servername `
    -FirewallRuleName "AllowClientNew" -StartIpAddress $clientIPNew -EndIpAddress $clientIPNew

Creare un registro contenitori

Ora che l'applicazione viene eseguita in locale, iniziare a preparare la distribuzione in Azure. Le immagini dei contenitori devono essere archiviate in un registro contenitori. Creare un Registro Azure Container usando lo script seguente. Il nome del registro contenitori è visibile per le altre sottoscrizioni di Azure, pertanto deve essere univoco. Prima di distribuire l'applicazione in Azure, eseguire il push dell'immagine del contenitore in questo registro. Quando l'applicazione viene distribuita nel cluster in Azure, l'immagine del contenitore viene recuperata tramite pull da questo registro.

# Variables
$acrresourcegroupname = "fabrikam-acr-group"
$location = "southcentralus"
$registryname="fabrikamregistry$(Get-Random)"

New-AzResourceGroup -Name $acrresourcegroupname -Location $location

$registry = New-AzContainerRegistry -ResourceGroupName $acrresourcegroupname -Name $registryname -EnableAdminUser -Sku Basic

Creare un cluster di Service Fabric in Azure

Le applicazioni Service Fabric sono eseguite in un cluster, un set di macchine virtuali o fisiche connesse mediante una rete. Prima di distribuire l'applicazione in Azure, creare un cluster di Service Fabric in Azure.

È possibile:

  • Creare un cluster di test da Visual Studio. Questa opzione consente di creare un cluster sicuro direttamente da Visual Studio con le configurazioni preferite.
  • Creare un cluster sicuro da un modello

Questa esercitazione consente di creare un cluster da Visual Studio, ideale per scenari di test. Se si crea un cluster in altri modi o si usa un cluster esistente, è possibile copiare e incollare l'endpoint della connessione o sceglierlo dalla sottoscrizione.

Prima di iniziare, aprire FabrikamFiber.Web -> PackageRoot -> ServiceManifest.xml nel Esplora soluzioni. Prendere nota della porta per il front-end Web indicata in Endpoint.

Durante la creazione del cluster:

  1. Fare clic con il pulsante destro del mouse sul progetto di applicazione FabrikamFiber.CallCenterApplication in Esplora soluzioni e scegliere Pubblica.

  2. Accedere con l'account Azure per poter avere accesso alle sottoscrizioni.

  3. Nell'elenco a discesa per Endpoint connessione selezionare l'opzione Crea nuovo cluster.

  4. Nella finestra di dialogo Crea cluster modificare le impostazioni seguenti:

    a. Specificare il nome del cluster nel campo Nome del cluster, nonché la sottoscrizione e la località da usare. Prendere nota del nome del gruppo di risorse cluster.

    b. Facoltativo: è possibile modificare il numero di nodi. Per impostazione predefinita vengono usati tre nodi, il numero minimo necessario per testare gli scenari di Service Fabric.

    c. Selezionare la scheda Certificato. In questa scheda digitare una password che verrà usata per proteggere il certificato del cluster. Questo certificato consente di rendere sicuro il cluster. È anche possibile modificare il percorso in cui si vuole salvare il certificato. Visual Studio può anche importare automaticamente il certificato, perché questo passaggio è obbligatorio per la pubblicazione dell'applicazione nel cluster.

    Nota

    Tenere presente il percorso della cartella in cui viene importato questo certificato. Il passaggio successivo dopo la creazione del cluster consiste nell'importare questo certificato.

    d. Selezionare la scheda Dettagli macchina virtuale. Specificare la password che si vuole usare per le macchine virtuali (VM) che costituiscono il cluster. Il nome utente e la password possono essere usati per la connessione remota alle VM. Si deve anche selezionare una dimensione di macchina virtuale ed è possibile modificare l'immagine di VM, se necessario.

    Importante

    Scegliere uno SKU che supporta l'esecuzione dei contenitori. Il sistema operativo Windows Server nei nodi del cluster deve essere compatibile con il sistema operativo Windows Server del contenitore. Per altre informazioni, vedere Windows Server container OS and host OS compatibility (Compatibilità tra il sistema operativo del contenitore di Windows Server e il sistema operativo dell'host). Per impostazione predefinita, questa esercitazione consente di creare un'immagine Docker basata su Windows Server 2016 LTSC. I contenitori basati su questa immagine verranno eseguiti nei cluster creati con Windows Server 2016 Datacenter con Contenitori. Tuttavia, se si crea un cluster o si usa un cluster esistente basato su una versione diversa di Windows Server, è necessario cambiare l'immagine del sistema operativo su cui è basato il contenitore. Aprire il dockerfile nel progetto FabrikamFiber.Web, impostare come commento le eventuali istruzioni FROM esistenti basate su una versione precedente di Windows Server e aggiungere un'istruzione FROM basata sul tag della versione desiderata dalla pagina DockerHub di Windows Server Core. Per altre informazioni sulle versioni rilasciate, la disponibilità del supporto e il controllo delle versioni di Windows Server Core, vedere Informazioni sulle versioni di Windows Server.

    e. Nella scheda Avanzate elencare la porta dell'applicazione per aprirla nel servizio di bilanciamento del carico quando si distribuisce il cluster. Questa è la porta di cui si è preso nota prima di avviare la creazione del cluster. È anche possibile aggiungere una chiave di Application Insights esistente a cui indirizzare i file di log dell'applicazione.

    f. Al termine della modifica delle impostazioni, selezionare il pulsante Crea.

  5. La creazione richiede alcuni minuti. Il completamento dell'operazione verrà indicato nella finestra di output.

Installare il certificato importato

Installare il certificato importato come parte del passaggio di creazione del cluster, nel percorso dell'archivio utenti corrente e specificare la password della chiave privata specificata.

È possibile confermare l'installazione aprendo Gestisci certificati utente dal pannello di controllo e confermando che il certificato sia installato in Certificati - Utente corrente ->Certificati personali>. Il certificato deve essere simile a [Nome cluster]. [Posizione cluster].cloudapp.azure.com, ad esempio fabrikamfibercallcenter.southcentralus.cloudapp.azure.com.

Consentire all'applicazione in esecuzione in Azure di accedere al database SQL

In precedenza è stata creata una regola del firewall SQL per concedere l'accesso all'applicazione in esecuzione in locale. A questo punto è necessario consentire all'applicazione in esecuzione in Azure di accedere al database SQL. Creare un endpoint servizio di rete virtuale per il cluster di Service Fabric e quindi creare una regola per consentire a tale endpoint di accedere al database SQL. Assicurarsi di specificare la variabile del gruppo di risorse cluster di cui si è preso nota durante la creazione del cluster.

# Create a virtual network service endpoint
$clusterresourcegroup = "<cluster resource group>"
$resource = Get-AzResource -ResourceGroupName $clusterresourcegroup -ResourceType Microsoft.Network/virtualNetworks | Select-Object -first 1
$vnetName = $resource.Name

Write-Host 'Virtual network name: ' $vnetName

# Get the virtual network by name.
$vnet = Get-AzVirtualNetwork `
  -ResourceGroupName $clusterresourcegroup `
  -Name              $vnetName

Write-Host "Get the subnet in the virtual network:"

# Get the subnet, assume the first subnet contains the Service Fabric cluster.
$subnet = Get-AzVirtualNetworkSubnetConfig -VirtualNetwork $vnet | Select-Object -first 1

$subnetName = $subnet.Name
$subnetID = $subnet.Id
$addressPrefix = $subnet.AddressPrefix

Write-Host "Subnet name: " $subnetName " Address prefix: " $addressPrefix " ID: " $subnetID

# Assign a Virtual Service endpoint 'Microsoft.Sql' to the subnet.
$vnet = Set-AzVirtualNetworkSubnetConfig `
  -Name            $subnetName `
  -AddressPrefix   $addressPrefix `
  -VirtualNetwork  $vnet `
  -ServiceEndpoint Microsoft.Sql | Set-AzVirtualNetwork

$vnet.Subnets[0].ServiceEndpoints;  # Display the first endpoint.

# Add a SQL DB firewall rule for the virtual network service endpoint
$subnet = Get-AzVirtualNetworkSubnetConfig `
  -Name           $subnetName `
  -VirtualNetwork $vnet;

$VNetRuleName="ServiceFabricClusterVNetRule"
$vnetRuleObject1 = New-AzSqlServerVirtualNetworkRule `
  -ResourceGroupName      $dbresourcegroupname `
  -ServerName             $servername `
  -VirtualNetworkRuleName $VNetRuleName `
  -VirtualNetworkSubnetId $subnetID;

Distribuzione dell'applicazione in Azure

Ora che l'applicazione è pronta, è possibile distribuirla nel cluster in Azure direttamente da Visual Studio. In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto di applicazione FabrikamFiber.CallCenterApplication e scegliere Pubblica. In Endpoint connessione selezionare l'endpoint del cluster creato in precedenza. In Registro Azure Container selezionare il registro contenitori creato in precedenza. Fare clic su Pubblica per distribuire l'applicazione nel cluster in Azure.

Pubblicare l'applicazione

Seguire lo stato della distribuzione nella finestra di output. Al termine della distribuzione dell'applicazione, aprire un browser e digitare l'indirizzo del cluster e la porta dell'applicazione. Ad esempio: http://fabrikamfibercallcenter.southcentralus.cloudapp.azure.com:8659/.

Screenshot della home page dell'applicazione Fabrikam Fiber CallCenter in esecuzione in azure.com. La pagina mostra un dashboard con un elenco di chiamate di supporto.

Se la pagina non riesce a caricare o non riesce a richiedere il certificato, provare ad aprire il percorso di Esplora risorse, ad esempio https://fabrikamfibercallcenter.southcentralus.cloudapp.azure.com:19080/Explorer e selezionare il certificato appena installato.

Configurare l'integrazione e la distribuzione continue con un cluster di Service Fabric

Per informazioni su come usare Azure DevOps per configurare la distribuzione di un'applicazione con CI/CD in un cluster di Service Fabric, vedere Esercitazione: Distribuire un'applicazione con CI/CD in un cluster di Service Fabric. La procedura descritta nell'esercitazione è la stessa per il progetto FabrikamFiber. Ignorare il download dell'esempio Voting e sostituire Voting con FabrikamFiber come nome del repository.

Pulire le risorse

Se l'operazione è terminata, assicurarsi di rimuovere tutte le risorse create. Il modo più semplice consiste nel rimuovere i gruppi di risorse che contengono il cluster di Service Fabric, il database SQL di Azure e Registro Azure Container.

$dbresourcegroupname = "fabrikam-fiber-db-group"
$acrresourcegroupname = "fabrikam-acr-group"
$clusterresourcegroupname="fabrikamcallcentergroup"

# Remove the Azure SQL DB
Remove-AzResourceGroup -Name $dbresourcegroupname

# Remove the container registry
Remove-AzResourceGroup -Name $acrresourcegroupname

# Remove the Service Fabric cluster
Remove-AzResourceGroup -Name $clusterresourcegroupname

Passaggi successivi

In questa esercitazione sono state illustrate le procedure per:

  • Aggiungere un'applicazione esistente in un contenitore con Visual Studio
  • Creare un database in Database SQL di Azure
  • Creare un Registro Azure Container
  • Distribuire un'applicazione di Service Fabric in Azure

Nella parte successiva dell'esercitazione, apprendere come distribuire un'applicazione contenitore con CI/CD in un cluster di Service Fabric.