Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Кластеры Service Fabric, работающие в Azure, основаны на масштабируемых наборах виртуальных машин. Масштабирование кластера описывает, как кластеры Service Fabric можно масштабировать вручную или с помощью правил автоматического масштабирования. В этой статье описывается, как управлять учетными данными и масштабировать кластер в или вне с помощью свободного пакета SDK для вычислений Azure, который является более сложным сценарием. Общие сведения см. в программных методах координации операций масштабирования Azure.
Примечание.
Мы рекомендуем использовать модуль Azure Az PowerShell для взаимодействия с Azure. Сведения о начале работы см. в статье "Установка Azure PowerShell". Чтобы узнать, как перейти на модуль Az PowerShell, см. статью Миграция Azure PowerShell с AzureRM на Az.
Управление учетными данными
Одной из проблем написания службы для обработки масштабирования является то, что служба должна иметь возможность доступа к ресурсам масштабируемого набора виртуальных машин без интерактивного входа. Доступ к кластеру Service Fabric прост, если служба масштабирования изменяет собственное приложение Service Fabric, но учетные данные необходимы для доступа к масштабируемой группе. Для входа можно использовать субъект-службу , созданный с помощью Azure CLI.
Субъект-служба можно создать с помощью следующих действий:
- Войдите в Azure CLI (
az login) в качестве пользователя с доступом к масштабируемой группе виртуальных машин. - Создание субъекта-службы с помощью
az ad sp create-for-rbac- Запишите идентификатор приложения ("идентификатор клиента" в другом месте), имя, пароль и клиент для последующего использования.
- Вам также потребуется идентификатор подписки, который можно просмотреть с помощью
az account list
Библиотека Fluent Compute может входить с помощью этих учетных данных следующим образом (обратите внимание, что основные типы Fluent Azure, такие как IAzure, находятся в пакете 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");
}
После входа в систему число экземпляров масштабируемого набора можно запросить с помощью AzureClient.VirtualMachineScaleSets.GetById(ScaleSetId).Capacity.
Масштабирование вширь
Используя пакет SDK для вычислений Azure fluent, экземпляры можно добавить в масштабируемый набор виртуальных машин с помощью нескольких вызовов.
var scaleSet = AzureClient.VirtualMachineScaleSets.GetById(ScaleSetId);
var newCapacity = (int)Math.Min(MaximumNodeCount, scaleSet.Capacity + 1);
scaleSet.Update().WithCapacity(newCapacity).Apply();
Управлять размером масштабируемого набора виртуальных машин также можно с помощью командлетов PowerShell.
Get-AzVmss может получить объект масштабируемого набора виртуальных машин. Доступ к текущей емкости осуществляется через свойство .sku.capacity. После изменения вместимости на желаемое значение, масштабируемый набор виртуальных машин в Azure можно обновить командой Update-AzVmss.
Как и при добавлении узла вручную, добавление экземпляра масштабируемого набора должно быть все, что необходимо для запуска нового узла Service Fabric, так как шаблон масштабируемого набора включает расширения для автоматического присоединения новых экземпляров к кластеру Service Fabric.
Увеличение масштаба
Масштабирование аналогично масштабированию. Фактические изменения масштабируемого набора виртуальных машин практически одинаковы. Но, как обсуждалось ранее, Service Fabric автоматически очищает только удаленные узлы с долговечностью Золото или Серебро. Таким образом, в случае масштабирования бронзовой устойчивости необходимо взаимодействовать с кластером Service Fabric, чтобы завершить удаление узла, а затем удалить его состояние.
Подготовка узла к завершению работы включает поиск узла, который будет удален (последний добавлен экземпляр масштабируемого набора виртуальных машин) и его деактивации. Экземпляры масштабируемого набора виртуальных машин нумеруются в том порядке, в котором они добавляются, поэтому новые узлы можно найти, сравнивая число суффикс в именах узлов (которые соответствуют именам экземпляров масштабируемого набора виртуальных машин).
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();
После того как узел будет найден, его можно отключить и удалить с помощью того же экземпляра FabricClient и ранее использованного экземпляра IAzure.
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();
Как и при горизонтальном масштабировании, командлеты PowerShell для изменения емкости масштабируемого набора виртуальных машин также можно использовать здесь, если подход к сценарию предпочтительнее. После удаления экземпляра виртуальной машины состояние узла Service Fabric можно удалить.
await client.ClusterManager.RemoveNodeStateAsync(mostRecentLiveNode.NodeName);
Дальнейшие действия
Чтобы приступить к реализации собственной логики автоматического масштабирования, ознакомьтесь со следующими понятиями и полезными API:
- Масштабирование вручную или с помощью правил автоматического масштабирования
- Библиотеки управления Azure для .NET (полезны для взаимодействия с базовыми масштабируемыми наборами виртуальных машин в кластере Service Fabric)
- System.FabricClient (полезно для взаимодействия с кластером Service Fabric и его узлами)