Dimensionar um cluster do Service Fabric programaticamente

Os clusters do Service Fabric em execução no Azure são criados com base em conjuntos de dimensionamento de máquinas virtuais. O dimensionamento de clusters descreve como os clusters do Service Fabric podem ser dimensionados manualmente ou com regras de dimensionamento automático. Este artigo descreve como gerir credenciais e dimensionar um cluster para dentro ou para fora com o fluente SDK de computação do Azure, que é um cenário mais avançado. Para obter uma descrição geral, leia os métodos programáticos de coordenação das operações de dimensionamento do Azure.

Nota

Recomendamos que utilize o módulo do Azure Az PowerShell para interagir com o Azure. Veja Instalar o Azure PowerShell para começar. Para saber como migrar para o módulo do Az PowerShell, veja Migrar o Azure PowerShell do AzureRM para o Az.

Gerir credenciais

Um dos desafios de escrever um serviço para processar o dimensionamento é que o serviço tem de conseguir aceder aos recursos do conjunto de dimensionamento de máquinas virtuais sem um início de sessão interativo. Aceder ao cluster do Service Fabric é fácil se o serviço de dimensionamento estiver a modificar a sua própria aplicação do Service Fabric, mas são necessárias credenciais para aceder ao conjunto de dimensionamento. Para iniciar sessão, pode utilizar um principal de serviço criado com a CLI do Azure.

Um principal de serviço pode ser criado com os seguintes passos:

  1. Iniciar sessão na CLI do Azure (az login) como um utilizador com acesso ao conjunto de dimensionamento de máquinas virtuais
  2. Criar o principal de serviço com az ad sp create-for-rbac
    1. Anote o appId (denominado "ID do cliente" noutro local), o nome, a palavra-passe e o inquilino para utilização posterior.
    2. Também precisará do ID da subscrição, que pode ser visualizado com az account list

A biblioteca de computação fluente pode iniciar sessão com estas credenciais da seguinte forma (tenha em atenção que os principais tipos fluentes do Azure como IAzure estão no pacote 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");
}

Depois de iniciar sessão, a contagem de instâncias do conjunto de dimensionamento pode ser consultada através de AzureClient.VirtualMachineScaleSets.GetById(ScaleSetId).Capacity.

Aumentar horizontalmente

Com o fluente SDK de computação do Azure, as instâncias podem ser adicionadas ao conjunto de dimensionamento de máquinas virtuais com apenas algumas chamadas -

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

Em alternativa, o tamanho do conjunto de dimensionamento de máquinas virtuais também pode ser gerido com cmdlets do PowerShell. Get-AzVmss pode obter o objeto do conjunto de dimensionamento de máquinas virtuais. A capacidade atual está disponível através da .sku.capacity propriedade. Depois de alterar a capacidade para o valor pretendido, o conjunto de dimensionamento de máquinas virtuais no Azure pode ser atualizado com o Update-AzVmss comando .

Tal como ao adicionar um nó manualmente, adicionar uma instância de conjunto de dimensionamento deve ser tudo o que é necessário para iniciar um novo nó do Service Fabric, uma vez que o modelo do conjunto de dimensionamento inclui extensões para associar automaticamente novas instâncias ao cluster do Service Fabric.

Dimensionamento no

O dimensionamento é semelhante ao aumento horizontal. As alterações reais do conjunto de dimensionamento de máquinas virtuais são praticamente as mesmas. Mas, tal como foi discutido anteriormente, o Service Fabric apenas limpa automaticamente os nós removidos com uma durabilidade de Ouro ou Prata. Assim, no caso de dimensionamento de durabilidade de Bronze, é necessário interagir com o cluster do Service Fabric para encerrar o nó a remover e, em seguida, remover o estado.

Preparar o nó para encerramento envolve encontrar o nó a ser removido (a instância do conjunto de dimensionamento de máquinas virtuais adicionada mais recentemente) e desativar o mesmo. As instâncias do conjunto de dimensionamento de máquinas virtuais são numeradas pela ordem em que são adicionadas, pelo que os nós mais recentes podem ser encontrados ao comparar o sufixo de número nos nomes dos nós (que correspondem aos nomes das instâncias do conjunto de dimensionamento de máquinas virtuais subjacentes).

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

Assim que o nó a remover for encontrado, pode ser desativado e removido com a mesma FabricClient instância e a IAzure instância de anteriormente.

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

Tal como acontece com o aumento horizontal, os cmdlets do PowerShell para modificar a capacidade do conjunto de dimensionamento de máquinas virtuais também podem ser utilizados aqui se uma abordagem de scripting for preferível. Assim que a instância da máquina virtual for removida, o estado do nó do Service Fabric pode ser removido.

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

Passos seguintes

Para começar a implementar a sua própria lógica de dimensionamento automático, familiarize-se com os seguintes conceitos e APIs úteis: