Управление приложениями и службами как ресурсами Azure Resource Manager
Вы можете развертывать приложения и службы в кластере Service Fabric с помощью Azure Resource Manager. Это означает, что вместо развертывания приложений и управления ими с помощью PowerShell или CLI после ожидания готовности кластера теперь можно выразить приложения и службы в ФОРМАТЕ JSON и развернуть их в том же шаблоне Resource Manager, что и кластер. Процесс регистрации, подготовки и развертывания приложения происходит за один шаг.
Это рекомендуемый способ развертывания любых приложений установки, систем управления или приложений управления кластером, требуемых в кластере. К ним относятся приложение для управления исправлениями, модули наблюдения и любые приложения, которые нужно запустить в кластере перед развертыванием других приложений или служб.
Если это возможно, следует управлять приложениями как ресурсами Resource Manager, чтобы улучшить:
- Журнал аудита: Resource Manager выполняется аудит каждой операции и хранит подробный журнал действий, позволяющий отслеживать все изменения, внесенные в эти приложения и кластер.
- Управление доступом на основе ролей Azure (Azure RBAC): управление доступом к кластерам и приложениям, развернутыми в кластере, можно выполнить с помощью одного шаблона Resource Manager.
- Azure Resource Manager (посредством портала Azure) становится единым центром управления кластером и развертываниями важных приложений.
В следующем фрагменте кода показаны различные ресурсы, которыми можно управлять с помощью шаблона.
{
"apiVersion": "2019-03-01",
"type": "Microsoft.ServiceFabric/clusters/applicationTypes",
"name": "[concat(parameters('clusterName'), '/', parameters('applicationTypeName'))]",
"location": "[variables('clusterLocation')]",
},
{
"apiVersion": "2019-03-01",
"type": "Microsoft.ServiceFabric/clusters/applicationTypes/versions",
"name": "[concat(parameters('clusterName'), '/', parameters('applicationTypeName'), '/', parameters('applicationTypeVersion'))]",
"location": "[variables('clusterLocation')]",
},
{
"apiVersion": "2019-03-01",
"type": "Microsoft.ServiceFabric/clusters/applications",
"name": "[concat(parameters('clusterName'), '/', parameters('applicationName'))]",
"location": "[variables('clusterLocation')]",
},
{
"apiVersion": "2019-03-01",
"type": "Microsoft.ServiceFabric/clusters/applications/services",
"name": "[concat(parameters('clusterName'), '/', parameters('applicationName'), '/', parameters('serviceName'))]",
"location": "[variables('clusterLocation')]"
}
Добавление нового приложения в шаблон Resource Manager
Подготовьте шаблон Resource Manager кластера для развертывания. Дополнительные сведения см. в статье "Создание кластера Service Fabric с помощью Azure Resource Manager".
Подумайте, какие приложения планируется развернуть в кластере. Возможно, среди них есть приложения, которые будут всегда работать, и другие приложения будут зависеть от них? Планируется ли развертывание систем управления кластером или приложений установки? Такими приложениями лучше всего управлять с помощью шаблона Resource Manager, как описано выше.
Выяснив, какие приложения должны быть развернуты таким способом, эти приложения нужно упаковать, заархивировать в формате ZIP и поместить в общую папку для хранения. Этот файловый ресурс должен быть доступен через конечную точку REST, чтобы Azure Resource Manager мог использовать его во время развертывания. Дополнительные сведения см. в статье Создание учетной записи хранения.
В шаблоне Resource Manager под объявлением кластера опишите свойства каждого приложения. Эти свойства включают в себя количество реплик или экземпляров, а также все цепочки зависимостей между ресурсами (другие приложения или службы). Обратите внимание, что это не заменяет манифесты приложения или службы, а описывает некоторые из них как часть шаблона Resource Manager кластера. Ниже приведен пример шаблона, включающего развертывание службы без отслеживания состояния и службы с отслеживанием состояния в составе Application1:
{ "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json", "contentVersion": "1.0.0.0", "parameters": { "clusterName": { "type": "string", "defaultValue": "Cluster", "metadata": { "description": "Name of your cluster - Between 3 and 23 characters. Letters and numbers only." } }, "applicationTypeName": { "type": "string", "defaultValue": "ApplicationType", "metadata": { "description": "The application type name." } }, "applicationTypeVersion": { "type": "string", "defaultValue": "1", "metadata": { "description": "The application type version." } }, "appPackageUrl": { "type": "string", "metadata": { "description": "The URL to the application package sfpkg file." } }, "applicationName": { "type": "string", "defaultValue": "Application1", "metadata": { "description": "The name of the application resource." } }, "serviceName": { "type": "string", "defaultValue": "Application1~Service1", "metadata": { "description": "The name of the service resource in the format of {applicationName}~{serviceName}." } }, "serviceTypeName": { "type": "string", "defaultValue": "Service1Type", "metadata": { "description": "The name of the service type." } }, "serviceName2": { "type": "string", "defaultValue": "Application1~Service2", "metadata": { "description": "The name of the service resource in the format of {applicationName}~{serviceName}." } }, "serviceTypeName2": { "type": "string", "defaultValue": "Service2Type", "metadata": { "description": "The name of the service type." } } }, "variables": { "clusterLocation": "[resourcegroup().location]" }, "resources": [ { "apiVersion": "2019-03-01", "type": "Microsoft.ServiceFabric/clusters/applicationTypes", "name": "[concat(parameters('clusterName'), '/', parameters('applicationTypeName'))]", "location": "[variables('clusterLocation')]", "dependsOn": [], "properties": { "provisioningState": "Default" } }, { "apiVersion": "2019-03-01", "type": "Microsoft.ServiceFabric/clusters/applicationTypes/versions", "name": "[concat(parameters('clusterName'), '/', parameters('applicationTypeName'), '/', parameters('applicationTypeVersion'))]", "location": "[variables('clusterLocation')]", "dependsOn": [ "[concat('Microsoft.ServiceFabric/clusters/', parameters('clusterName'), '/applicationTypes/', parameters('applicationTypeName'))]" ], "properties": { "provisioningState": "Default", "appPackageUrl": "[parameters('appPackageUrl')]" } }, { "apiVersion": "2019-03-01", "type": "Microsoft.ServiceFabric/clusters/applications", "name": "[concat(parameters('clusterName'), '/', parameters('applicationName'))]", "location": "[variables('clusterLocation')]", "dependsOn": [ "[concat('Microsoft.ServiceFabric/clusters/', parameters('clusterName'), '/applicationTypes/', parameters('applicationTypeName'), '/versions/', parameters('applicationTypeVersion'))]" ], "properties": { "provisioningState": "Default", "typeName": "[parameters('applicationTypeName')]", "typeVersion": "[parameters('applicationTypeVersion')]", "parameters": {}, "upgradePolicy": { "upgradeReplicaSetCheckTimeout": "01:00:00.0", "forceRestart": "false", "rollingUpgradeMonitoringPolicy": { "healthCheckWaitDuration": "00:02:00.0", "healthCheckStableDuration": "00:05:00.0", "healthCheckRetryTimeout": "00:10:00.0", "upgradeTimeout": "01:00:00.0", "upgradeDomainTimeout": "00:20:00.0" }, "applicationHealthPolicy": { "considerWarningAsError": "false", "maxPercentUnhealthyDeployedApplications": "50", "defaultServiceTypeHealthPolicy": { "maxPercentUnhealthyServices": "50", "maxPercentUnhealthyPartitionsPerService": "50", "maxPercentUnhealthyReplicasPerPartition": "50" } } } } }, { "apiVersion": "2019-03-01", "type": "Microsoft.ServiceFabric/clusters/applications/services", "name": "[concat(parameters('clusterName'), '/', parameters('applicationName'), '/', parameters('serviceName'))]", "location": "[variables('clusterLocation')]", "dependsOn": [ "[concat('Microsoft.ServiceFabric/clusters/', parameters('clusterName'), '/applications/', parameters('applicationName'))]" ], "properties": { "provisioningState": "Default", "serviceKind": "Stateless", "serviceTypeName": "[parameters('serviceTypeName')]", "instanceCount": "-1", "partitionDescription": { "partitionScheme": "Singleton" }, "correlationScheme": [], "serviceLoadMetrics": [], "servicePlacementPolicies": [] } }, { "apiVersion": "2019-03-01", "type": "Microsoft.ServiceFabric/clusters/applications/services", "name": "[concat(parameters('clusterName'), '/', parameters('applicationName'), '/', parameters('serviceName2'))]", "location": "[variables('clusterLocation')]", "dependsOn": [ "[concat('Microsoft.ServiceFabric/clusters/', parameters('clusterName'), '/applications/', parameters('applicationName'))]" ], "properties": { "provisioningState": "Default", "serviceKind": "Stateful", "serviceTypeName": "[parameters('serviceTypeName2')]", "targetReplicaSetSize": "3", "minReplicaSetSize": "2", "replicaRestartWaitDuration": "00:01:00.0", "quorumLossWaitDuration": "00:02:00.0", "standByReplicaKeepDuration": "00:00:30.0", "partitionDescription": { "partitionScheme": "UniformInt64Range", "count": "5", "lowKey": "1", "highKey": "5" }, "hasPersistedState": "true", "correlationScheme": [], "serviceLoadMetrics": [], "servicePlacementPolicies": [], "defaultMoveCost": "Low" } } ] }
Примечание.
Дополнительные сведения о свойствах отдельных шаблонов см. в справочнике по Azure Resource Manager для Service Fabric.
Разверните шаблон.
Удаление ресурса приложения поставщика ресурсов Service Fabric
В следующем случае пакет приложения будет отключен из кластера, и это приведет к очистке места на диске, используемого:
$resourceGroup = 'sftestcluster'
$cluster = $resourceGroup
$applicationType = 'VotingType'
$application = 'Voting'
$applicationVersion = '1.0.0'
$sf = Get-AzResource -ResourceGroupName $resourceGroup -ResourceName $cluster
$app = Get-AzResource -ResourceId "$($sf.Id)/applications/$application"
$appType = Get-AzResource -ResourceId "$($sf.Id)/applicationTypes/$applicationType"
$appTypeVersion = Get-AzResource -ResourceId "$($appType.Id)/versions/$applicationVersion"
# remove application
Remove-AzResource -ResourceId $app.Id
# remove application type version
Remove-AzResource -ResourceId $appTypeVersion.Id
# remove application type
# Remove-AzResource -ResourceId $appType.Id
Простое удаление Microsoft.ServiceFabric/clusters/application из шаблона ARM не приведет к отмене подготовки приложения. Команда PowerShell Remove-AzResource, как показано выше или выполнение версий типа приложения REST DELETE . Удалить напрямую являются двумя параметрами, которые можно использовать.
Примечание.
Когда удаление завершится, вы не увидите эту версию пакета в SFX или ARM. Нельзя удалить ресурс версии для типа приложения, с которым выполняется приложение. ARM или SFRP заблокирует такую операцию. Если вы попытаетесь отменить подготовку выполняющегося пакета, среда выполнения Service Fabric заблокирует такую операцию.
Управление существующим приложением с помощью Resource Manager
Если кластер уже запущен и в нем развернуто несколько приложений, которыми требуется управлять как ресурсами Resource Manager, то вместо удаления этих приложений и их повторного развертывания можно использовать вызов PUT с использованием тех же интерфейсов API, чтобы эти приложения были подтверждены как ресурсы Resource Manager. Дополнительные сведения см. в статье "Что такое модель ресурсов приложения Service Fabric?"
Примечание.
Чтобы позволить обновлению кластера игнорировать неработоспособные приложения, клиент может указать "maxPercentUnhealthyApplications: 100" в разделе "upgradeDescription/healthPolicy". Подробные описания всех параметров приведены в документации по политике обновления REST API для кластера Service Fabrics.
Следующие шаги
- Используйте интерфейс командной строки Service Fabric или PowerShell для развертывания других приложений в кластере.
- Обновите кластер Service Fabric.