Skala ett Service Fabric kluster programmatiskt
Service Fabric kluster som körs i Azure byggs ovanpå VM-skalningsuppsättningar. Klusterskalning beskriver hur Service Fabric kluster kan skalas manuellt eller med regler för automatisk skalning. I den här artikeln beskrivs hur du hanterar autentiseringsuppgifter och skalar in eller ut ett kluster med hjälp av Fluent Azure Compute SDK, vilket är ett mer avancerat scenario. En översikt finns i Programmatiska metoder för att koordinera Skalningsåtgärder i Azure.
Anteckning
I den här artikeln används Azure Az PowerShell-modulen, som är den rekommenderade PowerShell-modulen för att interagera med Azure. För att komma igång med Az PowerShell kan du läsa artikeln om att installera Azure PowerShell. 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 resurser för VM-skalningsuppsättningen utan en interaktiv inloggning. Det är Service Fabric enkelt att komma åt Service Fabric 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 huvudnamn för tjänsten som skapats med Azure CLI.
Ett huvudnamn för tjänsten kan skapas med följande steg:
- Logga in på Azure CLI (
az login) som en användare med åtkomst till VM-skalningsuppsättningen - Skapa tjänstens huvudnamn med
az ad sp create-for-rbac- Anteckna appId (kallas "klient-ID" någon annanstans), namn, lösenord och klient för senare användning.
- 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 finns i IAzure 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 du fråga antalet skalningsuppsättningsinstanser via AzureClient.VirtualMachineScaleSets.GetById(ScaleSetId).Capacity .
Skala ut
Med fluent Azure Compute SDK kan instanser läggas till i VM-skalningsuppsättningen med bara några 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 vm-skalningsuppsättningens storlek med PowerShell-cmdlets. Get-AzVmss kan hämta VM-skalningsuppsättningsobjektet. Den aktuella kapaciteten är tillgänglig via .sku.capacity egenskapen . När du har ändrat kapaciteten till önskat värde kan VM-skalningsuppsättningen i Azure uppdateras med Update-AzVmss kommandot .
Som när du lägger till en nod manuellt bör tillägg av en skalningsuppsättningsinstans 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
Inskalning liknar utskalning. De faktiska ändringarna i VM-skalningsuppsättningen är i stort sett desamma. Men som vi nämnt tidigare rensar Service Fabric borttagna noder automatiskt med hållbarheten Guld eller Silver. I skalningsfallet Bronsbeständighet är det därför nödvändigt att interagera med Service Fabric-klustret för att stänga 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 instansen av VM-skalningsuppsättningen) och inaktivera den. Vm-skalningsuppsättningsinstanser numreras i den ordning som de läggs till, så nyare noder kan hittas genom att jämföra nummersuffixet i noderna (som matchar de underliggande namnen på VM-skalningsuppsättningsinstanserna).
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 IAzure instansen 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-cmdlets för att ändra vm-skalningsuppsättningens kapacitet också användas här om en skriptningsmetod är att föredra. När den virtuella datorinstansen har tagits Service Fabric kan 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:
- Skala manuellt eller med regler för automatisk skalning
- Azure-hanteringsbibliotek för .NET (användbara för att interagera Service Fabric ett klusters underliggande VM-skalningsuppsättningar)
- System.Fabric.FabricClient (användbart för att interagera med Service Fabric kluster och dess noder)