Dela via


Hantera program och tjänster som Azure Resource Manager resurser

Du kan distribuera program och tjänster till 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. Processen för programregistrering, etablering och distribution sker i ett enda steg.

Det här är det rekommenderade sättet att distribuera alla konfigurations-, styrnings- eller klusterhanteringsprogram som du behöver i klustret. Detta inkluderar Patch Orchestration-programmet, Watchdogs eller alla 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 ändringar som gjorts i dessa program och i klustret.
  • Rollbaserad åtkomstkontroll i Azure (Azure RBAC): Hantering av åtkomst till kluster och program som distribueras i klustret kan göras via samma Resource Manager mall.
  • Azure Resource Manager (via Azure Portal) blir en enda kontaktpunkt för hantering av kluster och kritiska programdistributioner.

Följande kodfragment visar de olika typerna 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 din Resource Manager-mall

  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 konfigurera program? 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 mallen Resource Manager under klusterdeklarationen beskriver du egenskaperna för varje program. 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 beskriver snarare några av vad som finns i dem som en del av klustrets Resource Manager mall. Här är en exempelmall som omfattar 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"
         }
       }
     ]
    }
    

    Anteckning

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

  5. Distribuera!

Ta bort programresursen för Service Fabric-resursprovidern

Följande utlöser att appaketet avetableras från klustret, och då rensas 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 visas ovan eller utföra en REST DELETE-programtypversion – Ta bort direkt är två alternativ som kan användas.

Anteckning

När borttagningen är klar bör du inte längre se paketversionen i SFX eller ARM. Du kan inte ta bort programtypversionsresursen som programmet körs med. ARM/SFRP förhindrar detta. Om du försöker avetablera det paket som körs 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 om dem 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?

Anteckning

Om du vill tillåta att en klusteruppgradering ignorerar appar med feltillstånd 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-klusteruppgraderingsprincip.

Nästa steg