Dela via


Hantera program och tjänster som Azure Resource Manager-resurser

Du kan distribuera program och tjänster på ditt Service Fabric-kluster via Azure Resource Manager. Det innebär att i stället för att distribuera och hantera program via PowerShell eller CLI efter att ha väntat på att klustret ska vara klart, kan du nu uttrycka program och tjänster i JSON och distribuera dem i samma Resource Manager-mall som klustret. Programregistrering, etablering och distribuering sker i ett enda steg.

Det här är det rekommenderade sättet för dig att distribuera alla konfigurations-, styrnings- eller klusterhanteringsprogram som du behöver i klustret. Detta inkluderar patchorkestreringsprogrammet, vakthundar eller program som måste köras i klustret innan andra program eller tjänster distribueras.

När det är tillämpligt kan du hantera dina program som Resource Manager-resurser för att förbättra:

  • Spårningslogg: Resource Manager granskar varje åtgärd och behåller en detaljerad aktivitetslogg som kan hjälpa dig att spåra eventuella ändringar som gjorts i dessa program och ditt kluster.
  • Rollbaserad åtkomstkontroll i Azure (Azure RBAC): Hantera åtkomst till kluster och program som distribueras i klustret kan göras via samma Resource Manager-mall.
  • Azure Resource Manager (via Azure-portalen) blir en one-stop-shop för hantering av kluster och kritiska programdistributioner.

Följande kodfragment visar de olika typer av resurser som kan hanteras via en mall:

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

Lägga till ett nytt program i Resource Manager-mallen

  1. Förbered klustrets Resource Manager-mall för distribution. Mer information finns i Skapa ett Service Fabric-kluster med hjälp av Azure Resource Manager.

  2. Tänk på några av de program som du planerar att distribuera i klustret. Finns det några som alltid kommer att köras som andra program kan ha beroenden på? Planerar du att distribuera klusterstyrning eller installationsprogram? Den här typen av program hanteras bäst via en Resource Manager-mall enligt beskrivningen ovan.

  3. När du har listat ut vilka program du vill distribuera på det här sättet måste programmen paketeras, zippas och placeras på en lagringsresurs. Resursen måste vara tillgänglig via en REST-slutpunkt för att Azure Resource Manager ska kunna användas under distributionen. Mer information finns i Skapa ett lagringskonto .

  4. I Resource Manager-mallen, under klusterdeklarationen, beskriver du varje programs egenskaper. Dessa egenskaper omfattar antal repliker eller instanser och eventuella beroendekedjor mellan resurser (andra program eller tjänster). Observera att detta inte ersätter program- eller tjänstmanifesten, utan snarare beskriver en del av vad som finns i dem som en del av klustrets Resource Manager-mall. Här är en exempelmall som innehåller distribution av en tillståndslös tjänst Service1 och en tillståndskänslig tjänst Service2 som en del av 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"
         }
       }
     ]
    }
    

    Kommentar

    Se Service Fabric Azure Resource Manager-referensen för att hitta användning och information om enskilda mallegenskaper.

  5. Gruppera!

Ta bort programresursen för Service Fabric-resursprovidern

Följande utlöser att apppaketet avetableras från klustret, vilket rensar diskutrymmet som används:

$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

Om du bara tar bort Microsoft.ServiceFabric/clusters/application från ARM-mallen avetableras inte programmet. PowerShell-kommandot Remove-AzResource som du ser ovan eller utför en REST DELETE-programtypversion – Ta bort direkt är två alternativ som kan användas.

Kommentar

När borttagningen är klar bör du inte längre se paketversionen i SFX eller ARM. Du kan inte ta bort den programtypversionsresurs som programmet körs med. ARM/SFRP förhindrar detta. Om du försöker avetablera det löpande paketet förhindrar SF-körningen det.

Hantera ett befintligt program via Resource Manager

Om klustret redan är igång och vissa program som du vill hantera eftersom Resource Manager-resurser redan har distribuerats på det, kan du i stället för att ta bort programmen och distribuera dem igen använda ett PUT-anrop med samma API:er för att bekräfta programmen som Resource Manager-resurser. Mer information finns i Vad är Service Fabric-programresursmodellen?

Kommentar

Om du vill tillåta att en klusteruppgradering ignorerar appar som inte är felfria kan kunden ange "maxPercentUnhealthyApplications: 100" i avsnittet "upgradeDescription/healthPolicy". detaljerade beskrivningar för alla inställningar finns i dokumentationen för Service Fabrics REST API Cluster Upgrade Policy.

Nästa steg