Skala ett Service Fabric-kluster programmatiskt

Service Fabric-kluster som körs i Azure bygger på vm-skalningsuppsättningar. Klusterskalning beskriver hur Service Fabric-kluster kan skalas manuellt eller med regler för automatisk skalning. Den här artikeln beskriver hur du hanterar autentiseringsuppgifter och skalar ett kluster in eller ut med hjälp av Fluent Azure Compute SDK, vilket är ett mer avancerat scenario. En översikt finns i programmatiska metoder för att samordna Azure-skalningsåtgärder.

Anteckning

Vi rekommenderar att du använder Azure Az PowerShell-modulen för att interagera med Azure. Se Installera Azure PowerShell för att komma igång. Information om hur du migrerar till Az PowerShell-modulen finns i artikeln om att migrera Azure PowerShell från AzureRM till Az.

Hantera autentiseringsuppgifter

En utmaning med att skriva en tjänst för att hantera skalning är att tjänsten måste kunna komma åt vm-skalningsuppsättningsresurser utan interaktiv inloggning. Det är enkelt att komma åt Service Fabric-klustret om skalningstjänsten ändrar sitt eget Service Fabric-program, men autentiseringsuppgifter krävs för att komma åt skalningsuppsättningen. Om du vill logga in kan du använda ett tjänsthuvudnamn som skapats med Azure CLI.

Ett huvudnamn för tjänsten kan skapas med följande steg:

  1. Logga in på Azure CLI (az login) som en användare med åtkomst till vm-skalningsuppsättningen
  2. Skapa tjänstens huvudnamn med az ad sp create-for-rbac
    1. Anteckna appId (kallas "klient-ID" någon annanstans), namn, lösenord och klientorganisation för senare användning.
    2. Du behöver också ditt prenumerations-ID, som kan visas med az account list

Fluent-beräkningsbiblioteket kan logga in med dessa autentiseringsuppgifter på följande sätt (observera att grundläggande Fluent Azure-typer som IAzure finns i paketet Microsoft.Azure.Management.Fluent ):

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

När du har loggat in kan antalet skalningsuppsättningsinstanser frågas via AzureClient.VirtualMachineScaleSets.GetById(ScaleSetId).Capacity.

Skala ut

Med hjälp av Fluent Azure Compute SDK kan instanser läggas till i vm-skalningsuppsättningen med bara några få anrop –

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

Du kan också hantera storlek på vm-skalningsuppsättningar med PowerShell-cmdletar. Get-AzVmss kan hämta vm-skalningsuppsättningsobjektet. Den aktuella kapaciteten är tillgänglig via egenskapen .sku.capacity . När du har ändrat kapaciteten till önskat värde kan vm-skalningsuppsättningen i Azure uppdateras med Update-AzVmss kommandot .

Precis som när du lägger till en nod manuellt bör det vara allt som behövs för att starta en ny Service Fabric-nod eftersom skalningsuppsättningsmallen innehåller tillägg för att automatiskt ansluta nya instanser till Service Fabric-klustret.

Skala in

Skalning i liknar utskalning. De faktiska ändringarna i vm-skalningsuppsättningen är praktiskt taget desamma. Men som tidigare nämnts rensar Service Fabric endast automatiskt borttagna noder med hållbarheten Guld eller Silver. I skalningsskalan Brons är det därför nödvändigt att interagera med Service Fabric-klustret för att stänga av noden som ska tas bort och sedan ta bort dess tillstånd.

Att förbereda noden för avstängning innebär att hitta noden som ska tas bort (den senast tillagda vm-skalningsuppsättningsinstansen) och inaktivera den. Vm-skalningsuppsättningsinstanser numreras i den ordning de läggs till, så nyare noder kan hittas genom att jämföra antalet suffix i nodernas namn (som matchar de underliggande instansnamnen för vm-skalningsuppsättningar).

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

När noden som ska tas bort hittas kan den inaktiveras och tas bort med samma FabricClient instans och instansen IAzure från tidigare.

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

Precis som vid utskalning kan PowerShell-cmdletar för att ändra kapacitet för vm-skalningsuppsättningar också användas här om en skriptmetod är att föredra. När den virtuella datorinstansen har tagits bort kan Service Fabric-nodtillståndet tas bort.

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

Nästa steg

Kom igång med att implementera din egen logik för automatisk skalning genom att bekanta dig med följande begrepp och användbara API:er: