Colocar em contêineres seus Reliable Services e Reliable Actors do Service Fabric no Windows

O Service Fabric oferece suporte a colocação em contêineres de microsserviços do Service Fabric (serviços baseados em Reliable Services e Reliable Actors). Para saber mais, confira contêineres do Service Fabric.

Este documento fornece diretrizes para colocar o serviço em execução dentro de um contêiner do Windows.

Observação

Atualmente, esse recurso só funciona para Windows. Para executar contêineres, o cluster deve estar em execução no Windows Server 2016 com Contêineres.

Etapas para colocar seu aplicativo do Service Fabric em contêineres

  1. Abra seu aplicativo do Service Fabric no Visual Studio.

  2. Adicione a classe SFBinaryLoader.cs ao seu projeto. O código nessa classe é um auxiliar para carregar corretamente os binários de runtime do Service Fabric dentro de seu aplicativo durante a execução dentro de um contêiner.

  3. Para cada pacote de código que você quer colocar em contêineres, inicialize o carregador no ponto de entrada do programa. Adicione o construtor estático mostrado no snippet de código a seguir ao seu arquivo de ponto de entrada do 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. Compilar e empacotar seu projeto. Para compilar e criar um pacote, clique com o botão direito do mouse no projeto de aplicativo no Gerenciador de Soluções e escolha o comando Empacotar.

  5. Para cada pacote de códigos que você precisa colocar em contêineres, execute o script do PowerShell CreateDockerPackage.ps1. A utilização é o seguinte:

    .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
    

    O script cria uma pasta com artefatos do Docker em $dockerPackageOutputDirectoryPath. Modifique o Dockerfile gerado para expose as portas, executar scripts de configuração e assim por diante, com base em suas necessidades.

  6. Em seguida você precisa compilar e enviar por push seu pacote de contêineres do Docker ao seu repositório.

  7. Modifique o ApplicationManifest.xml e ServiceManifest.xml a fim de adicionar a imagem de contêiner, informações do repositório, autenticação do registro e mapeamento de porta ao host. Para modificar os manifestos, confira Criar um aplicativo de contêiner do Azure Service Fabric. A definição de pacote de códigos no manifesto do serviço precisa ser substituída pela imagem de contêiner correspondente. Altere o Ponto de Entrada para um tipo de 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. Adicione o mapeamento de porta ao host para seu replicador e ponto de extremidade de serviço. Como essas duas portas são atribuídas em runtime pelo Service Fabric, o ContainerPort é definido como zero para usar a porta atribuída para mapeamento.

    <Policies>
    <ContainerHostPolicies CodePackageRef="Code">
     <PortBinding ContainerPort="0" EndpointRef="ServiceEndpoint"/>
     <PortBinding ContainerPort="0" EndpointRef="ReplicatorEndpoint"/>
    </ContainerHostPolicies>
    </Policies>
    
  9. Para configurar o modo de isolamento de contêiner, veja Configurar o modo de isolamento. O Windows dá suporte a dois modos de isolamento para contêineres: processo e Hyper-V. O snippet a seguir mostra como o modo de isolamento é especificado no arquivo de manifesto do aplicativo.

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

Observação

Um cluster do Service Fabric é um locatário único por design e os aplicativos hospedados são considerados confiáveis. Se você estiver pensando em hospedar aplicativos de contêiner não confiáveis, considere implantá-los como contêineres convidados e consulte Hospedar aplicativos não confiáveis em um cluster do Service Fabric.

  1. Para testar esse aplicativo, você precisa implantá-lo em um cluster que esteja executando a versão 5.7 ou superior. Para a versão 6.1 do runtime ou versões inferiores, você precisa editar e atualizar as configurações de cluster para habilitar essa versão prévia do recurso. Execute as etapas neste artigo para adicionar a configuração mostrada a seguir.

      {
        "name": "Hosting",
        "parameters": [
          {
            "name": "FabricContainerAppsEnabled",
            "value": "true"
          }
        ]
      }
    
  2. Depois, implante o pacote de aplicativos editado nesse cluster.

Agora você deve ter um aplicativo do Service Fabric em contêineres executando seu cluster.

Próximas etapas