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:
- Entre na CLI do Azure (
az login
) como um usuário com acesso ao conjunto de dimensionamento de máquina virtual - Crie a entidade de serviço com
az ad sp create-for-rbac
- Anote o appId (chamado de 'ID do cliente' em outro lugar), nome, senha e locatário para uso posterior.
- 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:
- Dimensionamento manual ou com regras de dimensionamento automático
- Bibliotecas de Gerenciamento do Azure para .NET (úteis para interagir com os conjuntos de escala de máquina virtual subjacentes de um cluster do Service Fabric)
- System.Fabric.FabricClient (útil para interagir com um cluster do Service Fabric e seus nós)