Partager via

将具有托管标识的应用程序部署到 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) 进行引用,正如在应用程序清单中所声明的。

后续步骤