Compartilhar via


Gerenciar aplicativos e serviços como recursos do Azure Resource Manager

Pode implementar serviços e aplicações no seu cluster do Service Fabric através do Azure Resource Manager. Isso significa que, em vez de implantar e gerenciar aplicativos via PowerShell ou CLI depois de esperar que o cluster esteja pronto, agora você pode expressar aplicativos e serviços em JSON e implantá-los no mesmo modelo do Gerenciador de Recursos que o cluster. Pode realizar o processo de registo, aprovisionamento e implementação de aplicações com um único passo.

Essa é a maneira recomendada de implantar qualquer aplicativo de instalação, governança ou gerenciamento de cluster necessário em seu cluster. Isso inclui o Patch Orchestration Application, o Watchdogs ou quaisquer aplicativos que precisem ser executados em seu cluster antes que outros aplicativos ou serviços sejam implantados.

Quando aplicável, gerencie seus aplicativos como recursos do Gerenciador de Recursos para melhorar:

  • Trilha de auditoria: o Gerenciador de Recursos audita todas as operações e mantém um Registro de Atividades detalhado que pode ajudá-lo a rastrear quaisquer alterações feitas nesses aplicativos e no cluster.
  • Controle de acesso baseado em função do Azure (Azure RBAC): o gerenciamento do acesso a clusters e aplicativos implantados no cluster pode ser feito por meio do mesmo modelo do Gerenciador de Recursos.
  • O Azure Resource Manager (através do portal do Azure) torna-se um balcão único para gerir o seu cluster e implementações de aplicações críticas.

O trecho a seguir mostra os diferentes tipos de recursos que podem ser gerenciados por meio de um modelo:

{
    "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')]"
}

Adicionar um novo aplicativo ao seu modelo do Gerenciador de Recursos

  1. Prepare o modelo do Gerenciador de Recursos do cluster para implantação. Para obter mais informações, consulte Criar um cluster do Service Fabric usando o Azure Resource Manager.

  2. Pense em alguns dos aplicativos que você planeja implantar no cluster. Há algum que esteja sempre em execução e que outros aplicativos possam ter dependências? Você planeja implantar algum aplicativo de governança ou configuração de cluster? Esses tipos de aplicativos são melhor gerenciados por meio de um modelo do Gerenciador de Recursos, conforme discutido acima.

  3. Depois de descobrir quais aplicativos você deseja implantar dessa forma, os aplicativos precisam ser empacotados, compactados e colocados em um compartilhamento de armazenamento. O compartilhamento precisa estar acessível por meio de um ponto de extremidade REST para o Azure Resource Manager consumir durante a implantação. Consulte Criar uma conta de armazenamento para obter detalhes.

  4. No modelo do Resource Manager, abaixo da declaração de cluster, descreva as propriedades de cada aplicativo. Essas propriedades incluem a contagem de réplicas ou instâncias e quaisquer cadeias de dependência entre recursos (outros aplicativos ou serviços). Observe que isso não substitui os manifestos do Aplicativo ou Serviço, mas descreve parte do que está neles como parte do modelo do Gerenciador de Recursos do cluster. Aqui está um modelo de exemplo que inclui a implantação de um serviço sem estado Service1 e um serviço stateful Service2 como parte do 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"
         }
       }
     ]
    }
    

    Nota

    Consulte a referência do Service Fabric Azure Resource Manager para localizar o uso e os detalhes sobre as propriedades individuais do modelo.

  5. Implante!

Remover recurso do aplicativo do provedor de recursos do Service Fabric

O seguinte acionará o pacote do aplicativo a ser desprovisionado do cluster, e isso limpará o espaço em disco usado:

$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

Basta remover Microsoft.ServiceFabric/clusters/application do seu modelo ARM para não desprovisionar o Aplicativo. Comando do PowerShell Remove-AzResource como mostrado acima ou executando um REST DELETE Application Type Versions - Delete directly são duas opções que podem ser usadas.

Nota

Quando a remoção estiver concluída, você não verá mais a versão do pacote em SFX ou ARM. Não é possível excluir o recurso de versão do tipo de aplicativo com o qual o aplicativo está sendo executado; O ARM/SPRP evitará isso. Se você tentar desprovisionar o pacote em execução, o tempo de execução do SF o impedirá.

Gerenciar um aplicativo existente por meio do Gerenciador de Recursos

Se o cluster já estiver ativo e alguns aplicativos que você gostaria de gerenciar como recursos do Resource Manager já estiverem implantados nele, em vez de remover os aplicativos e reimplantá-los, você poderá usar uma chamada PUT usando as mesmas APIs para que os aplicativos sejam reconhecidos como recursos do Resource Manager. Para obter informações adicionais, consulte O que é o modelo de recursos do aplicativo Service Fabric?

Nota

Para permitir que uma atualização de cluster ignore aplicativos não íntegros, o cliente pode especificar "maxPercentUnhealthyApplications: 100" na seção "upgradeDescription/healthPolicy"; as descrições detalhadas de todas as configurações estão na documentação da Política de Atualização de Cluster da API REST do Service Fabrics.

Próximos passos