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:
- Iniciar sessão na CLI do Azure (
az login
) como um utilizador com acesso ao conjunto de dimensionamento de máquinas virtuais - Criar o principal de serviço com
az ad sp create-for-rbac
- Anote o appId (denominado "ID do cliente" noutro local), o nome, a palavra-passe e o inquilino para utilização posterior.
- 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:
- Dimensionar manualmente ou com regras de dimensionamento automático
- Bibliotecas de Gestão do Azure para .NET (útil para interagir com os conjuntos de dimensionamento de máquinas virtuais subjacentes de um cluster do Service Fabric)
- System.Fabric.FabricClient (útil para interagir com um cluster do Service Fabric e os respetivos nós)