Zarządzanie aplikacjami i usługami jako zasobami Resource Manager platformy Azure

Aplikacje i usługi można wdrażać w klastrze usługi Service Fabric za pośrednictwem usługi Azure Resource Manager. Oznacza to, że zamiast wdrażać aplikacje i zarządzać nimi za pośrednictwem programu PowerShell lub interfejsu wiersza polecenia po oczekiwaniu na gotowość klastra, można teraz wyrażać aplikacje i usługi w formacie JSON i wdrażać je w tym samym szablonie Resource Manager co klaster. Proces rejestracji, aprowizacji i wdrażania aplikacji odbywa się w jednym kroku.

Jest to zalecany sposób wdrażania dowolnej konfiguracji, ładu lub aplikacji do zarządzania klastrem, które są wymagane w klastrze. Obejmuje to aplikację Patch Orchestration Application, Watchdogs lub wszystkie aplikacje, które muszą być uruchomione w klastrze przed wdrożeniem innych aplikacji lub usług.

Jeśli ma to zastosowanie, zarządzaj aplikacjami jako zasobami Resource Manager w celu ulepszenia:

  • Dziennik inspekcji: Resource Manager inspekcji każdej operacji i przechowuje szczegółowy dziennik aktywności, który może pomóc w śledzeniu wszelkich zmian wprowadzonych w tych aplikacjach i klastrze.
  • Kontrola dostępu oparta na rolach platformy Azure (Azure RBAC): zarządzanie dostępem do klastrów i aplikacji wdrożonych w klastrze można wykonać za pomocą tego samego szablonu Resource Manager.
  • Usługa Azure Resource Manager (za pośrednictwem Azure Portal) staje się jednym przystankiem do zarządzania klastrem i krytycznymi wdrożeniami aplikacji.

Poniższy fragment kodu przedstawia różne rodzaje zasobów, którymi można zarządzać za pomocą szablonu:

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

Dodawanie nowej aplikacji do szablonu Resource Manager

  1. Przygotuj szablon Resource Manager klastra do wdrożenia. Aby uzyskać więcej informacji, zobacz Create a Service Fabric cluster by using Azure Resource Manager (Tworzenie klastra usługi Service Fabric przy użyciu usługi Azure Resource Manager).

  2. Zastanów się nad niektórymi aplikacjami, które planujesz wdrożyć w klastrze. Czy istnieją jakiekolwiek, które zawsze będą działać, że inne aplikacje mogą wymagać zależności? Czy planujesz wdrożyć jakiekolwiek aplikacje ładu klastra lub skonfigurować je? Te rodzaje aplikacji najlepiej zarządzać za pośrednictwem szablonu Resource Manager, jak opisano powyżej.

  3. Po zorientowaniu się, jakie aplikacje mają być wdrażane w ten sposób, aplikacje muszą być spakowane, spakowane i umieszczone w udziale magazynu. Udział musi być dostępny za pośrednictwem punktu końcowego REST dla usługi Azure Resource Manager do użycia podczas wdrażania. Aby uzyskać szczegółowe informacje, zobacz Tworzenie konta magazynu .

  4. W szablonie Resource Manager pod deklaracją klastra opisz właściwości każdej aplikacji. Te właściwości obejmują liczbę replik lub wystąpień oraz wszelkie łańcuchy zależności między zasobami (innymi aplikacjami lub usługami). Należy pamiętać, że nie zastępuje to manifestów aplikacji lub usługi, ale raczej opisuje niektóre z nich w ramach szablonu Resource Manager klastra. Oto przykładowy szablon, który obejmuje wdrażanie usługi bezstanowej Service1 i stanowej usługi Service2 w ramach aplikacji 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"
         }
       }
     ]
    }
    

    Uwaga

    Zapoznaj się z dokumentacją usługi Azure Resource Manager usługi Service Fabric, aby znaleźć informacje o użyciu i szczegółowe informacje dotyczące poszczególnych właściwości szablonu.

  5. Wdrożyć!

Usuwanie zasobu aplikacji dostawcy zasobów usługi Service Fabric

Następujące polecenie spowoduje, że pakiet aplikacji zostanie anulowany z klastra, a to spowoduje wyczyszczenie używanego miejsca na dysku:

$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

Usunięcie aplikacji Microsoft.ServiceFabric/clusters/application z szablonu usługi ARM nie spowoduje anulowania aprowizacji aplikacji. Polecenie programu PowerShell Remove-AzResource jak pokazano powyżej lub wykonanie wersji typu aplikacji REST DELETE — usuwanie bezpośrednio to dwie opcje, których można użyć.

Uwaga

Po zakończeniu usuwania nie powinna być już widoczna wersja pakietu w systemie SFX lub ARM. Nie można usunąć zasobu wersji typu aplikacji, z którym jest uruchomiona aplikacja; Usługa ARM/SFRP zapobiegnie temu. Jeśli spróbujesz cofnąć aprowizę uruchomionego pakietu, środowisko uruchomieniowe SF uniemożliwi jego aprowizę.

Zarządzanie istniejącą aplikacją za pośrednictwem Resource Manager

Jeśli klaster jest już uruchomiony i niektóre aplikacje, którymi chcesz zarządzać, ponieważ zasoby Resource Manager są już wdrożone, zamiast usuwać aplikacje i wdrażać je ponownie, możesz użyć wywołania PUT przy użyciu tych samych interfejsów API, aby aplikacje zostały uznane za zasoby Resource Manager. Aby uzyskać dodatkowe informacje, zobacz Co to jest model zasobów aplikacji usługi Service Fabric?

Uwaga

Aby umożliwić uaktualnienie klastra w celu ignorowania aplikacji w złej kondycji, klient może określić wartość "maxPercentUnhealthyApplications: 100" w sekcji "upgradeDescription/healthPolicy"; szczegółowe opisy wszystkich ustawień znajdują się w dokumentacji zasad uaktualniania klastra interfejsu API REST usługi Service Fabrics.

Następne kroki