Een cluster Service Fabric programmatisch schalen
Service Fabric clusters die in Azure worden uitgevoerd, zijn gebaseerd 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. Dit is een geavanceerder scenario. Lees programmatische methoden voor het coördineren van Azure-schaalbewerkingen voor een overzicht.
Notitie
In dit artikel wordt de Azure Az PowerShell-module gebruikt. Dit is de aanbevolen PowerShell-module voor interactie met Azure. Raadpleeg Azure PowerShell installeren om aan de slag te gaan met de Az PowerShell-module. 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 schalen is dat de service toegang moet hebben tot resources van de virtuele-machineschaalset zonder interactieve aanmelding. Toegang tot het Service Fabric-cluster is eenvoudig als de schaalservice zijn eigen Service Fabric-toepassing wijzigt, maar referenties nodig zijn 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:
- Meld u aan bij de Azure CLI (
az login) als een gebruiker met toegang tot de virtuele-machineschaalset - De service-principal maken met
az ad sp create-for-rbac- Noteer de appId (elders client-id genoemd), de naam, het wachtwoord en de tenant voor later gebruik.
- U hebt ook uw abonnements-id nodig, die kan worden bekeken met
az account list
De Fluent Compute-bibliotheek kan zich als volgt aanmelden met behulp van deze referenties (houd er rekening mee dat de Azure-kerntypen van Fluent in het IAzure pakket Microsoft.Azure.Management.Fluent staan):
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 bent aangemeld, kan het aantal exemplaren van schaalsets worden opgevraagd via AzureClient.VirtualMachineScaleSets.GetById(ScaleSetId).Capacity .
Uitschalen
Met de Fluent Azure Compute SDK kunnen exemplaren met slechts enkele 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 veranderd in de gewenste waarde, kan de virtuele-machineschaalset in Azure worden bijgewerkt met de Update-AzVmss opdracht .
Net als wanneer u handmatig een knooppunt toevoegt, moet u alleen een exemplaar van een schaalset toevoegen om een nieuw Service Fabric-knooppunt te starten, omdat de schaalsetsjabloon extensies bevat om automatisch nieuwe exemplaren aan het Service Fabric-cluster toe te voegen.
Inschalen
Inschalen is vergelijkbaar met uitschalen. De daadwerkelijke wijzigingen in de virtuele-machineschaalset zijn nagenoeg hetzelfde. Maar zoals eerder is besproken, Service Fabric verwijderde knooppunten alleen automatisch op met de duurzaamheid Gold of Silver. In het geval van bronzen 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 knooppunt voorbereiden voor afsluiten omvat het vinden van het knooppunt dat moet worden verwijderd (het meest recent toegevoegde exemplaar van een virtuele-machineschaalset) en het deactiveren ervan. Exemplaren van virtuele-machineschaalsets worden genummerd in de volgorde waarin ze worden toegevoegd, zodat er nieuwere knooppunten kunnen worden gevonden door het getalachtervoegsel in de namen van de knooppunten te vergelijken (die overeenkomen met de namen van de onderliggende instanties van virtuele-machineschaalsets).
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 knooppunt is gevonden dat moet worden verwijderd, kan het worden gedeactiveerd en verwijderd met behulp van hetzelfde exemplaar en het eerdere FabricClient IAzure exemplaar.
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, Service Fabric de status van het 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 zich vertrouwd maken met de volgende concepten en nuttige API's:
- Handmatig schalen of met regels voor automatisch schalen
- Azure-beheerbibliotheken voor .NET (handig voor interactie met de onderliggende virtuele-machineschaalsets Service Fabric een virtueel-machinecluster)
- System.Fabric.FabricClient (handig voor interactie met een Service Fabric cluster en de knooppunten ervan)