Share via


Een Service Fabric-cluster programmatisch schalen

Service Fabric-clusters die worden uitgevoerd in Azure, zijn gebouwd op virtuele-machineschaalsets. Met clusterschalen wordt beschreven 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. Dit is een geavanceerder scenario. Lees voor een overzicht programmatische methoden voor het coördineren van Azure-schaalbewerkingen.

Notitie

Het wordt aanbevolen 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 schalen is dat de service toegang moet hebben tot resources van virtuele-machineschaalsets zonder een interactieve aanmelding. Het openen van 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.

U kunt een service-principal maken met de volgende stappen:

  1. Meld u aan bij de Azure CLI (az login) als gebruiker met toegang tot de virtuele-machineschaalset
  2. De service-principal maken met az ad sp create-for-rbac
    1. Noteer de appId ('client-id' elders genoemd), de naam, het wachtwoord en de 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 behulp van deze referenties (houd er rekening mee dat de vloeiende Azure-kerntypen 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");
}

Zodra u zich hebt aangemeld, kan het aantal exemplaren van de schaalset worden opgevraagd via AzureClient.VirtualMachineScaleSets.GetById(ScaleSetId).Capacity.

Uitschalen

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

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

U kunt ook de grootte van virtuele-machineschaalsets beheren met PowerShell-cmdlets. Get-AzVmss kan het virtuele-machineschaalsetobject ophalen. De huidige capaciteit is beschikbaar via de .sku.capacity eigenschap. Nadat u de capaciteit hebt 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, moet het toevoegen van een schaalsetexemplaren alles zijn dat nodig is om een nieuw Service Fabric-knooppunt te starten, omdat de schaalsetsjabloon extensies bevat voor het automatisch toevoegen van nieuwe exemplaren aan het Service Fabric-cluster.

Inschalen

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

Het voorbereiden van het knooppunt voor afsluiten omvat het vinden van het knooppunt dat moet worden verwijderd (het laatst toegevoegde exemplaar van de virtuele-machineschaalset) en het deactiveren ervan. Exemplaren van virtuele-machineschaalsets worden genummerd in de volgorde waarin ze worden toegevoegd, zodat nieuwere knooppunten kunnen worden gevonden door het numerieke achtervoegsel in de namen van de knooppunten te vergelijken (die overeenkomen met de namen van de onderliggende 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 behulp van 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 PowerShell-cmdlets voor het wijzigen van de capaciteit van virtuele-machineschaalsets hier ook worden gebruikt als een scriptbenadering de voorkeur heeft. 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: