将托管标识添加到 Service Fabric 托管群集节点类型

Service Fabric 托管群集中的每个节点类型都受虚拟机规模集的支持。 为了配合使用托管标识和托管群集节点类型,已将属性 vmManagedIdentity 添加到包含可以使用的标识列表 userAssignedIdentities 的节点类型定义中。 功能反映了如何在非托管群集中使用托管标识,例如配合使用托管标识与 Azure Key Vault 虚拟机规模集扩展

有关对节点类型使用托管标识的 Service Fabric 托管群集部署的示例,请参阅此模板。 该示例涉及到两个模板:

  1. 托管标识和角色分配:用于创建托管标识和角色分配的模板,Service Fabric RP 将标识分配给托管群集的虚拟机规模集。 在节点类型资源上使用托管标识之前,应仅部署一次。

  2. 托管群集和节点类型:Service Fabric 托管群集和节点类型资源的模板,使用之前创建的托管标识。

注意

此功能目前仅支持用户分配的标识。

先决条件

开始之前:

  • 如果没有 Azure 订阅,请在开始前创建一个试用版订阅帐户。
  • 如果计划使用 PowerShell,请安装 Azure CLI 来运行 CLI 参考命令。

1. 创建标识和角色分配

创建用户分配的托管标识

可以在 Azure 资源管理器 (ARM) 模板的“资源”部分中定义用户分配的托管标识,以便在部署时创建:

{
  "type": "Microsoft.ManagedIdentity/userAssignedIdentities",
  "name": "[parameters('userAssignedIdentityName')]",
  "apiVersion": "2018-11-30",
  "location": "[resourceGroup().location]"
}

或通过 PowerShell 创建:

New-AzResourceGroup -Name <managedIdentityRGName> -Location <location>
New-AzUserAssignedIdentity -ResourceGroupName <managedIdentityRGName> -Name <userAssignedIdentityName>

使用 Service Fabric 资源提供程序添加角色分配

使用 Service Fabric 资源提供程序应用程序将角色分配添加到托管标识。 通过这种分配,Service Fabric 资源提供程序可以将上一步中创建的标识分配给托管群集的虚拟机规模集。 此为一次性步骤

获取 Service Fabric 资源提供程序应用程序的服务主体:

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

注意

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

ServicePrincipalNames : {74cb6831-0dbb-4be1-8206-fd4df301cdc2}
ApplicationId         : 74cb6831-0dbb-4be1-8206-fd4df301cdc2
ObjectType            : ServicePrincipal
DisplayName           : Azure Service Fabric Resource Provider
Id                    : 00000000-0000-0000-0000-000000000000

当在模板或 PowerShell 命令上适用时,将上一个输出的 ID 用作 principalId,将下面的角色定义 ID 用作 roleDefinitionId :

角色定义名称 角色定义 ID
托管的标识操作员 f1a07417-d97a-45cb-824c-7a7467783830

可以使用主体 ID 和角色定义 ID 在“资源”部分模板中定义此角色分配:

{
  "type": "Microsoft.Authorization/roleAssignments",
  "apiVersion": "2020-04-01-preview",
  "name": "[parameters('vmIdentityRoleNameGuid')]",
  "scope": "[concat('Microsoft.ManagedIdentity/userAssignedIdentities', '/', parameters('userAssignedIdentityName'))]",
  "dependsOn": [
    "[concat('Microsoft.ManagedIdentity/userAssignedIdentities/', parameters('userAssignedIdentityName'))]"
  ],
  "properties": {
    "roleDefinitionId": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/', 'f1a07417-d97a-45cb-824c-7a7467783830')]",
    "principalId": "<Service Fabric Resource Provider ID>"
  }
}

注意

vmIdentityRoleNameGuid 应为有效的 GUID。 如果再次部署同一模板(包括此角色分配),请确保 GUID 与最初使用的相同,如果不同则删除此资源,因为它只需创建一次。

或者使用主体 ID 和角色定义名称通过 PowerShell 创建:

New-AzRoleAssignment -PrincipalId "<Service Fabric Resource Provider ID>" -RoleDefinitionName "Managed Identity Operator" -Scope "/subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<userAssignedIdentityName>"

部署托管标识和角色分配。

运行 New-AzResourceGroupDeployment cmdlet 以创建托管标识并添加角色分配:

New-AzResourceGroupDeployment -ResourceGroupName <managedIdentityRGName> -TemplateFile ".\MangedIdentityAndSfrpRoleAssignment.json" -TemplateParameterFile ".\MangedIdentityAndSfrpRoleAssignment.Parameters.json" -Verbose

2. 将标识分配给节点类型资源

将托管标识属性添加到节点类型定义

最后,使用第一步创建的标识的完整资源 ID 将 vmManagedIdentityuserAssignedIdentities 属性添加到托管群集的节点类型定义。 请务必使用 2021-05-01 或更高版本的 apiVersion

{
  "type": "Microsoft.ServiceFabric/managedclusters/nodetypes",
  "apiVersion": "2021-05-01",
  "properties": {
    "isPrimary": true,
    "vmInstanceCount": 5,
    "dataDiskSizeGB": 100,
    "vmSize": "Standard_D2_v2",
    "vmImagePublisher": "MicrosoftWindowsServer",
    "vmImageOffer": "WindowsServer",
    "vmImageSku": "2019-Datacenter",
    "vmImageVersion": "latest",
    "vmManagedIdentity": {
      "userAssignedIdentities": [
        "[parameters('userAssignedIdentityResourceId')]"
      ]
    }
  }
}

部署分配标识的节点类型资源

运行 New-AzResourceGroupDeployment cmdlet 部署 Service Fabric 托管群集模板,该模板将托管标识分配给节点类型资源。

New-AzResourceGroupDeployment -ResourceGroupName <sfmcRGName> -TemplateFile ".\SfmcVmMangedIdentity.json" -TemplateParameterFile ".\SfmcVmMangedIdentity.Parameters.json" -Verbose

部署后,创建的托管标识已添加到指定节点类型的虚拟机规模集,并且可以按预期使用,就像在任何非托管群集中一样。

故障排除

部署时,如果无法正确添加角色分配,将遇到以下错误:

Azure portal deployment error showing the client with SFRP's object/application ID not having permission to perform identity management activity

在这种情况下,请确保使用“托管标识操作员”角色成功创建角色分配。 可以在受托管标识资源的 Azure 门户的托管标识资源上找到角色分配,如下所示。

Role assignment properties for Service Fabric Resource provider on the user-assigned managed identity shown in the Azure portal

后续步骤