Toepassingen en services beheren als Azure Resource Manager-resources

U kunt toepassingen en services implementeren in uw Service Fabric-cluster via Azure Resource Manager. Dit betekent dat u in plaats van toepassingen te implementeren en te beheren via PowerShell of CLI nadat u hebt gewacht totdat het cluster gereed is, u nu toepassingen en services in JSON kunt uitdrukken en implementeren in dezelfde Resource Manager sjabloon als uw cluster. Het proces van toepassingsregistratie, inrichting en implementatie vindt allemaal in één stap plaats.

Dit is de aanbevolen manier voor het implementeren van alle installatie-, governance- of clusterbeheertoepassingen die u nodig hebt in uw cluster. Dit omvat de Patch Orchestration-toepassing, Watchdogs of toepassingen die in uw cluster moeten worden uitgevoerd voordat andere toepassingen of services worden geïmplementeerd.

Indien van toepassing, beheert u uw toepassingen als Resource Manager resources om te verbeteren:

  • Audittrail: Resource Manager controleert elke bewerking en houdt een gedetailleerd activiteitenlogboek bij waarmee u eventuele wijzigingen in deze toepassingen en uw cluster kunt traceren.
  • Op rollen gebaseerd toegangsbeheer van Azure (Azure RBAC): het beheren van de toegang tot clusters en toepassingen die op het cluster zijn geïmplementeerd, kan worden uitgevoerd via dezelfde Resource Manager sjabloon.
  • Azure Resource Manager (via Azure Portal) wordt een one-stop-shop voor het beheren van uw cluster en kritieke toepassingsimplementaties.

In het volgende codefragment ziet u de verschillende soorten resources die kunnen worden beheerd via een sjabloon:

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

Een nieuwe toepassing toevoegen aan uw Resource Manager-sjabloon

  1. Bereid de Resource Manager-sjabloon van uw cluster voor op implementatie. Zie Een Service Fabric-cluster maken met behulp van Azure Resource Manager voor meer informatie.

  2. Denk aan enkele toepassingen die u in het cluster wilt implementeren. Zijn er er die altijd worden uitgevoerd waarop andere toepassingen afhankelijk kunnen zijn? Wilt u clusterbeheer implementeren of toepassingen instellen? Dit soort toepassingen kunt u het beste beheren via een Resource Manager-sjabloon, zoals hierboven is besproken.

  3. Zodra u hebt vastgesteld welke toepassingen u op deze manier wilt implementeren, moeten de toepassingen worden verpakt, gezipt en op een opslagshare worden geplaatst. De share moet toegankelijk zijn via een REST-eindpunt om Azure Resource Manager tijdens de implementatie te kunnen gebruiken. Zie Een opslagaccount maken voor meer informatie.

  4. Beschrijf in uw Resource Manager-sjabloon, onder uw clusterdeclaratie, de eigenschappen van elke toepassing. Deze eigenschappen omvatten het aantal replica's of exemplaren en eventuele afhankelijkheidsketens tussen resources (andere toepassingen of services). Houd er rekening mee dat dit niet de toepassings- of servicemanifesten vervangt, maar een deel van de inhoud ervan beschrijft als onderdeel van de Resource Manager-sjabloon van het cluster. Hier volgt een voorbeeldsjabloon met het implementeren van een stateless service Service1 en een stateful service Service2 als onderdeel van 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"
         }
       }
     ]
    }
    

    Notitie

    Raadpleeg de Service Fabric Azure Resource Manager-verwijzing om het gebruik en de details van afzonderlijke sjablooneigenschappen te vinden.

  5. Implementeren!

Service Fabric-resourceprovidertoepassingsresource verwijderen

Met het volgende wordt het app-pakket geactiveerd om de inrichting van het cluster ongedaan te maken en wordt de gebruikte schijfruimte opgeschoond:

$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

Als u Microsoft.ServiceFabric/clusters/application verwijdert uit uw ARM-sjabloon, wordt de inrichting van de toepassing niet ongedaan gemaakt. PowerShell-opdracht Remove-AzResource zoals hierboven wordt weergegeven of het uitvoeren van een REST DELETE-toepassingstypeVersies: rechtstreeks verwijderen zijn twee opties die kunnen worden gebruikt.

Notitie

Zodra de verwijdering is voltooid, ziet u de pakketversie niet meer in SFX of ARM. U kunt de versieresource van het toepassingstype waarmee de toepassing wordt uitgevoerd, niet verwijderen. ARM/SFRP voorkomt dit. Als u de inrichting van het actieve pakket ongedaan probeert te maken, wordt dit door SF-runtime voorkomen.

Een bestaande toepassing beheren via Resource Manager

Als uw cluster al is ingeschakeld en sommige toepassingen die u wilt beheren als Resource Manager resources al op het cluster zijn geïmplementeerd, kunt u in plaats van de toepassingen te verwijderen en opnieuw te implementeren, een PUT-aanroep gebruiken met dezelfde API's om de toepassingen te laten erkennen als Resource Manager resources. Zie Wat is het Service Fabric-toepassingsresourcemodel? voor meer informatie.

Notitie

Als u wilt toestaan dat een clusterupgrade beschadigde apps negeert, kan de klant 'maxPercentUnhealthyApplications: 100' opgeven in de sectie upgradeDescription/healthPolicy; Gedetailleerde beschrijvingen voor alle instellingen zijn te lezen in de documentatie over service fabrics REST API-clusterupgradebeleid.

Volgende stappen