Správa aplikací a služeb jako prostředků Azure Resource Manager

Aplikace a služby můžete nasadit do clusteru Service Fabric prostřednictvím Azure Resource Manager. To znamená, že místo nasazení a správy aplikací přes PowerShell nebo rozhraní příkazového řádku po čekání na připravenost clusteru teď můžete aplikace a služby vyjádřit ve formátu JSON a nasadit je ve stejné šabloně Resource Manager jako cluster. Proces registrace, zřizování a nasazení aplikací probíhá v jednom kroku.

Toto je doporučený způsob nasazení všech aplikací nastavení, zásad správného řízení nebo správy clusteru, které v clusteru požadujete. To zahrnuje aplikaci Pro orchestraci oprav, watchdogy nebo všechny aplikace, které je potřeba spustit v clusteru před nasazením jiných aplikací nebo služeb.

Pokud je to možné, spravujte své aplikace jako Resource Manager prostředky, abyste mohli zlepšit:

  • Záznam auditu: Resource Manager audituje všechny operace a uchovává podrobný protokol aktivit, který vám může pomoct sledovat všechny změny provedené v těchto aplikacích a clusteru.
  • Řízení přístupu na základě role v Azure (Azure RBAC): Správa přístupu ke clusterům a aplikacím nasazeným v clusteru se dá provádět pomocí stejné šablony Resource Manager.
  • Azure Resource Manager (prostřednictvím Azure Portal) se stává jediným místem pro správu clusteru a důležitých nasazení aplikací.

Následující fragment kódu ukazuje různé druhy prostředků, které je možné spravovat prostřednictvím šablony:

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

Přidání nové aplikace do šablony Resource Manager

  1. Připravte šablonu Resource Manager clusteru k nasazení. Další informace najdete v tématu Vytvoření clusteru Service Fabric pomocí Azure Resource Manager.

  2. Zamyslete se nad některými aplikacemi, které plánujete nasadit v clusteru. Jsou vždy spuštěné nějaké aplikace, na kterých můžou být závislé jiné aplikace? Plánujete nasadit nějaké zásady správného řízení clusteru nebo nastavit aplikace? Tyto druhy aplikací se nejlépe spravují pomocí šablony Resource Manager, jak je popsáno výše.

  3. Jakmile zjistíte, jaké aplikace chcete tímto způsobem nasadit, je potřeba je zabalit, zazipovat a umístit do sdílené složky úložiště. Sdílená složka musí být přístupná prostřednictvím koncového bodu REST, aby azure Resource Manager spotřebovávat během nasazování. Podrobnosti najdete v tématu Vytvoření účtu úložiště .

  4. V šabloně Resource Manager pod deklarací clusteru popište vlastnosti jednotlivých aplikací. Mezi tyto vlastnosti patří počet replik nebo instancí a všechny řetězce závislostí mezi prostředky (jinými aplikacemi nebo službami). Všimněte si, že tím nenahrazujete manifesty aplikace nebo služby, ale spíše popisuje část toho, co v nich je, jako součást šablony Resource Manager clusteru. Tady je ukázková šablona, která zahrnuje nasazení bezstavové služby Service1 a stavové služby Service2 v rámci Aplikace1:

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

    Poznámka

    Informace o využití a podrobnosti o vlastnostech jednotlivých šablon najdete v odkazu na Service Fabric Azure Resource Manager.

  5. Nasazení!

Odebrání prostředku aplikace poskytovatele prostředků Service Fabric

Následující příkaz aktivuje zrušení zřízení balíčku aplikace v clusteru a tím se vyčistí využité místo na disku:

$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

Pouhým odebráním technologie Microsoft.ServiceFabric/clusters/application ze šablony ARM se zřízení aplikace neodejde. Příkaz PowerShellu Remove-AzResource, jak je znázorněno výše, nebo provedení verze typu aplikace REST DELETE – Přímé odstranění jsou dvě možnosti, které se dají použít.

Poznámka

Po dokončení odebrání by se už verze balíčku neměla zobrazovat v SFX nebo ARM. Nelze odstranit prostředek verze typu aplikace, se kterým je aplikace spuštěna. Arm/SFRP tomu zabrání. Pokud se pokusíte zrušit zřízení spuštěného balíčku, modul runtime SF tomu zabrání.

Správa existující aplikace prostřednictvím Resource Manager

Pokud už je váš cluster spuštěný a některé aplikace, které chcete spravovat jako Resource Manager prostředky, už jsou nasazené, můžete místo odebrání aplikací a jejich opětovného nasazení použít volání PUT pomocí stejných rozhraní API, aby se aplikace potvrdily jako Resource Manager prostředky. Další informace najdete v tématu Co je model prostředků aplikace Service Fabric?

Poznámka

Pokud chcete, aby upgrade clusteru ignoroval aplikace, které nejsou v pořádku, zákazník může v části upgradeDescription/healthPolicy zadat maxPercentUnhealthyApplications: 100. Podrobné popisy pro všechna nastavení najdete v dokumentaci k zásadám upgradu clusteru service Fabrics REST API.

Další kroky