你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

Service Fabric 托管群集上专用主机的简介

Azure 专用主机 是一种提供物理服务器的服务,物理服务器可托管专用于一个 Azure 订阅的一个或多个虚拟机。 服务器专用于你的组织,工作负荷和容量不与其他人共享。 专用主机是数据中心中使用的相同物理服务器,作为资源提供。 你可以在区域、可用性区域和容错域中预配专用主机。 然后,可以按照最能满足你的需要的配置将 VM 直接放入预配的主机中。

将 Azure 专用主机用于 Service Fabric 托管群集 (SFMC) 的节点具有以下优势:

  • 在物理服务器级别进行主机级别硬件隔离。 不会在你的主机上放置任何其他 VM。 专用主机部署在相同的数据中心,与其他非隔离主机共享相同的网络和底层存储基础结构。
  • 控制 Azure 平台发起的维护事件。 尽管大多数维护事件对虚拟机的影响极小甚至没有任何影响,但对于某些敏感工作负荷而言,每暂停一秒都可能会造成影响。 在使用专用主机的情况下,可以选择维护时段来降低对服务的影响。

可以根据工作负荷要求选择专用主机虚拟机的 SKU。 有关详细信息,请参阅专用主机虚拟机

以下指南逐步介绍如何使用 Azure 资源管理器模板将 Azure 专用主机添加到 Service Fabric 托管群集。

先决条件

本指南基于托管群集快速入门指南:使用 Azure 资源管理器部署 Service Fabric 托管群集

开始之前:

查看模板

本指南中使用的模板来自 Azure 示例 - Service Fabric 群集模板

创建客户端证书

Service Fabric 托管群集使用客户端证书作为访问控制的密钥。 如果已有要用于群集访问控制的客户端证书,则可以跳过此步骤。

如果需要创建新的客户端证书,请按照设置和检索 Azure 密钥保管库中的证书中的步骤进行操作。 记下证书指纹,因为下一步需要使用它来部署模板。

部署专用主机资源并配置对 Service Fabric 资源提供程序的访问权限

使用以下步骤创建专用主机组,并向 Service Fabric 资源提供程序应用程序中的主机组添加角色分配。 此角色分配允许 Service Fabric 资源提供程序将主机组内专用主机上的 VM 部署到托管群集的虚拟机规模集。 此分配是一次性操作。

  1. 获取 Service Fabric 资源提供程序应用程序的 SFRP 提供程序 ID 和服务主体。

    Login-AzAccount  
    Select-AzSubscription -SubscriptionId <SubId>  
    Get-AzADServicePrincipal -DisplayName "Azure Service Fabric Resource Provider"
    

    注意

    确保你位于正确的订阅中,如果订阅位于其他租户中,则主体 ID 将更改。

  2. 使用提供的专用主机组示例 ARM 部署模板来创建固定到一个可用性区域和五个容错域的专用主机组。 此示例确保每个容错域至少有一个专用主机。

    New-AzResourceGroup -Name $ResourceGroupName -Location $location
    New-AzResourceGroupDeployment -Name "hostgroup-deployment" -ResourceGroupName $ResourceGroupName -TemplateFile ".\HostGroup-And-RoleAssignment.json" -TemplateParameterFile ".\HostGroup-And-RoleAssignment.parameters.json" -Debug -Verbose
    

    注意

    • 确保为专用主机选择正确的 SKU 系列来匹配要用于基础节点类型 VM SKU 的 SKU。 有关详细信息,请参阅专用主机虚拟机
    • 每个容错域都需要有专用主机,而 Service Fabric 托管群集需要五个容错域。 因此,每个专用主机组至少应有五个专用主机。
  3. 上一步中使用的专用主机组示例 ARM 部署模板会向具有参与者访问权限的主机组添加角色分配。 有关 Azure 角色的详细信息,请参阅 Azure 内置角色 - Azure RBAC。 此角色分配在模板的资源部分由第一步确定的主体 ID 和角色定义 ID 来定义。

       "variables": {  
            "authorizationApiVersion": "2018-01-01-preview",
            "contributorRoleId": "b24988ac-6180-42a0-ab88-20f7382dd24c",
            "SFRPAadServicePrincipalId": " <Service Fabric Resource Provider ID> -"
          },
       "resources": [
       {  
                "apiVersion": "[variables('authorizationApiVersion')]",  
                "type": "Microsoft.Compute/Hostgroups/providers/roleAssignments",  
                "name": "[concat(concat(parameters('dhgNamePrefix'), '0'), '/Microsoft.Authorization/', parameters('hostGroupRoleAssignmentId'))]",  
                "dependsOn": [  
                    "[resourceId('Microsoft.Compute/hostGroups', concat(parameters('dhgNamePrefix'), '0'))]"  
                ],  
                "properties": {  
                    "roleDefinitionId": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/', variables('contributorRoleId'))]",  
                    "principalId": "[variables('SFRPAadServicePrincipalId')]"  
                }  
              }
              ]
    

    也可以通过 PowerShell 使用第一步确定的主体 ID 和角色定义名称(参与者,如适用)来添加角色分配。

    New-AzRoleAssignment -PrincipalId "<Service Fabric Resource Provider ID>" -RoleDefinitionName "Contributor" -Scope "<Host Group Id>"  
    

部署 Service Fabric 托管群集

创建 Azure Service Fabric 托管群集,其中节点类型配置为引用专用主机组 ResourceId。 节点类型需要固定到与主机组相同的可用性区域。

  1. 专用主机的 Service Fabric 群集示例模板中选择模板,其中包括专用主机支持的规范。

  2. 为以下模板参数提供自己的值:

    • 订阅:选择与主机组订阅相同的 Azure 订阅。
    • 资源组:选择“新建”。 输入资源组的唯一名称(例如 myResourceGroup),然后选择“确定”。
    • 位置:选择与主机组位置相同的位置。
    • 群集名称:输入群集的唯一名称,例如 mysfcluster。
    • 管理员用户名:输入要在群集中的基础 VM 上用于 RDP 的管理员名称。
    • 管理员密码:输入要在群集中的基础 VM 上用于 RDP 的管理员密码。
    • 客户端证书指纹:提供要用于访问群集的客户端证书的指纹。 如果没有证书,请按照设置和检索证书中的说明来创建自签名证书。
    • 节点类型名称:输入节点类型的唯一名称,例如 nt1。
  3. 通过下面一种方法部署 ARM 模板:

    • ARM 门户自定义模板体验:自定义部署 - Microsoft Azure。 选择下图以登录到 Azure,并为模板参数提供自己的值,然后部署模板。

      用于将资源管理器模板部署到 Azure 的按钮。

    • ARM PowerShell cmdlet:New-AzResourceGroupDeployment (Az.Resources)。 将 ARM 模板和参数文件的路径存储在变量中,然后部署模板。

      $templateFilePath = "<full path to azuredeploy.json>" 
      $parameterFilePath = "<full path to azuredeploy.parameters.json>"
      $pass = (ConvertTo-SecureString -AsPlainText -Force "<adminPassword>")
      
      New-AzResourceGroupDeployment ` 
         -Name $DeploymentName ` 
         -ResourceGroupName $resourceGroupName ` 
         -TemplateFile $templateFilePath ` 
         -TemplateParameterFile $parameterFilePath `
         -adminPassword $pass `
         -Debug -Verbose
      

    等待部署成功完成。

故障排除

  1. 当 SFRP 无权访问主机组时,引发以下错误。 查看上述角色分配步骤,并确保分配正确完成。
         {  
                "code": "LinkedAuthorizationFailed",  
                "message": "The client '[<clientId>]' with object id '[<objectId>]' has permission to perform action 'Microsoft.Compute/virtualMachineScaleSets/write' on scope '/subscriptions/[<Subs-Id>]/resourcegroups/[<ResGrp-Id>]/providers/Microsoft.Compute/virtualMachineScaleSets/pnt'; however, it does not have permission to perform action 'write' on the linked scope(s) '/subscriptions/[<Subs-Id>]/resourceGroups/[<ResGrp-Id>]/providers/Microsoft.Compute/hostGroups/HostGroupscu0' or the linked scope(s) are invalid."
             }
    
  2. 如果主机组与群集位于不同的订阅,则报告以下错误。 确保两者位于同一订阅。
          {  
                "code": "BadRequest",  
                "message": "Entity subscriptionId in resource reference id /subscriptions/[<Subs-Id>]/resourceGroups/[<ResGrp-Id>]/providers/Microsoft.Compute/hostGroups/[<HostGroup>] is invalid."  
              }
    
  3. 如果主机组的配额不足,将引发以下错误:
          {  
                "code": "QuotaExceeded",  
                "message": "Operation could not be completed as it results in exceeding approved standardDSv3Family Cores quota.  
          Additional Required: 320, (Minimum) New Limit Required: 320. Submit a request for Quota increase [here](https://aka.ms/ProdportalCRP/#blade/Microsoft_Azure_Capacity/UsageAndQuota.ReactView/Parameters/). Please read more about quota limits [here](/azure/azure-supportability/per-vm-quota-requests)” 
              }
    

后续步骤