Gerir aplicações e serviços como recursos de Resource Manager do Azure

Pode implementar aplicações e serviços no cluster do Service Fabric através do Azure Resource Manager. Isto significa que, em vez de implementar e gerir aplicações através do PowerShell ou da CLI depois de aguardar que o cluster esteja pronto, pode agora expressar aplicações e serviços em JSON e implementá-los no mesmo modelo de Resource Manager que o cluster. O processo de registo, aprovisionamento e implementação de aplicações ocorre num único passo.

Esta é a forma recomendada para implementar quaisquer aplicações de configuração, governação ou gestão de clusters necessárias no cluster. Isto inclui a Aplicação de Orquestração de Patches, Watchdogs ou quaisquer aplicações que precisem de ser executadas no cluster antes de outras aplicações ou serviços serem implementados.

Quando aplicável, faça a gestão das suas aplicações como Resource Manager recursos para melhorar:

  • Registo de auditoria: Resource Manager audita todas as operações e mantém um Registo de Atividades detalhado que pode ajudá-lo a rastrear quaisquer alterações efetuadas a estas aplicações e ao cluster.
  • Controlo de acesso baseado em funções do Azure (RBAC do Azure): a gestão do acesso a clusters e aplicações implementadas no cluster pode ser feita através do mesmo modelo de Resource Manager.
  • O Azure Resource Manager (através de portal do Azure) torna-se um ponto de paragem para gerir o cluster e implementações de aplicações críticas.

O fragmento seguinte mostra os diferentes tipos de recursos que podem ser geridos através 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 uma nova aplicação ao modelo de Resource Manager

  1. Prepare o modelo de Resource Manager do cluster para implementação. Para obter mais informações, veja Criar um cluster do Service Fabric com o Azure Resource Manager.

  2. Pense em algumas das aplicações que planeia implementar no cluster. Existe alguma que esteja sempre em execução na qual outras aplicações possam assumir dependências? Planeia implementar aplicações de governação ou configuração de clusters? Estes tipos de aplicações são melhor geridos através de um modelo de Resource Manager, conforme abordado acima.

  3. Depois de descobrir as aplicações que pretende implementar desta forma, as aplicações têm de ser empacotadas, zipadas e colocadas numa partilha de armazenamento. A partilha tem de estar acessível através de um ponto final REST para o Azure Resource Manager consumir durante a implementação. Veja Criar uma conta de armazenamento para obter detalhes.

  4. No modelo de Resource Manager, abaixo da declaração do cluster, descreva as propriedades de cada aplicação. Estas propriedades incluem a contagem de réplicas ou instâncias e quaisquer cadeias de dependência entre recursos (outras aplicações ou serviços). Tenha em atenção que isto não substitui os manifestos da Aplicação ou do Serviço, mas descreve alguns dos que estão neles como parte do modelo de Resource Manager do cluster. Eis um modelo de exemplo que inclui a implementação de um serviço sem estado Service1 e um serviço com monitorização de estado Service2 como parte da Aplicação1:

    {
     "$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

    Veja a referência do Azure do Service Fabric Resource Manager para encontrar a utilização e os detalhes sobre as propriedades de modelo individuais.

  5. Implementar!

Remover recurso da Aplicação do Fornecedor de Recursos do Service Fabric

O seguinte irá acionar o pacote de aplicação para ser aprovisionado do cluster, o que limpará o espaço em disco utilizado:

$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

Simplesmente remover Microsoft.ServiceFabric/clusters/aplicação do seu modelo do ARM não aprovisionará a Aplicação. O comando do PowerShell Remove-AzResource conforme mostrado acima ou executar versões do Tipo de Aplicação REST DELETE – Eliminar diretamente são duas opções que podem ser utilizadas.

Nota

Assim que a remoção estiver concluída, já não deverá ver a versão do pacote no SFX ou arm. Não pode eliminar o recurso de versão do tipo de aplicação com o qual a aplicação está a ser executada; O ARM/SFRP irá impedir esta situação. Se tentar anular o aprovisionamento do pacote em execução, o runtime do SF irá impedi-lo.

Gerir uma aplicação existente através de Resource Manager

Se o cluster já estiver ativo e algumas aplicações que gostaria de gerir como Resource Manager recursos já estiverem implementados no mesmo, em vez de remover as aplicações e voltar a implementá-las, pode utilizar uma chamada PUT com as mesmas APIs para que as aplicações sejam reconhecidas como recursos Resource Manager. Para obter informações adicionais, veja O que é o modelo de recursos de aplicação do Service Fabric?

Nota

Para permitir que uma atualização do cluster ignore aplicações em mau estado de funcionamento, o cliente pode especificar "maxPercentUnhealthyApplications: 100" na secção "upgradeDescription/healthPolicy"; As descrições detalhadas de todas as definições estão na documentação da Política de Atualização do Cluster da API REST do Service Fabrics.

Passos seguintes