将具有托管标识的应用程序部署到 Service Fabric 托管群集

若要使用托管标识部署 Service Fabric 应用程序,需通过 Azure 资源管理器部署应用程序,通常需要使用 Azure 资源管理器模板。 若要详细了解如何通过 Azure 资源管理器部署 Service Fabric 应用程序,请参阅使用 Azure 资源管理器将应用程序部署到托管群集

注意

未部署为 Azure 资源的应用程序 不能 具有托管标识。

托管群集上的 API 版本 "2021-05-01" 支持使用托管标识部署 Service Fabric 应用程序。

此处提供了示例托管群集模板:Service Fabric 托管群集模板

Service Fabric 管理群集中的管理标识支持

使用 Azure 资源的托管标识配置 Service Fabric 应用程序并部署到群集时,它将触发 Service Fabric 托管群集上“托管标识令牌服务”的自动配置。 此服务负责使用 Service Fabric 应用程序的托管标识对这些应用程序进行身份验证,以及代表它们获取访问令牌。 启用此服务以后,即可在 Service Fabric Explorer 中左侧窗格的“系统”部分看到它,它以 fabric:/System/ManagedIdentityTokenService 名称运行。

注意

首次使用托管标识部署应用程序时,您可能会注意到由于自动群集配置更改,部署时间会有所延长。 区域性群集可能需要 15 分钟,而跨区域群集可能需要 45 分钟。 如果存在其他任何正在进行的部署,Managed Identity 配置必须等待这些部署完成后才能进行。

应用程序资源支持分配“SystemAssigned”和“UserAssigned”这两种类型,并且可以按照下面的代码片段进行分配。

{
  "type": "Microsoft.ServiceFabric/managedclusters/applications",
  "apiVersion": "2021-05-01",
  "identity": {
    "type": "SystemAssigned",
    "userAssignedIdentities": {}
  },
}

完整的 JSON 参考

用户分配的标识

若要为应用程序启用用户分配的标识,请首先将类型为 userAssignedidentity 属性添加到应用程序资源,并包括引用的用户分配标识。 然后,在应用程序资源的 properties 节中添加 managedIdentities 节,其中包含每个用户分配标识的友好名称到 principalId 映射的列表。 有关用户分配的标识的详细信息,请参阅创建、列出或删除用户分配的托管标识

应用程序模板

要为应用程序启用用户分配的标识,首先将类型为userAssignedidentity属性添加到应用程序资源,并包含引用的用户分配标识。然后,将一个managedIdentities对象添加到properties部分,其中包含一个将易记名称映射到每个用户分配标识的principalId的列表。

{
  "apiVersion": "2021-05-01",
  "type": "Microsoft.ServiceFabric/managedclusters/applications",
  "name": "[concat(parameters('clusterName'), '/', parameters('applicationName'))]",
  "location": "[resourceGroup().location]",
  "dependsOn": [
    "[parameters('applicationVersion')]",
    "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities/', parameters('userAssignedIdentityName'))]"
  ],
  "identity": {
    "type" : "userAssigned",
    "userAssignedIdentities": {
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities/', parameters('userAssignedIdentityName'))]": {}
    }
  },
  "properties": {
    "version": "[parameters('applicationVersion')]",
    "parameters": {
    },
    "managedIdentities": [
      {
        "name" : "[parameters('userAssignedIdentityName')]",
        "principalId" : "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities/', parameters('userAssignedIdentityName')), '2018-11-30').principalId]"
      }
    ]
  }
}

在上面的示例中,用户分配标识的资源名称用作应用程序的托管标识的易记名称。 以下示例假定实际的易记名称为“AdminUser”。

应用程序包

  1. 对于在 Azure 资源管理器模板的 managedIdentities 节中定义的每个标识,请在应用程序清单的 Principals 节下添加 <ManagedIdentity> 标记。 Name 属性需与 name 节中定义的 managedIdentities 属性匹配。

    ApplicationManifest.xml

      <Principals>
        <ManagedIdentities>
          <ManagedIdentity Name="AdminUser" />
        </ManagedIdentities>
      </Principals>
    
  2. ServiceManifestImport 节中,为使用托管标识的服务添加 IdentityBindingPolicy。 此策略将 AdminUser 标识映射到特定于服务的标识名称,该名称需在以后添加到服务清单中。

    ApplicationManifest.xml

      <ServiceManifestImport>
        <Policies>
          <IdentityBindingPolicy ServiceIdentityRef="WebAdmin" ApplicationIdentityRef="AdminUser" />
        </Policies>
      </ServiceManifestImport>
    
  3. 更新服务清单,将 ManagedIdentity 添加到 Resources 节中,其名称与应用程序清单的 ServiceIdentityRef 中的 IdentityBindingPolicy 匹配:

    ServiceManifest.xml

      <Resources>
        ...
        <ManagedIdentities DefaultIdentity="WebAdmin">
          <ManagedIdentity Name="WebAdmin" />
        </ManagedIdentities>
      </Resources>
    

系统分配的托管标识

应用程序模板

若要为应用程序启用系统分配的托管标识,请将类型为 systemAssignedidentity 属性添加到应用程序资源,如以下示例所示:

    {
      "apiVersion": "2021-05-01",
      "type": "Microsoft.ServiceFabric/managedclusters/applications",
      "name": "[concat(parameters('clusterName'), '/', parameters('applicationName'))]",
      "location": "[resourceGroup().location]",
      "dependsOn": [
        "[concat('Microsoft.ServiceFabric/clusters/', parameters('clusterName'), '/applicationTypes/', parameters('applicationTypeName'), '/versions/', parameters('applicationTypeVersion'))]"
      ],
      "identity": {
        "type" : "systemAssigned"
      },
      "properties": {
        "typeName": "[parameters('applicationTypeName')]",
        "typeVersion": "[parameters('applicationTypeVersion')]",
        "parameters": {
        }
      }
    }

此属性向 Azure 资源管理器、托管标识和 Service Fabric 资源提供程序分别声明:此资源应该有一个隐式 (system assigned) 托管标识。

应用程序和服务包

  1. 更新应用程序清单,在 Principals 节添加包含单个条目的 ManagedIdentity 元素,如下所示:

    ApplicationManifest.xml

    <Principals>
      <ManagedIdentities>
        <ManagedIdentity Name="SystemAssigned" />
      </ManagedIdentities>
    </Principals>
    

    这会将分配给应用程序的资源标识映射到一个易于记忆的名称,从而进一步分配给构成该应用程序的服务。

  2. 在与要分配托管标识的服务对应的 ServiceManifestImport 部分中,添加 IdentityBindingPolicy 元素,如下所示:

    ApplicationManifest.xml

      <ServiceManifestImport>
        <Policies>
          <IdentityBindingPolicy ServiceIdentityRef="WebAdmin" ApplicationIdentityRef="SystemAssigned" />
        </Policies>
      </ServiceManifestImport>
    

    此元素将应用程序的标识分配给服务;如果没有此分配,服务将无法访问应用程序的标识。 在上面的代码片段中,SystemAssigned 标识(保留关键字)映射到服务的定义,采用的易记名称为 WebAdmin

  3. 更新服务清单,将 ManagedIdentity 元素添加到 Resources 节中,其名称与 ServiceIdentityRef 设置的值匹配,该设置来自应用程序清单中的 IdentityBindingPolicy 定义:

    ServiceManifest.xml

      <Resources>
        ...
        <ManagedIdentities DefaultIdentity="WebAdmin">
          <ManagedIdentity Name="WebAdmin" />
        </ManagedIdentities>
      </Resources>
    

    这是一个等效映射,等效于将标识映射到服务(如上所述),但却是从服务定义的角度来看。 在此,标识以其友好名称 (WebAdmin) 进行引用,正如在应用程序清单中所声明的。

后续步骤