Sdílet prostřednictvím


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

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

Toto je doporučený způsob, jak nasadit všechny aplikace pro správu clusteru, zásady správného řízení nebo zásady správného řízení, které v clusteru potřebujete. To zahrnuje aplikaci orchestrace oprav, watchdogs nebo všechny aplikace, které musí být spuštěné v clusteru před nasazením jiných aplikací nebo služeb.

Pokud je to možné, spravujte své aplikace jako prostředky Resource Manageru, aby se zlepšily:

  • Záznam auditu: Resource Manager provede audit každé operace a uchovává podrobný protokol aktivit, který vám pomůže trasovat 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ést pomocí stejné šablony Resource Manageru.
  • Azure Resource Manager (prostřednictvím webu Azure Portal) se stává jedním stop-shopem 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 pomocí š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 Manageru

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

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

  3. Jakmile zjistíte, jaké aplikace chcete tímto způsobem nasadit, musí se aplikace 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 Manageru pod deklarací clusteru popište vlastnosti jednotlivých aplikací. Mezi tyto vlastnosti patří počet replik nebo instancí a všechny řetězy závislostí mezi prostředky (jinými aplikacemi nebo službami). Všimněte si, že to nenahrazuje manifesty aplikace nebo služby, ale spíše popisuje, co je v nich součástí šablony Resource Manageru clusteru. Tady je ukázková šablona, která zahrnuje nasazení bezstavové služby Service1 a stavové služby Service2 jako součást aplikace 1:

    {
     "$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 podrobnostech o vlastnostech jednotlivých šablon najdete v referenčních informacích k Service Fabric Azure Resource Manageru.

  5. Nasadit!

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

Následující příkaz aktivuje balíček aplikace, který se z clusteru zruší, 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

Jednoduše odeberte Microsoft.ServiceFabric/clusters/application ze šablony ARM, nedojde k zrušení zřízení aplikace. Příkaz PowerShell Remove-AzResource, jak je znázorněno výše, nebo provedení verzí typu aplikace REST DELETE – Odstranění přímo jsou dvě možnosti, které je možné použít.

Poznámka:

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

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

Pokud už je váš cluster v provozu a některé aplikace, které chcete spravovat, protože prostředky Resource Manageru už jsou na něm nasazené, místo odebrání aplikací a jejich opětovného nasazení můžete použít volání PUT pomocí stejných rozhraní API, aby se aplikace potvrdily jako prostředky Resource Manageru. 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 rozhraní REST API Service Fabrics.

Další kroky