Škálování Service Fabric clusteru prostřednictvím kódu programu

Clustery Service Fabric spuštěné v Azure jsou postavené na službě Virtual Machine Scale Sets. Škálování clusteru popisuje, jak lze Service Fabric clustery škálovat ručně nebo pomocí pravidel automatického škálování. Tento článek popisuje, jak spravovat přihlašovací údaje a škálovat cluster s využitím sady Azure COMPUTE SDK Fluent, což je pokročilejší scénář. Přehled najdete v tématu programové metody pro koordinaci operací škálování Azure.

Poznámka

Tento článek používá modul Azure Az PowerShell, což je doporučený modul PowerShellu pro interakci s Azure. Pokud chcete začít s modulem Az PowerShell, projděte si téma věnované instalaci Azure PowerShellu. Informace o tom, jak migrovat na modul Az PowerShell, najdete v tématu Migrace Azure PowerShellu z AzureRM na Az.

Správa přihlašovacích údajů

Jednou z možností, jak napsat službu pro zpracování škálování, je, že služba musí mít přístup k prostředkům sady škálování virtuálních počítačů bez interaktivního přihlášení. Přístup ke clusteru Service Fabric je snadno, pokud služba škálování mění svoji vlastní Service Fabric aplikaci, ale pro přístup k sadě škálování je potřeba přihlašovací údaje. Pokud se chcete přihlásit, můžete použít instanční objekt vytvořený pomocí Azure CLI.

Instanční objekt se dá vytvořit pomocí následujících kroků:

  1. Přihlaste se k Azure CLI ( az login ) jako uživatel s přístupem k sadě škálování virtuálního počítače.
  2. Vytvoření instančního objektu pomocí služby az ad sp create-for-rbac
    1. Poznamenejte si appId (označované jako "ID klienta" jinde), jméno, heslo a tenant pro pozdější použití.
    2. Budete také potřebovat ID vašeho předplatného, které se dá zobrazit s az account list

COMPUTE COMPUTE Library se může přihlásit pomocí těchto přihlašovacích údajů takto (Všimněte si, že základní typy technologie Azure, jako IAzure jsou v balíčku 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");
}

Po přihlášení se počet instancí sady škálování dá dotazovat prostřednictvím AzureClient.VirtualMachineScaleSets.GetById(ScaleSetId).Capacity .

Horizontální navýšení kapacity

Pomocí sady Azure COMPUTE SDK Fluent můžete instance přidat do sady škálování virtuálního počítače jenom s několika voláními –

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

Alternativně je možné spravovat i velikost sady škálování virtuálních počítačů pomocí rutin PowerShellu. Get-AzVmss může načíst objekt sady škálování virtuálního počítače. Aktuální kapacita je k dispozici prostřednictvím .sku.capacity Vlastnosti. Po změně kapacity na požadovanou hodnotu můžete pomocí příkazu aktualizovat sadu škálování virtuálního počítače v Azure Update-AzVmss .

Stejně jako při ručním přidávání uzlu by se měla přidat instance sady škálování, která je potřeba ke spuštění nového uzlu Service Fabric, protože šablona sady škálování obsahuje rozšíření, která automaticky připojovat nové instance do clusteru Service Fabric.

Škálování v

Škálování v nástroji je podobné jako horizontální navýšení kapacity. Skutečné změny sady škálování virtuálního počítače jsou prakticky stejné. Ale jak bylo popsáno dříve, Service Fabric pouze automaticky vyčistí odebrané uzly se odolností Gold nebo stříbrného. V případě nenáročného škálování v případě je proto nutné pracovat s clusterem Service Fabric, aby bylo možné vypnout uzel, který chcete odebrat, a poté odebrat jeho stav.

Příprava uzlu pro vypnutí zahrnuje vyhledání uzlu, který se má odebrat (naposledy přidané instance sady škálování virtuálního počítače), a její deaktivace. Instance sady škálování virtuálních počítačů jsou očíslovány v pořadí, v jakém jsou přidány, takže novější uzly lze nalézt porovnáním přípony čísla v názvech uzlů (které odpovídají základním názvům instancí sady škálování virtuálních počítačů).

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

Jakmile bude uzel, který se má odebrat, nalezen, může být deaktivován a odebrán pomocí stejné FabricClient instance a IAzure instance z dřívější.

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

Stejně jako u horizontálního navýšení kapacity se dá rutiny PowerShellu pro úpravu kapacity sady škálování virtuálních počítačů použít taky v případě, že je vhodnější přístup k skriptování. Po odebrání instance virtuálního počítače je možné odebrat Service Fabric stav uzlu.

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

Další kroky

Pokud chcete začít s implementací vlastní logiky automatického škálování, Seznamte se s následujícími koncepty a užitečnými rozhraními API: