Inclusión de Reliable Services y Reliable Actors de Service Fabric en contenedores en Windows

Service Fabric admite la inclusión de microservicios de Service Fabric en contenedores (servicios basados en Reliable Services y Reliable Actors). Para más información, consulte Service Fabric y los contenedores.

Este documento ofrece una guía para que el servicio se ejecute dentro de un contenedor de Windows.

Nota:

Actualmente, esta característica solo funciona para Windows. Para ejecutar contenedores, el clúster debe ejecutarse en Windows Server 2016 con Containers.

Pasos para incluir la aplicación de Service Fabric en contenedores

  1. Abra la aplicación de Service Fabric en Visual Studio.

  2. Agregue la clase SFBinaryLoader.cs al proyecto. El código de esta clase es un asistente para cargar correctamente los archivos binarios del entorno en tiempo de ejecución de Service Fabric dentro de la aplicación cuando se ejecuta dentro de un contenedor.

  3. Para cada paquete de código que le gustaría incluir en contenedores, inicialice el cargador en el punto de entrada del programa. Agregue el constructor estático que se muestra en el siguiente fragmento de código al archivo de punto de entrada del programa.

    namespace MyApplication
    {
       internal static class Program
       {
           static Program()
           {
               SFBinaryLoader.Initialize();
           }
    
           /// <summary>
           /// This is the entry point of the service host process.
           /// </summary>
           private static void Main()
           {
    
  4. Compile y empaquete el proyecto. Para compilar y crear un paquete, haga clic con el botón derecho en el proyecto de aplicación en el Explorador de soluciones y elija el comando Empaquetar.

  5. Para cada paquete de código que necesite incluir en contenedores, ejecute el script de PowerShell CreateDockerPackage.ps1. El uso es como sigue:

    .NET completo

      $codePackagePath = 'Path to the code package to containerize.'
      $dockerPackageOutputDirectoryPath = 'Output path for the generated docker folder.'
      $applicationExeName = 'Name of the Code package executable.'
      CreateDockerPackage.ps1 -CodePackageDirectoryPath $codePackagePath -DockerPackageOutputDirectoryPath $dockerPackageOutputDirectoryPath -ApplicationExeName $applicationExeName
    

    .NET Core

      $codePackagePath = 'Path to the code package to containerize.'
      $dockerPackageOutputDirectoryPath = 'Output path for the generated docker folder.'
      $dotnetCoreDllName = 'Name of the Code package dotnet Core Dll.'
      CreateDockerPackage.ps1 -CodePackageDirectoryPath $codePackagePath -DockerPackageOutputDirectoryPath $dockerPackageOutputDirectoryPath -DotnetCoreDllName $dotnetCoreDllName
    

    El script crea una carpeta con los artefactos de Docker en $dockerPackageOutputDirectoryPath. Modifique el archivo de Docker generado para expose los puertos, ejecutar scripts de configuración, etc. según sus necesidades.

  6. A continuación, necesita compilar e insertar el paquete de contenedor de Docker en el repositorio.

  7. Modifique los archivos ApplicationManifest.xml y ServiceManifest.xml para agregar la imagen del contenedor, la información del repositorio, la autenticación del registro y la asignación de puerto al host. Para modificar los manifiestos, consulte Cree la primera aplicación contenedora en Service Fabric en Windows. La definición de paquete de código en el manifiesto de servicio debe reemplazarse por la imagen de contenedor correspondiente. Asegúrese de cambiar EntryPoint a un tipo ContainerHost.

    <!-- Code package is your service executable. -->
    <CodePackage Name="Code" Version="1.0.0">
    <EntryPoint>
     <!-- Follow this link for more information about deploying Windows containers to Service Fabric: https://aka.ms/sfguestcontainers -->
     <ContainerHost>
       <ImageName>myregistry.azurecr.io/samples/helloworldapp</ImageName>
     </ContainerHost>
    </EntryPoint>
    <!-- Pass environment variables to your container: -->
    </CodePackage>
    
  8. Agregue la asignación de host a puerto para el replicador y el punto de conexión de servicio. Puesto que Service Fabric asigna ambos puertos en tiempo de ejecución, ContainerPort se establece en cero para usar el puerto asignado para la asignación.

    <Policies>
    <ContainerHostPolicies CodePackageRef="Code">
     <PortBinding ContainerPort="0" EndpointRef="ServiceEndpoint"/>
     <PortBinding ContainerPort="0" EndpointRef="ReplicatorEndpoint"/>
    </ContainerHostPolicies>
    </Policies>
    
  9. Para configurar el modo de aislamiento de contenedor, consulte Configuración del modo de aislamiento. Windows admite dos modos de aislamiento para contenedores: de proceso y de Hyper-V. Los siguientes fragmentos de código muestran cómo el modo de aislamiento se especifica en el archivo de manifiesto de aplicación.

    <Policies>
    <ContainerHostPolicies CodePackageRef="Code" Isolation="process">
    ...
    </ContainerHostPolicies>
    </Policies>
    
    <Policies>
    <ContainerHostPolicies CodePackageRef="Code" Isolation="hyperv">
    ...
    </ContainerHostPolicies>
    </Policies>
    

Nota:

Un clúster de Service Fabric es un único inquilino por diseño y las aplicaciones hospedadas se consideran de confianza. Si está pensando en hospedar aplicaciones de contenedor que no son de confianza, considere la posibilidad de implementarlas como contenedores invitados y consulte Hospedaje de aplicaciones que no son de confianza en un clúster de Service Fabric.

  1. Para probar esta aplicación, debe implementarla en un clúster que esté ejecutando la versión 5.7 o posterior. Para las versiones 6.1 o posteriores del entorno de ejecución, debe editar y actualizar la configuración del clúster para habilitar esta característica en vista previa. Siga los pasos de este artículo para agregar la configuración que se muestra a continuación.

      {
        "name": "Hosting",
        "parameters": [
          {
            "name": "FabricContainerAppsEnabled",
            "value": "true"
          }
        ]
      }
    
  2. Después, implemente el paquete de aplicación editado en este clúster.

Ahora debería tener una aplicación de Service Fabric en contenedores ejecutando el clúster.

Pasos siguientes