Partilhar via


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 cluster descreve como os clusters do Service Fabric podem ser dimensionados manualmente ou com regras de dimensionamento automático. Este artigo descreve como gerenciar credenciais e dimensionar um cluster para dentro ou para fora usando o SDK de computação fluente do Azure, que é um cenário mais avançado. Para obter uma visão geral, leia os métodos programáticos de coordenação de operações de dimensionamento do Azure.

Nota

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

Gerir credenciais

Um desafio de escrever um serviço para lidar com o dimensionamento é que o serviço deve ser capaz de acessar recursos de conjunto de escala de máquina virtual sem um login interativo. Acessar o cluster do Service Fabric é fácil se o serviço de dimensionamento estiver modificando seu próprio aplicativo do Service Fabric, mas as credenciais são necessárias para acessar o conjunto de escala. Para entrar, você pode usar uma entidade de serviço criada com a CLI do Azure.

Uma entidade de serviço pode ser criada com as seguintes etapas:

  1. Entre na CLI do Azure (az login) como um usuário com acesso ao conjunto de dimensionamento de máquina virtual
  2. Crie a entidade de serviço com az ad sp create-for-rbac
    1. Anote o appId (chamado de 'ID do cliente' em outro lugar), nome, senha e locatário para uso posterior.
    2. Você também precisará do seu ID de assinatura, que pode ser visualizado com az account list

A biblioteca de computação fluent pode entrar usando essas credenciais da seguinte maneira (observe que os tipos principais 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");
}

Uma vez conectado, a contagem de instâncias do conjunto de escala pode ser consultada via AzureClient.VirtualMachineScaleSets.GetById(ScaleSetId).Capacity.

Aumentar horizontalmente

Usando o SDK de computação fluente do Azure, as instâncias podem ser adicionadas ao conjunto de escala da máquina virtual com apenas algumas chamadas -

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

Como alternativa, o tamanho do conjunto de escala da máquina virtual também pode ser gerenciado com cmdlets do PowerShell. Get-AzVmss pode recuperar o objeto do conjunto de escala da máquina virtual. A capacidade atual está disponível através da .sku.capacity propriedade. Depois de alterar a capacidade para o valor desejado, a escala da máquina virtual definida no Azure pode ser atualizada com o Update-AzVmss comando.

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

Escalonamento em

O dimensionamento é semelhante ao dimensionamento. As alterações reais do conjunto de escala da máquina virtual são praticamente as mesmas. Mas, como foi discutido anteriormente, o Service Fabric só limpa automaticamente os nós removidos com uma durabilidade de Gold ou Silver. Assim, no caso da escala de durabilidade Bronze, é necessário interagir com o cluster do Service Fabric para desligar o nó a ser removido e, em seguida, remover seu estado.

A preparação do nó para o desligamento envolve encontrar o nó a ser removido (a instância do conjunto de escala de máquina virtual adicionada mais recentemente) e desativá-lo. As instâncias do conjunto de escala da máquina virtual são numeradas na ordem em que são adicionadas, de modo que os nós mais recentes podem ser encontrados comparando o sufixo numérico nos nomes dos nós (que correspondem aos nomes de instância do conjunto de escala da máquina virtual subjacente).

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

Uma vez que o nó a ser removido é encontrado, ele pode ser desativado e removido usando a mesma FabricClient instância e a IAzure instância anterior.

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

Assim como acontece com a expansão, os cmdlets do PowerShell para modificar a capacidade do conjunto de escala da máquina virtual também podem ser usados aqui se uma abordagem de script for preferível. Depois que a instância da máquina virtual for removida, o estado do nó do Service Fabric poderá ser removido.

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

Próximos passos

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