你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
将应用程序和服务作为 Azure 资源管理器资源进行管理
可以通过 Azure 资源管理器,将应用程序和服务部署到 Service Fabric 群集。 也就是说,现在可以使用 JSON 表示应用程序和服务,并在群集使用的同一个资源管理器模板中部署它们,而不用等待群集就绪,然后再通过 PowerShell 或 CLI 部署和管理应用程序。 只需执行一步操作,即可完成注册、预配和部署应用程序的整个过程。
这是部署群集所需的任意安装应用程序、治理应用程序或群集管理应用程序的推荐方法。 其中包括修补业务流程应用程序、监视程序,或部署其他应用程序/服务前群集需要运行的任何应用程序。
在适当情况下,将应用程序作为资源管理器资源进行管理可改进:
- 审核线索:资源管理器审核所有操作,并记录详细的活动日志 ,有助于跟踪对这些应用程序和群集做出的任何更改。
- Azure 基于角色的访问控制 (Azure RBAC):可通过同一个资源管理器模板,管理对群集及其上部署的应用程序的访问。
- Azure 资源管理器(通过 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')]"
}
将新应用程序添加到资源管理器模板
准备群集的资源管理器模板,以供部署时使用。 有关详细信息,请参阅使用 Azure 资源管理器创建 Service Fabric 群集。
考虑一下,打算在群集中部署的一些应用程序。 是否有始终要运行的被其他应用程序依赖的应用程序? 是否计划部署任何群集治理应用程序或安装应用程序? 如上所述,此类应用程序最好是通过资源管理器模板进行管理。
确定要使用此方法部署的应用程序后,需要立即打包、压缩这些应用程序,并将它们放置在存储共享上。 此共享必须可通过 REST 终结点进行访问,这样 Azure 资源管理器才能在部署期间使用它。 有关详细信息,请参阅创建存储帐户。
在资源管理器模板中的群集声明下,描述每个应用程序的属性。 这些属性包括副本或实例计数,以及资源(其他应用程序或服务)之间的任何依赖链。 请注意,这不会取代应用程序或服务清单,只是在群集的资源管理器模板中描述了清单的部分内容。 下面展示了示例模板,包括在 Application1 中部署无状态服务 Service1 和有状态服务 Service2:
{ "$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" } } ] }
注意
请查看 Service Fabric Azure 资源管理器参考,查找各个模板属性的使用情况和详细信息。
部署!
删除 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
只是从 ARM 模板中删除 Microsoft.ServiceFabric/clusters/application 不会取消预配应用程序。 如上所示的 Remove-AzResource PowerShell 命令或直接执行 REST DELETE 应用程序类型版本 - 删除 是可以使用的两个选项。
注意
删除完成后,你应该不会再在 SFX 或 ARM 中看到包版本。 你不能删除应用程序运行所使用的应用程序类型版本资源;ARM/SFRP 将阻止此操作。 如果你尝试取消预配正在运行的包,SF 运行时将阻止此操作。
通过资源管理器管理现有应用程序
如果群集已部署,且其上已部署一些要作为资源管理器资源进行管理的应用程序,可以使用相同的 API,将这些应用程序确定为资源管理器资源,从而执行 PUT 调用,而不用删除并重新部署应用程序。 有关更多信息,请参阅什么是 Service Fabric 应用程序资源模型?
注意
若要允许群集升级忽略不正常的应用,客户可以在“upgradeDescription/healthPolicy”节中指定“maxPercentUnhealthyApplications: 100”;有关所有设置的详细说明,请参阅 Service Fabrics REST API 群集升级策略文档。
后续步骤
- 使用 Service Fabric CLI 或 PowerShell,将其他应用程序部署到群集。
- 升级 Service Fabric 群集