Een Service Fabric-cluster programmatisch schalen

Service Fabric-clusters die in Azure worden uitgevoerd, zijn gebouwd op virtuele-machineschaalsets. Clusterschalen beschrijft hoe Service Fabric-clusters handmatig of met regels voor automatisch schalen kunnen worden geschaald. In dit artikel wordt beschreven hoe u referenties beheert en een cluster in- of uitschaalt met behulp van de Fluent Azure Compute SDK, een geavanceerder scenario. Lees programmatische methoden voor het coördineren van Azure-schaalbewerkingen voor een overzicht.

Notitie

U wordt aangeraden de Azure Az PowerShell-module te gebruiken om te communiceren met Azure. Zie Azure PowerShell installeren om aan de slag te gaan. Raadpleeg Azure PowerShell migreren van AzureRM naar Az om te leren hoe u naar de Azure PowerShell-module migreert.

Referenties beheren

Een uitdaging van het schrijven van een service voor het afhandelen van schaalaanpassing is dat de service toegang moet hebben tot resources van virtuele-machineschaalsets zonder een interactieve aanmelding. Toegang tot het Service Fabric-cluster is eenvoudig als de schaalservice een eigen Service Fabric-toepassing wijzigt, maar referenties zijn nodig voor toegang tot de schaalset. Als u zich wilt aanmelden, kunt u een service-principal gebruiken die is gemaakt met de Azure CLI.

Een service-principal kan worden gemaakt met de volgende stappen:

  1. Meld u aan bij de Azure CLI (az login) als een gebruiker met toegang tot de virtuele-machineschaalset
  2. De service-principal maken met az ad sp create-for-rbac
    1. Noteer de appId (elders 'client-id' genoemd), naam, wachtwoord en tenant voor later gebruik.
    2. U hebt ook uw abonnements-id nodig, die kan worden weergegeven met az account list

De Fluent Compute-bibliotheek kan zich als volgt aanmelden met deze referenties (houd er rekening mee dat kerntypen van Fluent Azure, zoals IAzure , zich in het Microsoft.Azure.Management.Fluent-pakket bevinden):

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");
}

Nadat u bent aangemeld, kan het aantal schaalsetexemplaren worden opgevraagd via AzureClient.VirtualMachineScaleSets.GetById(ScaleSetId).Capacity.

Uitschalen

Met behulp van de Fluent Azure Compute SDK kunnen instanties met slechts een paar aanroepen worden toegevoegd aan de virtuele-machineschaalset :

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

De grootte van virtuele-machineschaalsets kan ook worden beheerd met PowerShell-cmdlets. Get-AzVmss kan het virtuele-machineschaalsetobject ophalen. De huidige capaciteit is beschikbaar via de .sku.capacity eigenschap. Nadat de capaciteit is gewijzigd in de gewenste waarde, kan de virtuele-machineschaalset in Azure worden bijgewerkt met de Update-AzVmss opdracht .

Net als bij het handmatig toevoegen van een knooppunt, hoeft u alleen een exemplaar van een schaalset toe te voegen om een nieuw Service Fabric-knooppunt te starten, omdat de schaalsetsjabloon extensies bevat om automatisch nieuwe exemplaren toe te voegen aan het Service Fabric-cluster.

Inschalen

Inschalen is vergelijkbaar met uitschalen. De werkelijke wijzigingen in de virtuele-machineschaalset zijn vrijwel hetzelfde. Maar, zoals eerder is besproken, schoont Service Fabric alleen automatisch verwijderde knooppunten op met een duurzaamheid van Gold of Silver. In het geval van schalen met bronzen duurzaamheid is het dus noodzakelijk om te communiceren met het Service Fabric-cluster om het te verwijderen knooppunt af te sluiten en vervolgens de status ervan te verwijderen.

Het afsluiten van het knooppunt voorbereiden omvat het zoeken van het knooppunt dat moet worden verwijderd (het meest recent toegevoegde exemplaar van de virtuele-machineschaalset) en het deactiveren ervan. Instanties van virtuele-machineschaalsets worden genummerd in de volgorde waarin ze worden toegevoegd, zodat nieuwere knooppunten kunnen worden gevonden door het getalachtervoegsel in de namen van de knooppunten te vergelijken (die overeenkomen met de onderliggende namen van de virtuele-machineschaalsetexemplaren).

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();

Zodra het te verwijderen knooppunt is gevonden, kan het worden gedeactiveerd en verwijderd met hetzelfde FabricClient exemplaar en het IAzure exemplaar van eerder.

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(); 

Net als bij uitschalen kunnen Hier ook PowerShell-cmdlets voor het wijzigen van de capaciteit van virtuele-machineschaalsets worden gebruikt als een scriptbenadering de voorkeur verdient. Zodra het exemplaar van de virtuele machine is verwijderd, kan de status van het Service Fabric-knooppunt worden verwijderd.

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

Volgende stappen

Om aan de slag te gaan met het implementeren van uw eigen logica voor automatisch schalen, moet u vertrouwd raken met de volgende concepten en nuttige API's: