Programowe skalowanie klastra usługi Service Fabric

Klastry usługi Service Fabric działające na platformie Azure są oparte na zestawach skalowania maszyn wirtualnych. Skalowanie klastra opisuje sposób skalowania klastrów usługi Service Fabric ręcznie lub za pomocą reguł skalowania automatycznego. W tym artykule opisano sposób zarządzania poświadczeniami i skalowania klastra w poziomie przy użyciu płynnego zestawu Azure Compute SDK, który jest bardziej zaawansowanym scenariuszem. Aby zapoznać się z omówieniem, przeczytaj metody programowe koordynowania operacji skalowania platformy Azure.

Uwaga

Zalecamy korzystanie z modułu Azure Az programu PowerShell do interakcji z platformą Azure. Zobacz Instalowanie programu Azure PowerShell, aby rozpocząć. Aby dowiedzieć się, jak przeprowadzić migrację do modułu Az PowerShell, zobacz Migracja programu Azure PowerShell z modułu AzureRM do modułu Az.

Zarządzanie poświadczeniami

Jednym z wyzwań związanych z pisaniem usługi do obsługi skalowania jest to, że usługa musi mieć dostęp do zasobów zestawu skalowania maszyn wirtualnych bez interaktywnego logowania. Uzyskiwanie dostępu do klastra usługi Service Fabric jest łatwe, jeśli usługa skalowania modyfikuje własną aplikację usługi Service Fabric, ale poświadczenia są wymagane do uzyskania dostępu do zestawu skalowania. Aby się zalogować, możesz użyć jednostki usługi utworzonej za pomocą interfejsu wiersza polecenia platformy Azure.

Jednostkę usługi można utworzyć, wykonując następujące kroki:

  1. Zaloguj się do interfejsu wiersza polecenia platformy Azure (az login) jako użytkownik z dostępem do zestawu skalowania maszyn wirtualnych
  2. Tworzenie jednostki usługi za pomocą polecenia az ad sp create-for-rbac
    1. Zanotuj identyfikator appId (o nazwie "identyfikator klienta" gdzie indziej), nazwę, hasło i dzierżawę do późniejszego użycia.
    2. Potrzebny będzie również identyfikator subskrypcji, który można wyświetlić za pomocą polecenia az account list

Płynna biblioteka obliczeniowa może zalogować się przy użyciu tych poświadczeń w następujący sposób (należy pamiętać, że podstawowe typy platformy Azure, takie jak IAzure , znajdują się w pakiecie 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 zalogowaniu można odpytować liczbę wystąpień zestawu skalowania za pomocą polecenia AzureClient.VirtualMachineScaleSets.GetById(ScaleSetId).Capacity.

Skalowanie w poziomie

Korzystając z płynnego zestawu Azure Compute SDK, wystąpienia można dodać do zestawu skalowania maszyn wirtualnych za pomocą zaledwie kilku wywołań —

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

Alternatywnie można zarządzać rozmiarem zestawu skalowania maszyn wirtualnych za pomocą poleceń cmdlet programu PowerShell. Get-AzVmss program może pobrać obiekt zestawu skalowania maszyn wirtualnych. Bieżąca pojemność jest dostępna za pośrednictwem .sku.capacity właściwości . Po zmianie pojemności na żądaną wartość zestaw skalowania maszyn wirtualnych na platformie Azure można zaktualizować za Update-AzVmss pomocą polecenia .

Podobnie jak w przypadku ręcznego dodawania węzła, dodanie wystąpienia zestawu skalowania powinno być niezbędne do uruchomienia nowego węzła usługi Service Fabric, ponieważ szablon zestawu skalowania zawiera rozszerzenia umożliwiające automatyczne dołączanie nowych wystąpień do klastra usługi Service Fabric.

Skalowanie w

Skalowanie w obiekcie jest podobne do skalowania w pęk. Rzeczywiste zmiany zestawu skalowania maszyn wirtualnych są praktycznie takie same. Jednak jak wspomniano wcześniej, usługa Service Fabric automatycznie czyści usunięte węzły z trwałością Gold lub Silver. W przypadku skalowania trwałości z brązu należy więc wchodzić w interakcje z klastrem usługi Service Fabric, aby wyłączyć węzeł do usunięcia, a następnie usunąć jego stan.

Przygotowanie węzła do zamknięcia obejmuje znalezienie węzła do usunięcia (ostatnio dodane wystąpienie zestawu skalowania maszyn wirtualnych) i jego dezaktywację. Wystąpienia zestawu skalowania maszyn wirtualnych są numerowane w kolejności ich dodawania, dlatego nowsze węzły można znaleźć, porównując sufiks liczbowy w nazwach węzłów (które są zgodne z nazwami wystąpień bazowego zestawu skalowania maszyn wirtualnych).

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

Po znalezieniu węzła do usunięcia można go dezaktywować i usunąć przy użyciu tego samego FabricClient wystąpienia i wystąpienia z wcześniejszej IAzure wersji.

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

Podobnie jak w przypadku skalowania w poziomie, polecenia cmdlet programu PowerShell do modyfikowania pojemności zestawu skalowania maszyn wirtualnych mogą być również używane tutaj, jeśli preferowane jest podejście skryptowe. Po usunięciu wystąpienia maszyny wirtualnej można usunąć stan węzła usługi Service Fabric.

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

Następne kroki

Aby rozpocząć wdrażanie własnej logiki automatycznego skalowania, zapoznaj się z następującymi pojęciami i przydatnymi interfejsami API: