Aumentare o ridurre le istanze di un cluster di Service Fabric a livello di codiceScale a Service Fabric cluster programmatically

I cluster di Service Fabric in esecuzione in Azure sono basati su set di scalabilità di macchine virtuali.Service Fabric clusters running in Azure are built on top of virtual machine scale sets. L'articolo sulla scalabilità dei cluster descrive come aumentare o ridurre i cluster di Service Fabric manualmente o usando regole di ridimensionamento automatico.Cluster scaling describes how Service Fabric clusters can be scaled either manually or with auto-scale rules. Questo articolo descrive come gestire le credenziali e ridimensionare un cluster usando l'SDK di calcolo di Azure Fluent, ovvero in uno scenario più avanzato.This article describes how to manage credentials and scale a cluster in or out using the fluent Azure compute SDK, which is a more advanced scenario. Per una panoramica, leggere le informazioni sui metodi per coordinare a livello di codice le operazioni di ridimensionamento di Azure.For an overview, read programmatic methods of coordinating Azure scaling operations.

Gestire le credenzialiManage credentials

Un problema in fase di scrittura di un servizio per gestire la scalabilità è che il servizio deve essere in grado di accedere alle risorse dei set di scalabilità di macchine virtuali senza un accesso interattivo.One challenge of writing a service to handle scaling is that the service must be able to access virtual machine scale set resources without an interactive login. L'accesso al cluster Service Fabric è semplice se il servizio di scalabilità sta modificando la propria applicazione Service Fabric, ma sono necessarie le credenziali per accedere al set di scalabilità.Accessing the Service Fabric cluster is easy if the scaling service is modifying its own Service Fabric application, but credentials are needed to access the scale set. Per accedere, è possibile usare un'entità servizio creata con l'interfaccia della riga di comando di Azure 2.0.To log in, you can use a service principal created with the Azure CLI 2.0.

È possibile creare un'entità servizio con i passaggi seguenti:A service principal can be created with the following steps:

  1. Accedere all'interfaccia della riga di comando di Azure (az login) come utente con accesso al set di scalabilità di macchine virtualiLog in to the Azure CLI (az login) as a user with access to the virtual machine scale set
  2. Creare l'entità servizio con az ad sp create-for-rbacCreate the service principal with az ad sp create-for-rbac
    1. Prendere nota di appId (denominato altrove "ID client"), nome, password e tenant per un uso successivo.Make note of the appId (called 'client ID' elsewhere), name, password, and tenant for later use.
    2. Sarà inoltre necessario l'ID sottoscrizione, che può essere visualizzato con az account listYou will also need your subscription ID, which can be viewed with az account list

La libreria di calcolo Fluent può eseguire l'accesso usando queste credenziali come indicato di seguito. Si noti che i tipi di Azure fluent principali, ad esempio IAzure, sono nel pacchetto Microsoft.Azure.Management.Fluent:The fluent compute library can log in using these credentials as follows (note that core fluent Azure types like IAzure are in the Microsoft.Azure.Management.Fluent package):

var credentials = new AzureCredentials(new ServicePrincipalLoginInformation {
                ClientId = AzureClientId,
                ClientSecret = 
                AzureClientKey }, AzureTenantId, AzureEnvironment.AzureGlobalCloud);
IAzure AzureClient = Azure.Authenticate(credentials).WithSubscription(AzureSubscriptionId);

if (AzureClient?.SubscriptionId == AzureSubscriptionId)
{
    ServiceEventSource.Current.ServiceMessage(Context, "Successfully logged into Azure");
}
else
{
    ServiceEventSource.Current.ServiceMessage(Context, "ERROR: Failed to login to Azure");
}

Una volta eseguito l'accesso, è possibile eseguire una query del numero di istanze di set di scalabilità tramite AzureClient.VirtualMachineScaleSets.GetById(ScaleSetId).Capacity.Once logged in, scale set instance count can be queried via AzureClient.VirtualMachineScaleSets.GetById(ScaleSetId).Capacity.

Aumento del numero di istanzeScaling out

Usando l'SDK di calcolo di Azure Fluent è possibile aggiungere istanze al set di scalabilità di macchine virtuali con poche chiamate.Using the fluent Azure compute SDK, instances can be added to the virtual machine scale set with just a few calls -

var scaleSet = AzureClient.VirtualMachineScaleSets.GetById(ScaleSetId);
var newCapacity = (int)Math.Min(MaximumNodeCount, scaleSet.Capacity + 1);
scaleSet.Update().WithCapacity(newCapacity).Apply(); 

In alternativa, le dimensioni del set di scalabilità di macchine virtuali possono essere gestite anche con i cmdlet di PowerShell.Alternatively, virtual machine scale set size can also be managed with PowerShell cmdlets. Get-AzureRmVmss consente di recuperare l'oggetto set di scalabilità di macchine virtuali.Get-AzureRmVmss can retrieve the virtual machine scale set object. La capacità corrente è disponibile tramite la proprietà .sku.capacity.The current capacity is available through the .sku.capacity property. Dopo avere impostato la capacità sul valore desiderato, il set di scalabilità di macchine virtuali in Azure può essere aggiornato con il comando Update-AzureRmVmss.After changing the capacity to the desired value, the virtual machine scale set in Azure can be updated with the Update-AzureRmVmss command.

Quando si aggiunge manualmente un nodo, l'aggiunta di un'istanza del set di scalabilità dovrebbe essere sufficiente per avviare un nuovo nodo Service Fabric in quanto il modello del set di scalabilità include le estensioni per aggiungere automaticamente nuove istanze al cluster Service Fabric.As when adding a node manually, adding a scale set instance should be all that's needed to start a new Service Fabric node since the scale set template includes extensions to automatically join new instances to the Service Fabric cluster.

RiduzioneScaling in

La riduzione è simile all'aumento del numero di istanze. Le modifiche effettive al set di scalabilità di macchine virtuali sono praticamente le stesse.Scaling in is similar to scaling out. The actual virtual machine scale set changes are practically the same. Tuttavia, come illustrato in precedenza, Service Fabric pulisce automaticamente solo i nodi rimossi con la durabilità Gold o Silver.But, as was discussed previously, Service Fabric only automatically cleans up removed nodes with a durability of Gold or Silver. Pertanto, nel caso di riduzione con la durabilità Bronze, è necessario interagire con il cluster Service Fabric per arrestare il nodo da rimuovere, quindi rimuovere il relativo stato.So, in the Bronze-durability scale-in case, it's necessary to interact with the Service Fabric cluster to shut down the node to be removed and then to remove its state.

La preparazione del nodo per l'arresto implica la ricerca del nodo da rimuovere, ovvero l'istanza del set di scalabilità di macchine virtuali aggiunta più di recente, e la relativa disattivazione.Preparing the node for shutdown involves finding the node to be removed (the most recently added virtual machine scale set instance) and deactivating it. Le istanze del set di scalabilità di macchine virtuali sono numerate nell'ordine in cui sono state aggiunte, quindi i nodi più recenti si possono trovare confrontando il suffisso numerico nei nomi dei nodi, che corrispondono ai nomi delle istanze del set di scalabilità di macchine virtuali sottostanti.Virtual machine scale set instances are numbered in the order they are added, so newer nodes can be found by comparing the number suffix in the nodes' names (which match the underlying virtual machine scale set instance names).

using (var client = new FabricClient())
{
    var mostRecentLiveNode = (await client.QueryManager.GetNodeListAsync())
        .Where(n => n.NodeType.Equals(NodeTypeToScale, StringComparison.OrdinalIgnoreCase))
        .Where(n => n.NodeStatus == System.Fabric.Query.NodeStatus.Up)
        .OrderByDescending(n =>
        {
            var instanceIdIndex = n.NodeName.LastIndexOf("_");
            var instanceIdString = n.NodeName.Substring(instanceIdIndex + 1);
            return int.Parse(instanceIdString);
        })
        .FirstOrDefault();

Dopo avere individuato il nodo da rimuovere, questo può essere disattivato e rimosso usando la stessa istanza FabricClient e l'istanza IAzure precedente.Once the node to be removed is found, it can be deactivated and removed using the same FabricClient instance and the IAzure instance from earlier.

var scaleSet = AzureClient.VirtualMachineScaleSets.GetById(ScaleSetId);

// Remove the node from the Service Fabric cluster
ServiceEventSource.Current.ServiceMessage(Context, $"Disabling node {mostRecentLiveNode.NodeName}");
await client.ClusterManager.DeactivateNodeAsync(mostRecentLiveNode.NodeName, NodeDeactivationIntent.RemoveNode);

// Wait (up to a timeout) for the node to gracefully shutdown
var timeout = TimeSpan.FromMinutes(5);
var waitStart = DateTime.Now;
while ((mostRecentLiveNode.NodeStatus == System.Fabric.Query.NodeStatus.Up || mostRecentLiveNode.NodeStatus == System.Fabric.Query.NodeStatus.Disabling) &&
        DateTime.Now - waitStart < timeout)
{
    mostRecentLiveNode = (await client.QueryManager.GetNodeListAsync()).FirstOrDefault(n => n.NodeName == mostRecentLiveNode.NodeName);
    await Task.Delay(10 * 1000);
}

// Decrement VMSS capacity
var newCapacity = (int)Math.Max(MinimumNodeCount, scaleSet.Capacity - 1); // Check min count 

scaleSet.Update().WithCapacity(newCapacity).Apply(); 

Anche in questo caso, come per l'aumento del numero di istanze, è possibile usare i cmdlet di PowerShell per modificare la capacità del set di scalabilità di macchine virtuali, se si preferisce un approccio basato sugli script.As with scaling out, PowerShell cmdlets for modifying virtual machine scale set capacity can also be used here if a scripting approach is preferable. Dopo avere rimosso l'istanza di macchina virtuale, è possibile rimuovere lo stato del nodo Service Fabric.Once the virtual machine instance is removed, Service Fabric node state can be removed.

await client.ClusterManager.RemoveNodeStateAsync(mostRecentLiveNode.NodeName);

Passaggi successiviNext steps

Per iniziare a implementare la logica di scalabilità automatica, acquisire familiarità con i seguenti concetti e le utili API:To get started implementing your own auto-scaling logic, familiarize yourself with the following concepts and useful APIs: