إدارة التطبيقات والخدمات كموارد Azure Resource Manager

يمكنك توزيع التطبيقات والخدمات على مجموعة Service Fabric الخاصة بك عبر Azure Resource Manager. وهذا يعني أنه بدلا من نشر التطبيقات وإدارتها عبر PowerShell أو CLI بعد انتظار أن تكون المجموعة جاهزة، يمكنك الآن التعبير عن التطبيقات والخدمات في JSON ونشرها في نفس قالب Resource Manager مثل نظام المجموعة الخاص بك. تتم عملية تسجيل التطبيق وتزويده وتوزيعه في خطوةٍ واحدةٍ.

هذه هي الطريقة المُوصى بها لتوزيع أي تطبيقات إعداد أو حوكمة أو إدارة نظام مجموعة تحتاج إليها في نظام مجموعتك. يتضمن ذلك تطبيق Patch Orchestration أو Watchdogs أو أي تطبيقات تحتاج إلى التشغيل في نظام مجموعتك قبل توزيع التطبيقات أو الخدمات الأخرى.

عند الاقتضاء، بادر بإدارة تطبيقاتك كموارد Resource Manager لتحسين:

  • سجل التدقيق: يراجع Resource Manager كل عملية ويحتفظ بسجل نشاط مُفصَّل يمكنه مساعدتك في تتبع أي تغييرات تم إجراؤها على هذه التطبيقات ونظام مجموعتك.
  • التحكم في الوصول المستند إلى الدور في Azure (Azure RBAC): يمكن إدارة الوصول إلى المجموعات والتطبيقات المنشورة على نظام المجموعة عبر نفس قالب Resource Manager.
  • يصبح Azure Resource Manager (عبر مدخل Azure) متجراً شاملاً لإدارة عمليات توزيع نظام مجموعتك والتطبيقات الهامة.

تعرض القصاصة البرمجية التالية الأنواع المختلفة من الموارد التي يمكن إدارتها عبر قالب:

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

إضافة تطبيق جديد إلى قالب Resource Manager خاصتك

  1. بادر بإعداد قالب Resource Manager الخاص بنظام مجموعتك للتوزيع. لمزيد من المعلومات، راجع إنشاء مجموعة Service Fabric باستخدام Azure Resource Manager.

  2. فكَّر في بعض التطبيقات التي تخطط لتوزيعها في نظام المجموعة. هل هناك أي شيء سيتم تشغيله دائماً وقد تعتمد عليه التطبيقات الأخرى؟ هل تخطط لتوزيع أي تطبيقات لإدارة نظام المجموعة أو الإعداد؟ تتم إدارة هذه الأنواع من التطبيقات على نحوٍ أفضل عبر قالب Resource Manager، كما نوقش أعلاه.

  3. بمجرد معرفة التطبيقات التي تريد توزيعها بهذه الطريقة، يجب حزم التطبيقات وضغطها ووضعها على مشاركة تخزين. يجب أن تكون المشاركة قابلة للوصول إليها من خلال نقطة نهاية REST لـ Resource Manager Azure للاستهلاك أثناء التوزيع. راجع إنشاء حساب تخزين للاطلاع على التفاصيل.

  4. في قالب Resource Manager، أسفل تعريف نظام المجموعة، صف خصائص كل تطبيق. تتضمن هذه الخصائص عدد النسخ المتماثلة أو المثيلات وأي سلاسل تبعية بين الموارد (تطبيقات أو خدمات أخرى). لاحظ أن هذا لا يحل محل بيانات التطبيق أو الخدمة، ولكنه يصف بعض ما يوجد فيها كجزء من قالب Resource Manager الخاص بالمجموعة. فيما يلي نموذج قالب يتضمن نشر خدمة عديمة الحالة Service1 وخدمة ذات حالة 2 كجزء من 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"
         }
       }
     ]
    }
    

    إشعار

    راجع مرجع Service Fabric Azure Resource Manager للعثور على الاستخدام والتفاصيل حول خصائص القالب الفردية.

  5. نشر!

إزالة مورد تطبيق موفر الموارد Service Fabric

سيؤدي ما يلي إلى تشغيل حزمة التطبيق ليتم إلغاء توفيرها من نظام المجموعة، وهذا سيؤدي إلى تنظيف مساحة القرص المستخدمة:

$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

لن تؤدي إزالة Microsoft.ServiceFabric/clusters/application من قالب ARM إلى إلغاء توفير التطبيق. أمر PowerShell Remove-AzResource كما هو موضح أعلاه أو تنفيذ إصدارات نوع تطبيق REST DELETE - الحذف مباشرة هما خياران يمكن استخدامهما.

إشعار

بمجرد اكتمال الإزالة، يجب ألا ترى إصدار الحزمة في SFX أو ARM بعد الآن. لا يمكنك حذف مورد إصدار نوع التطبيق الذي يعمل به التطبيق؛ ARM/SFRP سيمنع هذا. إذا حاولت إلغاء توفير الحزمة قيد التشغيل، فسوف يمنعها وقت تشغيل SF.

إدارة تطبيق موجود عبر Resource Manager

إذا كان نظام مجموعتك قيد التشغيل بالفعل وتم توزيع بعض التطبيقات التي ترغب في إدارتها كموارد Resource Manager بالفعل عليها، فبدلاً من إزالة التطبيقات وإعادة توزيعها، يمكنك استخدام استدعاء PUT باستخدام واجهات برمجة التطبيقات نفسها للاعتراف بالتطبيقات كموارد Resource Manager. للحصول على معلومات إضافية، راجع ما هو نموذج مورد تطبيق Service Fabric؟

إشعار

للسماح لترقية نظام المجموعة بتجاهل التطبيقات غير الصحية، يمكن للعميل تحديد "maxPercentUnhealthyApplications: 100" في قسم "upgradeDescription/healthPolicy"؛ توجد الأوصاف التفصيلية لجميع الإعدادات في وثائق نهج ترقية نظام مجموعة Service Fabrics REST API.

الخطوات التالية